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

标签 pdf itext watermark

我们公司使用 iText 在某些 pdf 表单上标记一些水印文本(不是图像)。我注意到 95% 的表格正确显示了水印,大约 5% 的表格没有。我测试了,复制了2个原始pdf文件,一个被标记为ok,另一个不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();
    }
}

最佳答案

我们通过更改 Adob​​e LifecycleSave 文件选项解决了问题。 File->Save->properties->Save as,然后看Save as type,默认是Acrobat 7.0.5 Dynamic PDF Form File,我们改为使用7.0.5 Static PDF Form File(其实静态的都行)。静态保存的文件没有这个水印消失的问题。感谢 Mark 指出了正确的方向。

关于pdf - 使用 iText 时某些 pdf 文件水印不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5278280/

相关文章:

php - 如何使用 PHP 和 GD 制作水印图像,如 envato photodune 预览图像?

ruby-on-rails - 如何给图片添加文字?

pdf - 如何在 JPanel 中使用 PDFBox 显示 pdf 文件?

java - 使用 Java iText API 将 SWT 图像导出为 PDF

java - IText PDF 5 - 计算页面底部剩余的面积

java - 如何以字符串 Base64 格式存储 PDF 内容

jquery自动搜索水印

php - 无法使用 for 循环使用 dompdf 渲染两个 pdf

android - 使用 Google Docs 在 WebView 中打开本地 PDF 文件

google-chrome - 在 Chrome 中禁用 "Fit to Page"