如何使用 iText7 防止 Pdf 文件中的交互字段展平

How to prevent flattening of interactive fields in Pdf file using iText7

我有带有交互字段的 PDF 文件。我可以毫无问题地手动更改这些字段。

我需要使用 iText7 库更改 Pdf 文件中的交互字段。我可以使用 iText7 更改交互字段,但是当我在操作后打开文件时,我会看到交互字段变平了,所以我不能再在手动模式下更改字段值。

我创建了简洁的示例,因为我只打开和关闭 pdf 文件。我有同样的结果:程序运行后,PDF 文件中的所有字段都被展平了。

这里是这个例子。

string pdfReadPath = @"D:\IT\PROJECTS\PMIC\TASKS\PDF\TEMP\Read_Pdf.pdf";
string pdfWritePath = @"D:\IT\PROJECTS\PMIC\TASKS\PDF\TEMP\Write_Pdf.pdf";

//Initialize pdf document
PdfReader pdfReader = new PdfReader(pdfReadPath);
PdfWriter pdfWriter = new PdfWriter(pdfWritePath);

PdfDocument pdfDoc = new PdfDocument(pdfReader, pdfWriter);

pdfDoc.Close();

我不希望交互字段变平。

如果我希望交互字段在程序运行后不会变平,有人知道我可以使用什么方法吗?

输出中的字段未展平。您可以通过在任何支持交互式表单的 PDF 查看器中打开 PDF 来检查这一点 除了 Adob​​e Acrobat Reader,例如 Foxit Reader.

相反,问题是您的 PDF 包含 混合 XFA/AcroForm 表单定义 使用权签名 ,并且您在你的代码中忽略这个。因此,您的代码使上述签名无效,使 Adob​​e Reader 以只读模式向您显示表单。

通过在附加模式下操作 PDF,您可以解决这个问题。

问题详细

您的 PDF 包含混合XFA/AcroForm 表单定义使用权签名

前者意味着您的 PDF 中的交互式表单被定义了两次,一次是在本机 PDF 方式 (AcroForm) 中,一次是作为一种特殊的 XML 搭载在您的 PDF (XFA) 中。 XFA 表格自 2017 年以来 deprecated/obsoleted。

只有少数 PDF 处理器支持 XFA 表单。 Adobe Acrobat 和 Adob​​e Acrobat Reader 可以。但 Adob​​e Acrobat Reader 仅在带有表单的 PDF 由 Adob​​e 产品生成并且此后仅完成表单填写时才支持此功能。

为了检查 Adob​​e 产品是否生成了 XFA 格式的 PDF,Adobe Acrobat Reader 在其中查找 使用权签名 ,这是一种特殊的签名用于标记由 Adob​​e PDF 生成器生成的 PDF 的签名,以向 Adob​​e Reader 发出其应扩展其功能的信号。

但它不仅寻找那个签名而且验证它。但是,当您的代码完全重新编写 PDF 时,输出 PDF 中的签名已损坏。在这种情况下,Adobe Acrobat Reader 不再允许编辑表格,而仅显示其只读表示,您错误地将其解释为 扁平化表格 .

以附加模式写入

为了不使 iText 7 的签名无效,您必须保持原始 PDF 字节不变,并且仅通过 附加 应用更改作为 增量更新.

您可以通过实例化 PdfDocument 和选择了 AppendModeStampingProperties 来实现,而不是

PdfDocument pdfDoc = new PdfDocument(pdfReader, pdfWriter);

使用

PdfDocument pdfDoc = new PdfDocument(pdfReader, pdfWriter, new StampingProperties().UseAppendMode());

但请注意:验证不仅会检查使用权限签名是否有效,还会检查以后的增量更新是否仅包含允许的更改。因此,请确保您只更改代码中的表单内容。

替代修复

由于您的 PDF 具有混合表单定义,而不是纯 XFA 表单定义,因此您可以选择同时删除 XFA 表单定义和使用权签名。此后您可以自由操作 PDF。这是在 中针对类似问题提出的,不同之处在于 PDF 被额外加密。