我们公司使用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();
    }
}

#1楼 票数:2 已采纳

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

#2楼 票数:1

你正在使用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操作问题......但是“弄清楚”部分可能很有趣

好狩猎。

  ask by Charles translate from so

未解决问题?本站智能推荐:

1回复

如何扩展PDF的页面大小以添加水印?

我的 Web 应用程序签署 PDF 文档。 我想让用户下载原始 PDF 文档(未签名),但在 pdf 文档的左边距中添加图像和签名者。 我在另一个 Web 应用程序中看到了这个想法,我也想这样做。 当然,我想使用 itext 库来做到这一点。 我附上了两张图片,原始 PDF 文档(未签名)和修改后的
1回复

尝试添加水印时,iText7文档没有页面

我有一个在 SSRS 中在 iText 之外呈现的 pdf。 该报告以单独的 PDF 形式出现,我使用 iText 来应用一些进一步的功能,例如将 pdf 合并为一个,添加密码加密等。 我正在尝试在 pdf 的每一页上添加水印,如下所示: 我从这个stackoverflow 答案中找到了水印代码,并
7回复

iText图像调整大小

我有一个水印,我想放在我的 pdf 中。 水印是 .bmp 图像,是 2290 x 3026。我在尝试调整这张图片以适应页面时遇到了很多麻烦,有人有什么建议吗?Document document = new Document(); PdfWriter.getInstance(document, ne
1回复

将水印添加到pdfjavaiText

我想将图像或文本水印添加到pdf文件中。 我在网上找到了一些示例,但是我的情况有些不同。 我有一个现有的pdf模板,该模板已经填充了动态数据,并已转换为byte []。 生成的字节随后导出为pdf。 我想将水印添加到生成的字节中。 就像是: 我只是似乎不知道如何使用iText做
1回复

xfa.fillXfaForm之后,透明图像显示为黑框。XFA填充是否支持透明图像?

这是当前的问题:我有一个由第三方创建的XFA表单,我想按原样使用它。 我能够通过以下方式生成具有填充字段的PDF: 我想做的就是在第二页上加盖多格式字段的图像/水印。 我要冲压的“ DRAFT” png图像具有透明背景,因此,如果覆盖层起作用,则图像背景应使底衬出现并看起来像图像文本位于
2回复

不知道如何使用iText(Java)在pdf文件中创建居中的“图像+文本”水印

我正在使用iText库,并且试图在页面底部添加水印。 水印很简单,它必须居中,左边有一个图像,右边有一个文本。 在这一点上,我有图像和png格式的文本。 我可以计算要放置图像的位置(居中),以计算页面尺寸和图像尺寸,但是现在我想包含文本AS文本(更好的可读性等)。 我可以将图像和文本
1回复

在iText中以不同的页面大小在pdf文件中插入水印时出现问题

当我尝试在绝对X = 10f且绝对y =矩形(.rectLeft()+(rectangle.getWidth()-image.getPlainWidth()); 对于某些页面尺寸,图像不能在absoluteX = 10f处添加,而必须将其增加到300f或更大。 如何正确获取左侧的绝对位置。
1回复

带水印文本的iText拼合问题

我正在使用iTextSharp将水印添加到PDF格式的现有文档中。 我阅读了这些内容,创建了一个PdfTemplate对象,将水印文本,颜色,透明度等添加到此PdfTemplate,然后将该模板添加到使用PdfWriter.DirectContent获得的PdfContentByte中。