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

iText 7 .NET makes my fields readonly automatically

我对 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。 Link到本次测试用到的pdf文档https://www.uscis.gov/system/files_force/files/form/i-765.pdf?download=1

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

  1. 其中的表单定义是混合 XFA / AcroForm 定义对。
  2. 文件已使用 XFA 表单保存所需的使用权限 (UR3) 签名。
  3. 文件已加密。

通常可以通过创建增量更新,即通过使用 new StampingProperties().useAppendMode() 在追加模式下工作,在不加密的情况下填写此类表格(第 3 项)。这使使用权签名有效并且一切正常。

不幸的是,此加密文件 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 测试 Java 版本 7.0.3-SNAPSHOT)