gpt4 book ai didi

java - Apache PDFBox - 无法读取 PDF 中的所有字段

转载 作者:行者123 更新时间:2023-12-02 01:59:40 24 4
gpt4 key购买 nike

我们正在尝试读取 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 本身,那么无法读取某些字段的原因可能是什么?

最佳答案

您可能在该表单上有分层字段。尝试类似下面的代码...

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() 获取所有字段,但您需要在设置值之前测试它们是否为终端。非终结符字段不能有值,也没有与其关联的小部件(页面上的表示)。如果完全限定名称中包含句点,您就会知道这是问题所在。句点代表层次结构。

关于java - Apache PDFBox - 无法读取 PDF 中的所有字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51776850/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com