itext API无法从Adobe生命周期工具生成的动态pdf中获取字段
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了itext API无法从Adobe生命周期工具生成的动态pdf中获取字段相关的知识,希望对你有一定的参考价值。
我可以使用iText一直看到空字段,但是当我使用Adobe Acrobat Reader DC手动打开时,我可以看到它们
com.lowagie.text.pdf.PdfReader reader = new com.lowagie.text.pdf.PdfReader(
new PRInputStream(dataFile));
com.lowagie.text.pdf.AcroFields af = reader.getAcroFields();
System.out.println("Field Names:" + af.getFields());
与使用相同软件生成的静态PDF工作正常。
Expected records : 1
Actual : 0
请查找示例PDF文件https://forums.adobe.com/servlet/JiveServlet/download/2051245-11361/ExpandingTextBox.pdf
使用下面的代码片段
com.lowagie.text.pdf.AcroFields af = reader.getAcroFields();
System.out.println("Field Names:"+af.getXfa().getTemplateSom().getName2Node().toString());
我可以看到Field Names:{form1[0].#subform[0].TextFieldContainer[0].TextField1[0]=[field: null]}
但不是实际的字段名称。
答案
以下代码能够从表单中提取字段名称。
String fieldName = form.getXfa().getDatasetsNode().getFirstChild().getFirstChild().getFirstChild().getLocalName();
String str = form.getXfa().getDatasetsNode().getFirstChild().getFirstChild().getFirstChild().getTextContent();
String SiblingName = form.getXfa().getDatasetsNode().getFirstChild().getFirstChild().getFirstChild().getNextSibling().getLocalName();
String SiblingValue = form.getXfa().getDatasetsNode().getFirstChild().getFirstChild().getFirstChild().getNextSibling().getTextContent();
System.out.println("Field Name:"+fieldName);
System.out.println("Field Value:"+str);
System.out.println("Sibling Name:"+SiblingName);
System.out.println("Sibling Value:"+SiblingValue);
//Set the values back to form
form.getXfa().getDatasetsNode().getFirstChild().getFirstChild().getFirstChild().setTextContent("Updated: Content for First Field");
String updatedValue = form.getXfa().getDatasetsNode().getFirstChild().getFirstChild().getFirstChild().getTextContent();
System.out.println("Field Value:"+updatedValue);
我们可以看到正确的字段和值,我可以将值设置回表单,但不会尝试生成表单,但这样可行。
这个用例适用于所有版本的itext(也适用于2.1.7)
以上是关于itext API无法从Adobe生命周期工具生成的动态pdf中获取字段的主要内容,如果未能解决你的问题,请参考以下文章