繁体   English   中英

某些pdf文件水印不会显示使用iText

Some pdf file watermark does not show using iText

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我们公司使用iText在一些pdf表格上标记一些水印文本(不是图像)。 我注意到95%的表格正确显示水印,约5%没有。 我测试了,复制了2个原始pdf文件,一个标记为ok,另一个没有问题,然后通过一个小程序测试,结果相同:一个得到标记,另一个没有。 然后我尝试了最新版本的iText jar文件(版本5.0.6),同样的事情。 我检查了pdf文件属性,安全设置等,似乎没有显示任何提示。 结果文件确实改变了大小,并在执行程序后标记为“由iText版本改变....”。

这是样本水印代码(使用itext jar版本2.1.7),注意传入的topText,mainText,bottonText参数,使3行水印在pdf中显示为水印。

任何帮助赞赏!!

public class WatermarkGenerator {

    private static int TEXT_TILT_ANGLE = 25;
    private static Color MEDIUM_GRAY = new Color(160, 160, 160);
    private static int SUPPORT_FONT_SIZE = 42;
    private static int PRIMARY_FONT_SIZE = 54;

    public static void addWaterMark(InputStream pdfInputStream,
        OutputStream outputStream, String topText, 
        String mainText, String bottomText) throws Exception {
        PdfReader reader = new PdfReader(pdfInputStream);
        int numPages = reader.getNumberOfPages();

        // Create a stamper that will copy the document to the output
        // stream.
        PdfStamper stamp = new PdfStamper(reader, outputStream);
        int page=1;

        BaseFont baseFont = 
            BaseFont.createFont(BaseFont.HELVETICA_BOLDOBLIQUE,
                BaseFont.WINANSI, BaseFont.EMBEDDED);

        float width;
        float height;

        while (page <= numPages) {
            PdfContentByte cb = stamp.getOverContent(page);
            height = reader.getPageSizeWithRotation(page).getHeight() / 2;
            width = reader.getPageSizeWithRotation(page).getWidth() / 2;

            cb = stamp.getUnderContent(page);
            cb.saveState();
            cb.setColorFill(MEDIUM_GRAY);

            // Top Text
            cb.beginText();
            cb.setFontAndSize(baseFont, SUPPORT_FONT_SIZE);
            cb.showTextAligned(Element.ALIGN_CENTER, topText, width,
                    height+PRIMARY_FONT_SIZE+16, TEXT_TILT_ANGLE);
            cb.endText();

            // Primary Text
            cb.beginText();
            cb.setFontAndSize(baseFont, PRIMARY_FONT_SIZE);
            cb.showTextAligned(Element.ALIGN_CENTER, mainText, width,
                    height, TEXT_TILT_ANGLE);
            cb.endText();

            // Bottom Text
            cb.beginText();
            cb.setFontAndSize(baseFont, SUPPORT_FONT_SIZE);
            cb.showTextAligned(Element.ALIGN_CENTER, bottomText, width,
                    height-PRIMARY_FONT_SIZE-6, TEXT_TILT_ANGLE);
            cb.endText();
            cb.restoreState();

            page++;
        }

        stamp.close();
    }
}
2 个回复

我们通过更改Adobe LifecycleSave文件选项解决了问题。 文件 - >保存 - >属性 - >另存为,然后查看另存为类型,默认为Acrobat 7.0.5动态PDF表单文件,我们更改为使用7.0.5静态PDF表单文件(实际上任何静态的都可以工作)。 保存在静态文件中的文件没有此水印消失问题。 感谢Mark指出了正确的方向。

你正在使用underContent而不是overContent。 不要那样做。 它让你受到大白色矩形的摆布,一些人坚持要先画一些东西。 这是一个不太好的PostScript解释器,并且多年来一直没有必要。


好的,看过你的PDF后,我发现问题在于这是一个基于XFA的表格(来自LiveCycle Designer)。 Acrobat可以(并且经常)根据它包含的XFA(一种xml)重建整个文件。 这就是你的改变丢失的方式。 当Acrobat从XFA重建PDF时,所有现有的PDF信息都会被调整,包括您的水印。

实现此功能的唯一方法是将水印定义为PDF中包含的XFA文件的一部分。

检测这些形式并不是那么难:

PdfReader reader = new PdfReader(...);
AcroFields acFields = reader.getAcroFields();
XfaForm xfaForm = acFields.getXfaForm();
if (xfaForm != null && xfaForm.isXfaPresent()) {
  // Ohs nose.
  throw new ItsATrapException("We can't repel XML of that magnitude!");
}

另一方面,修改它们可能是相当具有挑战性的,但这是规格

一旦你弄清楚需要改变什么,这是一个简单的XML操作问题......但是“弄清楚”部分可能很有趣

好狩猎。

1 使用iText Java创建的带有水印图像的PDF文件

将pdf文件发送到打印机时,会出现类似“此页面上存在错误。Acrobat可能无法正确显示该页面。请与创建PDF文档的人联系以解决问题”的错误。 我正在创建一个PDF文件,并使用文本Java将水印图像添​​加到其中。 如果从PDF文件中删除水印图像,则可以正常工作。 不知道水印图 ...

2 在Java中使用iText在PDF文件上不可移动的水印

我们有一个需要在杂志上添加文本水印的要求,该杂志的每页上都有多个丰富的图像。 我尝试使用com.itextpdf.jar version 5.0.6添加水印,但最终我能够使用Adobe Acrobat Pro 删除它。 我也尝试了以下选项,但那也没有用。 是否可以使用iText添 ...

4 iText 7 水印画布在某些特殊的 3d pdf 中未正确显示

我一直在使用 iText7 最新的 .net 包在 pdf 文档上创建水印注释。 我看到大多数 noraml pdf 文件的水印都在所需的位置正确标记,但是对于某些特殊的 3d(维)pdf 文件,水印奇怪地没有正确显示,我相信水印的某些部分正在被另一个部分切割3d 图层。 这是所经历的失真的屏幕截图 ...

7 使用Spring,IText,水印创建pdf

我有一个使用Java,Spring和IText创建PDF文件的应用程序。 我想给pdf添加水印。 我发现了很多将水印添加到已经保存的PDF中的示例。 我想在保存PDF之前添加水印。 我找到了一个使用ITextSharp进行操作的示例,但是它适用于.NET。 我在创建pdf文 ...

8 使用iText7 C#将水印添加到PDF

我将iText 7用于C#,或者实际上是从iTextSharp 5迁移到IPdfPageEvent 。在iTextSharp中,我使用IPdfPageEvent (更具体地说是PdfPageEventHelper帮助器类)向PDF添加水印: 现在,我正在寻找与之等效的iText 7。 ...

9 如何使用iText API提取PDF水印内容

我正在浏览itext api文档,并能够创建带有水印图像或文本的pdf,但是找不到从pdf中获取/提取水印内容的方法。 所以我有一个包含水印文本/图像的pdf文档,我想提取该文本或img并验证我无法执行的操作。 如何使用iText API提取水印内容? 还是有其他方法可以验证水印内 ...

10 使用itext7将图像作为透明水印添加到pdf

我想使用itext7作为透明水印将图像添加到pdf中。 我正在使用pdfcanvas和PdfExtGState。 但图片显示在页面文字的顶部。 虽然文本没有丢失,但是变得越来越模糊。 我想解决这个问题。 预期的结果是将图像推送到背景,并且文本应显示在其顶部。 请帮忙。 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM