我正在使用 iText 将文本添加到现有的 pdf 文件中。它适用于简单的 pdf,但与 AcroForms 的 pdf 有问题。
我的代码:
PdfReader reader = new PdfReader("/Users/simple-user/Downloads/acroform.pdf");
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
"/Users/simple-user/Downloads/acroform2.pdf"));
BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252,
BaseFont.NOT_EMBEDDED);
PdfContentByte over = stamper.getOverContent(1);
over.beginText();
over.setFontAndSize(bf, 10);
over.setTextMatrix(107, 107);
over.showText("page updated");
over.endText();
stamper.close();
错误消息:“此文档在 Adobe Acrobat Reader DC 中启用了扩展功能。文档自创建以来已更改,并且不再使用扩展功能。请联系作者以获取本文档的原始版本。”
并且没有我想要添加到文件的文本
我缺少什么想法?
1 回答
你的诊断错了。问题与 AcroForms 的存在无关。问题与您的文档是否为Reader Enabled有关。 Reader-enabling 只能使用 Adobe 软件完成。这是一个需要使用 Adobe 私钥进行数字签名的过程。如果存在有效签名,则在 Adobe Reader 中解锁特定功能(在签名时的使用权限中定义)。
请查看此问题的答案,了解如何检测 PDF 是否为 Reader-enabled:如何使用 C#检查 PDF 是否启用了 Reader?
您更改此类 PDF 的内容,因此您打破了签名。打破这个签名是导致丑陋的错误消息的原因:
有两种方法可以避免此错误消息:
删除使用权限。这将导致表单不再启用 Reader。例如:如果文档的创建者允许填写的表单可以在本地保存,则在删除使用权限后将无法再进行此操作。
在追加模式下填写表格。这将导致更大的文件大小,但将保留 Reader 启用。
删除使用权限的方式如下:
在追加模式下使用 iText 是这样的:
注意
PdfStamper
中的额外参数。