【发布时间】: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 条目。尝试使用 Adobe Reader 复制和粘贴,它也不起作用。我怀疑这是故意这样做的,以避免人们提取数据以提供 PDF 的创建者也提供的服务。
-
@TilmanHausherr 同意样本不提供错误,但我拥有的文件提供。无论如何,提取在这两种情况下都不起作用。不,PDF 的创建者不提供该服务。也许 PDFBox 无法识别 PDF 的制作方式。只是想知道我的 qns 中引用的网站使用了哪些工具,因为它可以很好地进行提取。也许需要看看是否有任何其他开源 PDF 提取器,任何指向它的指针都会有所帮助
-
试试icepdf、jpedal和itext,它们都有文本提取功能——试试吧。也许您指出的工具可以进行 OCR。