我们正在尝试读取PDF并动态填充其中的值。根据传入的请求,我们运行一些规则并导出要使用的PDF,然后动态为其填充值。我们正在使用Apache PDFBox版本2.0.11,由于某种原因,我们遇到了特定PDF模板的问题。我们无法读取此特定模板的某些字段,并且生成的PDF不完整。想知道是否与原始PDF本身有关。这是我们用来读取字段并填充它的代码段。
PDDocument pdfTemplate = PDDocument.load(inputStream);
PDDocumentCatalog docCatalog = pdfTemplate.getDocumentCatalog();
PDAcroForm acroForm = docCatalog.getAcroForm();
acroForm.setXFA(null);
COSArrayList<PDField> list = (COSArrayList<PDField>) acroForm.getFields();
for (PDField field : list) {
field.setReadOnly(true);
logger.debug("Field name "+field.getFullyQualifiedName())))
//use logic to populate value by calling field.setValue();
}
当我们尝试打印每个字段名称时,我们发现丢失了30%以上的字段。有人可以帮忙解决此问题吗? PDF分15页,有不同的问题。如果问题出在原始PDF本身,那么可能是为什么无法阅读某些字段的原因呢?
答案 0 :(得分:1)
您可能在该表单上具有层次结构字段。尝试类似下面的代码...
PDDocument pdfTemplate = PDDocument.load(inputStream);
PDDocumentCatalog docCatalog = pdfTemplate.getDocumentCatalog();
PDAcroForm acroForm = docCatalog.getAcroForm();
PDFieldTree fieldTree = acroForm.getFieldTree();
Iterator<PDField> fieldTreeIterator = fieldTree.iterator();
while (fieldTreeIterator.hasNext()) {
PDField field = fieldTreeIterator.next();
if (field instanceof PDTerminalField) {
String fullyQualifiedName = field.getFullyQualifiedName();
logger.debug("Field name "+fullyQualifiedName);
}
}
PDAcroForm.getFields()仅获取根字段,而不获取其子字段。 PDAcroForm.getFieldTree()获取所有字段,但是在设置值之前,您需要测试它们是否为终端。非终端字段不能有值,也没有与之关联的小部件(页面上的表示形式)。如果完全限定名称中包含句点,您就会知道这是问题所在。句点代表层次结构。
答案 1 :(得分:0)
再次重建整个PDF后,问题得以解决。