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

C# 如何使用iText7防止Pdf文件中的交互字段变平,c#,pdf,itext7,C#,Pdf,Itext7,我有一个带有交互字段的PDF文件。我可以手动更改这些字段,没有任何问题 我需要使用iText7库更改Pdf文件中的交互字段。我可以使用iText7更改交互字段,但当我在操作后打开文件时,我可以看到交互字段被展平,所以我不能再在手动模式下更改字段值 我创建了一个简明的示例,因为我只打开和关闭pdf文件。我得到了同样的结果:在程序运行之后,PDF文件中的所有字段都被压平了 这里是这个例子 string pdfReadPath = @"D:\IT\PROJECTS\PMIC\TASKS\PD

我有一个带有交互字段的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查看器(Adobe Acrobat Reader除外,例如Foxit Reader)中打开PDF来检查这一点

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

通过在附加模式下操作PDF,可以解决此问题

问题的细节 您的PDF包含混合XFA/AcroForm表单定义和使用权限签名

前者意味着PDF中的交互式表单定义了两次,一次是以本机PDF方式(AcroForm)定义的,另一次是作为PDF(XFA)中的特殊XML。自2017年以来,XFA表单已被弃用/淘汰

只有少数PDF处理器支持XFA表单。AdobeAcrobat和AdobeAcrobatReader都可以。但Adobe Acrobat Reader仅在包含表单的PDF由Adobe产品生成且此后仅完成表单填写时才支持此功能

为了检查带有XFA表单的PDF是否由Adobe产品生成,Adobe Acrobat Reader会在其中查找使用权签名,这是一种特殊的签名,用于标记Adobe PDF生成器生成的PDF,以向Adobe Reader发出信号,表示它应扩展其功能

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

以追加模式写入 为了不使iText 7的签名无效,您必须保持原始PDF字节的原样,并且仅通过将其作为增量更新附加来应用更改

您可以通过使用选择了
AppendMode
StampingProperties
实例化
PdfDocument
,而不是

PdfDocument pdfDoc = new PdfDocument(pdfReader, pdfWriter);
使用

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

另一种解决办法
由于PDF具有混合表单定义,而不是纯XFA表单定义,因此也可以同时删除XFA表单定义和使用权签名。此后,您可以自由操作PDF。这是在一个类似的问题中提出的,不同之处在于PDF是另外加密的。

“我可以看到交互字段被展平了”-iText不会展平字段,除非它被告知这样做。因此,您执行的代码与共享的代码不同,或者您对问题的描述不准确。您可能希望共享输入和输出PDF以进行分析。我执行的代码与共享的代码完全相同。[输入和输出PDF]()。奇怪的交易。在浏览器中打开输出文件时,我可以看到交互式字段,但如果使用Acrobat Reader打开文件,则无法更改字段值。你知道为什么我不能使用Acrobat Reader更改输出文件的字段值吗?非常感谢!它起作用了。你的回答对我帮助很大。
PdfDocument pdfDoc = new PdfDocument(pdfReader, pdfWriter, new StampingProperties().UseAppendMode());