微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 iText7 防止 Pdf 文件中的交互式字段展平 问题详细以追加模式写入替代修复

如何解决如何使用 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 来检查这一点除了 Adob​​e Acrobat Reader,例如 Foxit Reader。

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

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

问题详细

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

前者意味着您的 PDF 中的交互式表单被定义了两次,一次以原生 PDF 方式 (AcroForm) 和一次作为特殊的 XML 骑在您的 PDF (XFA) 中。自 2017 年起,XFA 表单已被弃用/废弃。

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

为了检查带有 XFA 表单的 PDF 是否由 Adob​​e 产品生成,Adobe Acrobat Reader 会在其中查找使用权签名,这是一种特殊的签名,用于标记 Adob​​e PDF 生成的 PDF生成器通知 Adob​​e 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 举报,一经查实,本站将立刻删除。