[英]Unable to read form (acroform) from PDF using pdfbox and iText
[英]Pdf with Acroform editing using iText
我正在使用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中的扩展功能。自创建以来,该文档已更改,不再使用扩展功能。请与作者联系以获取本文档的原始版本。”
而且没有我要添加到文件的文本
有什么想法我想念的吗?
您的诊断是错误的。 该问题与AcroForms的存在无关。 问题与您的文档是否启用了Reader Enabled有关 。 启用读者功能只能使用Adobe软件完成。 此过程需要使用Adobe的私钥进行数字签名。 如果存在有效的签名,则会在Adobe Reader中解锁特定功能(在签名时使用权中定义)。
请查看该问题的答案,以了解如何检测PDF是否启用了Reader功能: 如何检查PDF是否启用了Reader功能,而不是使用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
的额外参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.