如何使用 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 来检查这一点 除了 Adobe Acrobat Reader,例如 Foxit Reader.
相反,问题是您的 PDF 包含 混合 XFA/AcroForm 表单定义 和 使用权签名 ,并且您在你的代码中忽略这个。因此,您的代码使上述签名无效,使 Adobe Reader 以只读模式向您显示表单。
通过在附加模式下操作 PDF,您可以解决这个问题。
问题详细
您的 PDF 包含混合XFA/AcroForm 表单定义 和使用权签名。
前者意味着您的 PDF 中的交互式表单被定义了两次,一次是在本机 PDF 方式 (AcroForm) 中,一次是作为一种特殊的 XML 搭载在您的 PDF (XFA) 中。 XFA 表格自 2017 年以来 deprecated/obsoleted。
只有少数 PDF 处理器支持 XFA 表单。 Adobe Acrobat 和 Adobe Acrobat Reader 可以。但 Adobe Acrobat Reader 仅在带有表单的 PDF 由 Adobe 产品生成并且此后仅完成表单填写时才支持此功能。
为了检查 Adobe 产品是否生成了 XFA 格式的 PDF,Adobe Acrobat Reader 在其中查找 使用权签名 ,这是一种特殊的签名用于标记由 Adobe PDF 生成器生成的 PDF 的签名,以向 Adobe Reader 发出其应扩展其功能的信号。
但它不仅寻找那个签名而且验证它。但是,当您的代码完全重新编写 PDF 时,输出 PDF 中的签名已损坏。在这种情况下,Adobe Acrobat Reader 不再允许编辑表格,而仅显示其只读表示,您错误地将其解释为 扁平化表格 .
以附加模式写入
为了不使 iText 7 的签名无效,您必须保持原始 PDF 字节不变,并且仅通过 附加 应用更改作为 增量更新.
您可以通过实例化 PdfDocument
和选择了 AppendMode
的 StampingProperties
来实现,而不是
PdfDocument pdfDoc = new PdfDocument(pdfReader, pdfWriter);
使用
PdfDocument pdfDoc = new PdfDocument(pdfReader, pdfWriter, new StampingProperties().UseAppendMode());
但请注意:验证不仅会检查使用权限签名是否有效,还会检查以后的增量更新是否仅包含允许的更改。因此,请确保您只更改代码中的表单内容。
替代修复
由于您的 PDF 具有混合表单定义,而不是纯 XFA 表单定义,因此您可以选择同时删除 XFA 表单定义和使用权签名。此后您可以自由操作 PDF。这是在 中针对类似问题提出的,不同之处在于 PDF 被额外加密。
我有带有交互字段的 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 来检查这一点 除了 Adobe Acrobat Reader,例如 Foxit Reader.
相反,问题是您的 PDF 包含 混合 XFA/AcroForm 表单定义 和 使用权签名 ,并且您在你的代码中忽略这个。因此,您的代码使上述签名无效,使 Adobe Reader 以只读模式向您显示表单。
通过在附加模式下操作 PDF,您可以解决这个问题。
问题详细
您的 PDF 包含混合XFA/AcroForm 表单定义 和使用权签名。
前者意味着您的 PDF 中的交互式表单被定义了两次,一次是在本机 PDF 方式 (AcroForm) 中,一次是作为一种特殊的 XML 搭载在您的 PDF (XFA) 中。 XFA 表格自 2017 年以来 deprecated/obsoleted。
只有少数 PDF 处理器支持 XFA 表单。 Adobe Acrobat 和 Adobe Acrobat Reader 可以。但 Adobe Acrobat Reader 仅在带有表单的 PDF 由 Adobe 产品生成并且此后仅完成表单填写时才支持此功能。
为了检查 Adobe 产品是否生成了 XFA 格式的 PDF,Adobe Acrobat Reader 在其中查找 使用权签名 ,这是一种特殊的签名用于标记由 Adobe PDF 生成器生成的 PDF 的签名,以向 Adobe Reader 发出其应扩展其功能的信号。
但它不仅寻找那个签名而且验证它。但是,当您的代码完全重新编写 PDF 时,输出 PDF 中的签名已损坏。在这种情况下,Adobe Acrobat Reader 不再允许编辑表格,而仅显示其只读表示,您错误地将其解释为 扁平化表格 .
以附加模式写入
为了不使 iText 7 的签名无效,您必须保持原始 PDF 字节不变,并且仅通过 附加 应用更改作为 增量更新.
您可以通过实例化 PdfDocument
和选择了 AppendMode
的 StampingProperties
来实现,而不是
PdfDocument pdfDoc = new PdfDocument(pdfReader, pdfWriter);
使用
PdfDocument pdfDoc = new PdfDocument(pdfReader, pdfWriter, new StampingProperties().UseAppendMode());
但请注意:验证不仅会检查使用权限签名是否有效,还会检查以后的增量更新是否仅包含允许的更改。因此,请确保您只更改代码中的表单内容。
替代修复
由于您的 PDF 具有混合表单定义,而不是纯 XFA 表单定义,因此您可以选择同时删除 XFA 表单定义和使用权签名。此后您可以自由操作 PDF。这是在