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 具有三个属性,使填写更加困难:
- 其中的表单定义是混合 XFA / AcroForm 定义对。
- 文件已使用 XFA 表单保存所需的使用权限 (UR3) 签名。
- 文件已加密。
通常可以通过创建增量更新,即通过使用 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)
我对 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 具有三个属性,使填写更加困难:
- 其中的表单定义是混合 XFA / AcroForm 定义对。
- 文件已使用 XFA 表单保存所需的使用权限 (UR3) 签名。
- 文件已加密。
通常可以通过创建增量更新,即通过使用 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)