我是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
答案 0 :(得分:2)
有问题的PDF有三个属性,使填写更加困难:
通常可以通过创建增量更新来填写此类表格而不加密(第3项),即通过使用new StampingProperties().useAppendMode()
在附加模式下工作。这使得使用权签名有效,一切正常。
不幸的是,对于此加密文件new StampingProperties().useAppendMode()
甚至new StampingProperties().preserveEncryption().useAppendMode()
会导致文件损坏。这可能与使用newReader.SetUnethicalReading(true)
而不是提供所有者密码的事实有关;但在填写政府表格时几乎无法提供所有者密码......; *)
无论如何,继续使用此表单的方法是
结果是一张带有纯AcroForm表单的PDF,您可以根据需要处理。
您的代码已隐式删除加密。要执行其他两个步骤,只需添加
即可form.RemoveXfaForm();
pdf.GetCatalog().Remove(PdfName.Perms);
在pdf.Close()
。
(使用iText测试.Net版本7.0.2.2和iText for Java版本7.0.3-SNAPSHOT)