【问题标题】:Java - Issue with data extraction from PDF (PDFBox - 2.02)Java - 从 PDF 中提取数据的问题 (PDFBox - 2.02)
【发布时间】:2016-11-25 00:04:48
【问题描述】:

我正在尝试从包含单独表格中的数据的 PDF 文件中提取数据并转换为 Excel。基于此link,由于我的需求或多或少相同,我正在使用 PDFBOX jar 进行提取。

为了测试我是否可以先从 pdf 中的不同表中提取数据,尝试使用下面指定的代码。但它没有提取并给出错误说明损坏的对象引用,不知道这是什么意思。

为了查看pdf本身是否有任何问题,我检查了https://online2pdf.com&它成功地将pdf文件转换为excel,所以我相信pdf文件没有问题。

希望我面临的问题很清楚并等待有关从 pdf 中提取数据需要做什么的输入

错误信息:

2016-07-21 13:49:11 WARN  BaseParser:682 - Corrupt object reference at offset 6371
2016-07-21 13:49:11 WARN  BaseParser:682 - Corrupt object reference at offset 6373

java.io.IOException: Expected string 'null' but missed at character 'u' at offset 6376
    at org.apache.pdfbox.pdfparser.BaseParser.readExpectedString(BaseParser.java:1017)
    at org.apache.pdfbox.pdfparser.BaseParser.readExpectedString(BaseParser.java:1000)
    at org.apache.pdfbox.pdfparser.BaseParser.parseDirObject(BaseParser.java:879)
    at org.apache.pdfbox.pdfparser.BaseParser.parseCOSArray(BaseParser.java:651)
    at org.apache.pdfbox.pdfparser.PDFStreamParser.parseNextToken(PDFStreamParser.java:175)
    at org.apache.pdfbox.contentstream.PDFStreamEngine.processStreamOperators(PDFStreamEngine.java:479)
    at org.apache.pdfbox.contentstream.PDFStreamEngine.processStream(PDFStreamEngine.java:446)
    at org.apache.pdfbox.contentstream.PDFStreamEngine.processPage(PDFStreamEngine.java:149)
    at org.apache.pdfbox.text.PDFTextStreamEngine.processPage(PDFTextStreamEngine.java:136)
    at org.apache.pdfbox.text.PDFTextStripper.processPage(PDFTextStripper.java:391)
    at org.apache.pdfbox.text.PDFTextStripper.processPages(PDFTextStripper.java:319)
    at org.apache.pdfbox.text.PDFTextStripper.writeText(PDFTextStripper.java:266)
    at org.apache.pdfbox.text.PDFTextStripper.getText(PDFTextStripper.java:227)
    at main.Test.readPDF(Test.java:170)
    at main.Test.main(Test.java:76)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

代码:

public static void main(String[] args){
try {
        File filePDF = new File("C:\\test.pdf");
        PDDocument document = PDDocument.load(filePDF);
        PDFTextStripper s = new PDFTextStripper();
        String content = s.getText(document);
        System.out.println(content);
    } catch (IOException e) {
            e.printStackTrace();
    }
}

【问题讨论】:

  • 您应该提供有问题的PDF文件。
  • @Setasign 因为 pdf 文档包含财务信息。我将无法分享。但是,您可以查看包含我要提取的信息的示例(也可以从链接下载)。链接是->dropbox.com/s/g5iorxzvg92ye1i/Sample%20Contract.pdf?raw=1
  • 该文件没有带来“损坏的对象引用”错误。但是没有文本提取结果,因为字体没有 ToUnicode 条目。尝试使用 Adob​​e Reader 复制和粘贴,它也不起作用。我怀疑这是故意这样做的,以避免人们提取数据以提供 PDF 的创建者也提供的服务。
  • @TilmanHausherr 同意样本不提供错误,但我拥有的文件提供。无论如何,提取在这两种情况下都不起作用。不,PDF 的创建者不提供该服务。也许 PDFBox 无法识别 PDF 的制作方式。只是想知道我的 qns 中引用的网站使用了哪些工具,因为它可以很好地进行提取。也许需要看看是否有任何其他开源 PDF 提取器,任何指向它的指针都会有所帮助
  • 试试icepdf、jpedal和itext,它们都有文本提取功能——试试吧。也许您指出的工具可以进行 OCR。

标签: java pdf pdfbox


【解决方案1】:

终于找到了一个 jar (PDFxStream) 文件,它在这种情况下从 PDF 中提取所有数据。虽然它是付费版本,但它能够提取其他付费版本无法提取的完整信息。

唯一的事情是,它作为字符串提取,我需要解析这个字符串并从中提取特定信息。

【讨论】:

  • 如果您共享了一个可以重现问题的 PDF,那么您可能已经获得了基于 PDFBox 的解决方案,同时 PDFBox 也会得到改进。
  • @mkl 我明白你的意思。但正如我在最初的帖子中提到的,实际使用的文件包含财务信息,因此无法共享。我提供了一个示例链接,其中包含我需要提取的代表性数据,如果可以用来增强 PDFBox,那就太好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
相关资源
最近更新 更多