使用iText进行Acroform编辑的Pdf

我正在使用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中启用了扩展function。文档自创建以来已更改,并且不再使用扩展function。请联系作者以获取本文档的原始版本。”

并且没有我想要添加到文件的文本

我缺少什么想法?

你的诊断错了。 问题与AcroForms的存在无关。 问题与您的文档是否为Reader Enabled有关 。 只能使用Adobe软件完成阅读器启用。 这是一个需要使用Adobe私钥进行数字签名的过程。 当存在有效签名时,将在Adobe Reader中解锁特定function(在签名时的使用权限中定义)。

请查看此问题的答案,了解如何检测PDF是否启用了Reader: 如何使用C#检查PDF是否启用了Reader?

您更改此类PDF的内容,因此您打破了签名。 打破此签名是导致丑陋的错误消息的原因:

本文档在Adobe Acrobat Reader DC中启用了扩展function。 该文档自创建以来已更改,并且不再使用扩展function。 请联系作者以获取本文档的原始版本。

有两种方法可以避免此错误消息:

  1. 删除使用权限。 这将导致表单不再启用Reader。 例如:如果文档的创建者允许填写的表单可以在本地保存,则在删除使用权限后将无法再进行此操作。
  2. 在追加模式下填写表格。 这将导致更大的文件大小,但将保留Reader启用。

删除使用权限的方式如下:

 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的额外参数。