itext API 无法从 Adobe 生命周期工具生成的动态 pdf 中获取字段
itext API Not able to get the fields from Adobe lifecycle tool generated Dynamic 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 时一直可以看到空白字段,但是当我使用 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)