iText 7 .NET使我的字段自动读取

时间:2017-05-21 14:21:16

标签: .net pdf itext7

我是iText的新手。 我下载了30天的免费试用版,并在.NET MVC上尝试了以下内容: 1.从PDF表单中提取字段:

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。链接到此测试中使用的pdf文档https://www.uscis.gov/system/files_force/files/form/i-765.pdf?download=1

1 个答案:

答案 0 :(得分:2)

有问题的PDF有三个属性,使填写更加困难:

  1. 其中的表单定义是混合XFA / AcroForm定义对。
  2. 使用XFA表单所需的使用权限( UR3 )签名来保存文件。
  3. 文件已加密。
  4. 通常可以通过创建增量更新来填写此类表格而不加密(第3项),即通过使用new StampingProperties().useAppendMode()在附加模式下工作。这使得使用权签名有效,一切正常。

    不幸的是,对于此加密文件new StampingProperties().useAppendMode()甚至new StampingProperties().preserveEncryption().useAppendMode()会导致文件损坏。这可能与使用newReader.SetUnethicalReading(true)而不是提供所有者密码的事实有关;但在填写政府表格时几乎无法提供所有者密码......; *)

    无论如何,继续使用此表单的方法是

    • 删除加密,
    • 删除使用权签名(已通过删除加密而破坏)和
    • 删除XFA表单定义(删除使用权签名后不再正常工作)。

    结果是一张带有纯AcroForm表单的PDF,您可以根据需要处理。

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

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

    pdf.Close()

    之前

    (使用iText测试.Net版本7.0.2.2和iText for Java版本7.0.3-SNAPSHOT)