如何解决如何使用 iText7 防止 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) 中。自 2017 年起,XFA 表单已被弃用/废弃。
只有少数 PDF 处理器支持 XFA 表单。 Adobe Acrobat 和 Adobe Acrobat Reader 可以。但是,Adobe Acrobat Reader 仅在带有表单的 PDF 已由 Adobe 产品生成并且此后仅完成表单填写时才支持此功能。
为了检查带有 XFA 表单的 PDF 是否由 Adobe 产品生成,Adobe Acrobat Reader 会在其中查找使用权签名,这是一种特殊的签名,用于标记 Adobe PDF 生成的 PDF生成器通知 Adobe Reader 它将扩展其功能。
但它不仅寻找那个签名,而且验证它。但是,当您的代码完全重新编写 PDF 时,输出 PDF 中的签名已损坏。在这种情况下,Adobe Acrobat Reader 不再允许编辑表单,而仅显示其只读表示,您错误地将其解释为扁平表单。
以追加模式写入
为了不使 iText 7 的签名无效,您必须保持原始 PDF 字节原样,并且仅通过将更改附加作为增量更新来应用更改。 >
您可以通过使用 PdfDocument
实例化 StampingProperties
来实现此目的,该 AppendMode
已选择,而不是
PdfDocument pdfDoc = new PdfDocument(pdfReader,pdfWriter);
使用
PdfDocument pdfDoc = new PdfDocument(pdfReader,pdfWriter,new StampingProperties().UseAppendMode());
但请注意:验证不仅会检查使用权限签名是否有效,还会检查以后的增量更新是否仅包含允许的更改。因此,请确保您只更改代码中的表单内容。
替代修复
由于您的 PDF 具有混合表单定义,而不是纯 XFA 表单定义,因此您可以选择同时删除 XFA 表单定义和使用权限签名。此后,您可以自由操作 PDF。这是在 this answer 中针对类似问题提出的,不同之处在于 PDF 额外加密。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。