2017-05-21 24 views
1

我对iText相当新。 我下载了一个免费试用30天,并试图在.NET MVC如下:从PDF表单 1.解字段:iText 7 .NET使我的领域自动只读

string src = "mypdf.pdf"; 
string dest = "mypdfRES.pdf"; 
PdfReader newReader = new PdfReader(src); 
newReader.SetUnethicalReading(true); 
PdfDocument pdf = new PdfDocument(newReader, new PdfWriter(dest)); 
PdfAcroForm form = PdfAcroForm.GetAcroForm(pdf, true); 
IDictionary<String, PdfFormField> fields = form.GetFormFields(); 

之后,我的值设置为特定领域

PdfFormField toSet; 
fields.TryGetValue("form1[0].#subform[0].Line1_FamilyName[0]", out toSet); 
toSet.SetValue("Test familyname"); 
pdf.Close(); 

现在,当我打开新保存的PDF文档mypdfRES.pdf时,所有字段都是空白的。

请提出为什么iText会自动将我的所有表单字段设置为只读。

PS。链接到在该试验中https://www.uscis.gov/system/files_force/files/form/i-765.pdf?download=1

+0

请分享可用于重现该问题的PDF文件。 –

+1

@AlexeySubach这里是链接https://www.uscis.gov/system/files_force/files/form/i-765.pdf?下载= 1 – Fmbishop

+0

** A **您的表单是一个混合XFA表单。这种形式可能需要特殊处理。 ** B **您的文件包含使用权签名。为了不使其无效,您必须使用增量更新进行编辑。 – mkl

回答

2

在考虑中的PDF所使用的pdf文件具有三个特性,这使得在填充更加困难:

  1. 在它的形式定义是混合XFA/AcroForm定义对。
  2. 使用XFA表单要求保存的使用权利(UR3)签名对文件进行签名。
  3. 该文件已加密。

通常可以通过创建增量更新(即通过使用new StampingProperties().useAppendMode()以附加模式工作)来填充没有加密的此类表单(项目3)。这使得使用权签名保持有效并且一切正常。

不幸的是,这个加密文件new StampingProperties().useAppendMode()甚至new StampingProperties().preserveEncryption().useAppendMode()导致破损的文件。这可能与使用newReader.SetUnethicalReading(true)而不是提供所有者密码有关;但提供的所有者密码几乎可以同时在政府的形式...填充预期; *)

这种形式进行反正的方法是

  • 删除加密,
  • 删除使用权限签名(已通过删除加密已被打破),并删除XFA表单定义(在删除使用权限签名后不再正常工作)。

结果是PDF格式的纯AcroForm表单,您可以根据需要处理。

您的代码已隐式删除加密。要做其他两个步骤,只需添加

form.RemoveXfaForm(); 
pdf.GetCatalog().Remove(PdfName.Perms); 

之前的pdf.Close()

(与iText的测试时间.NET版本7.0.2.2和iText的用于Java版本7.0.3-SNAPSHOT)

+0

感谢您的解释!这解决了这个问题 – Fmbishop