当前位置: 首页 > 知识库问答 >
问题:

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

阙博容
2023-03-14

我们正在尝试读取PDF并动态填充其中的值。根据传入的请求,我们运行一些规则,导出要使用的PDF,然后动态地向其填充值。我们使用的是ApachePDFBox版本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本身,那么无法读取某些字段的原因可能是什么?

共有2个答案

皇甫雨石
2023-03-14

重新构建整个PDF后问题得到解决。

孔山
2023-03-14

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

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

 类似资料:
  • 我正在尝试从PDF中提取文本(https://www.sec.gov/litigation/admin/2015/34-76574.pdf)使用PyPDF2,我得到的唯一结果是以下字符串: 这是我的代码: 这段代码在我正在使用的一些PDF上正常工作(例如。https://www.sec.gov/litigation/admin/2016/34-76837-proposed-amended-dist

  • 我正在尝试使用JAVA填写PDF表单,但当我尝试使用下面的代码获取字段时,列表为空。 然后我尝试使用PDFStripper读取文件 输出如下 “请稍候。。。 如果此消息最终未被文档的正确内容替换,则PDF查看器可能无法显示此类文档。 您可以通过访问升级至最新版本的Adobe Reader for Windows®、Mac或Linux®http://www.adobe.com/go/reader_d

  • 我有一个问题做npm启动,这似乎是一个bug与css-loader但我不能修复它。 我读过这篇文章,但我不能让它工作:https://github.com/reactjsresources/react-webpack-babel/issues/197 我还修改了webpack.config.js,添加了: 和: 如果有人能帮忙请... 谢谢.

  • 我正在编写一个Qt GUI应用程序,它通过串行方式接收数据并将数据发送到Arduino。它写得正确,但当尝试阅读时,它不起作用。 我的问题是: 我有一个Arduino代码可以通过串行方式发送信息,我将其编程为根据接收到的数据打开和关闭针脚13上的LED: 我在MainWindow类中使用以下信号和插槽: 以及前一个插槽调用的Arduino::Read()方法: 当向Arduino写入数据时,它工作

  • 我正在尝试用Tesseract OCR阅读器阅读pdf。不过,它对图像文件非常有效。 以下是我所做的: > 创建一个Maven项目 添加了tess4j版本4.4.1作为依赖项 将java版本更改为13 添加了以下代码: 之后,我发现以下错误: 我该如何着手解决这个问题?

  • 问题内容: 我怎么知道我可以从对象/界面访问的字段?我尝试过反射,但看来您必须首先知道字段名称。如果我需要了解所有可用字段怎么办? 问题答案: 您可以使用该函数获取类型描述符。从那里,您可以列出存储在界面中的动态值的字段。 例: 输出: 调用的结果是一个值为,其中包含字段名称以及其他内容: 如果还需要这些字段的值,则可以使用获取,然后可以使用或: 输出: 在Go Playground上尝试一下。