我正在使用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中的扩展功能。该文档自创建以来已更改,并且不再使用扩展功能。请联系作者以获取本文档的原始版本。"
并且没有我想要添加到文件的文本
我缺少什么想法?
答案 0 :(得分:1)
您的诊断错误。 问题与AcroForms的存在无关。 问题与您的文档是否启用阅读器有关。只能使用Adobe软件完成阅读器启用。这是一个需要使用Adobe私钥进行数字签名的过程。当存在有效签名时,将在Adobe Reader中解锁特定功能(在签名时的使用权限中定义)。
请查看此问题的答案,了解如何检测PDF是否启用了阅读器:How to Check PDF is Reader enabled or not using C#?
您更改了此类PDF的内容,因此您违反了签名。打破这个签名是导致丑陋的错误消息的原因:
此文档启用了Adobe Acrobat Reader DC中的扩展功能。该文档自创建以来已更改,并且不再使用扩展功能。请联系作者以获取本文档的原始版本。
有两种方法可以避免此错误消息:
删除使用权限的方法如下:
PdfReader reader = new PdfReader(path_to_file);
if (reader.hasUsageRights()) {
reader.removeUsageRights();
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(path_to_new_file));
stamper.close();
}
reader.close();
在附加模式中使用iText是这样的:
PdfReader reader = new PdfReader(src);
PdfStamper stamper =
new PdfStamper(reader, new FileOutputStream(dest), '\0', true);
stamper.close();
reader.close();
请注意PdfStamper
中的额外参数。