【发布时间】:2017-07-29 20:21:48
【问题描述】:
我在尝试将 PDF(XFA) 转换为字符串时遇到以下错误。
当我从 PDFBox 1.8.12 切换到 PDFBox 2.0.4 时,这些错误开始出现
这是日志
Mar 09, 2017 7:16:07 AM org.apache.pdfbox.pdfparser.BaseParser parseCOSArray
WARNING: Corrupt object reference at offset 779916
Mar 09, 2017 7:16:07 AM org.apache.pdfbox.pdfparser.BaseParser parseCOSArray
WARNING: Corrupt object reference at offset 780049
Mar 09, 2017 7:16:07 AM org.apache.pdfbox.pdfparser.BaseParser parseCOSArray
WARNING: Corrupt object reference at offset 780074
java.io.IOException: Unknown dir object c='>' cInt=62 peek='>' peekInt=62 at offset 780074
at org.apache.pdfbox.pdfparser.BaseParser.parseDirObject(BaseParser.java:951)
at org.apache.pdfbox.pdfparser.BaseParser.parseCOSArray(BaseParser.java:651)
at org.apache.pdfbox.pdfparser.BaseParser.parseDirObject(BaseParser.java:866)
at org.apache.pdfbox.pdfparser.BaseParser.parseCOSDictionaryValue(BaseParser.java:150)
at org.apache.pdfbox.pdfparser.BaseParser.parseCOSDictionaryNameValuePair(BaseParser.java:274)
at org.apache.pdfbox.pdfparser.BaseParser.parseCOSDictionary(BaseParser.java:207)
at org.apache.pdfbox.pdfparser.BaseParser.parseDirObject(BaseParser.java:854)
at org.apache.pdfbox.pdfparser.COSParser.parseFileObject(COSParser.java:772)
at org.apache.pdfbox.pdfparser.COSParser.parseObjectDynamically(COSParser.java:741)
at org.apache.pdfbox.pdfparser.COSParser.parseObjectDynamically(COSParser.java:672)
at org.apache.pdfbox.pdfparser.COSParser.parseDictObjects(COSParser.java:632)
at org.apache.pdfbox.pdfparser.PDFParser.initialParse(PDFParser.java:217)
at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:252)
和
java.io.IOException: Wrong type of referenced length object COSObject{7, 0}: COSDictionary
at org.apache.pdfbox.pdfparser.COSParser.getLength(COSParser.java:907)
at org.apache.pdfbox.pdfparser.COSParser.parseCOSStream(COSParser.java:949)
at org.apache.pdfbox.pdfparser.COSParser.parseFileObject(COSParser.java:780)
at org.apache.pdfbox.pdfparser.COSParser.parseObjectDynamically(COSParser.java:741)
at org.apache.pdfbox.pdfparser.COSParser.parseObjectDynamically(COSParser.java:672)
at org.apache.pdfbox.pdfparser.COSParser.parseDictObjects(COSParser.java:632)
at org.apache.pdfbox.pdfparser.PDFParser.initialParse(PDFParser.java:217)
at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:252)
at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:966)
at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:922)
at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:870)
我阅读了迁移并使用 load 而不是 loadNonSeq,因为现在 PDFBox 在内部处理。
关于如何修复这些错误的任何建议。
编辑#2 @TilmanHausherr 我检查了你的理论。我在 Sublime 中打开了文件,删除了开头的多余空格并保存了它。我收到以下错误
org.apache.pdfbox.filter.FlateFilter decode
SEVERE: FlateFilter: stop reading corrupt stream due to a DataFormatException
java.io.IOException: java.util.zip.DataFormatException: invalid distance too far back
at org.apache.pdfbox.filter.FlateFilter.decode(FlateFilter.java:82)
at org.apache.pdfbox.cos.COSInputStream.create(COSInputStream.java:69)
at org.apache.pdfbox.cos.COSStream.createInputStream(COSStream.java:162)
at org.apache.pdfbox.pdfparser.PDFXrefStreamParser.<init>(PDFXrefStreamParser.java:56)
at org.apache.pdfbox.pdfparser.COSParser.parseXrefStream(COSParser.java:2075)
at org.apache.pdfbox.pdfparser.COSParser.parseXrefObjStream(COSParser.java:348)
at org.apache.pdfbox.pdfparser.COSParser.parseXref(COSParser.java:303)
at org.apache.pdfbox.pdfparser.PDFParser.initialParse(PDFParser.java:194)
at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:252)
at utils.PDFManager.PDFToText(PDFManager.java:280)
at processing.charge.CertificateUtils.getCertificateTypeFromFile(CertificateUtils.java:56)
at processing.charge.CertificateUtils.getCertificateType(CertificateUtils.java:48)
at processing.Controller.getDocumentType(Controller.java:110)
at processing.Controller.insertIntoDb(Controller.java:43)
at Test.main(Test.java:203)
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)
Caused by: java.util.zip.DataFormatException: invalid distance too far back
at java.util.zip.Inflater.inflateBytes(Native Method)
at java.util.zip.Inflater.inflate(Inflater.java:259)
at java.util.zip.Inflater.inflate(Inflater.java:280)
at org.apache.pdfbox.filter.FlateFilter.decompress(FlateFilter.java:107)
at org.apache.pdfbox.filter.FlateFilter.decode(FlateFilter.java:64)
... 19 more
Mar 09, 2017 11:07:22 PM org.apache.pdfbox.filter.FlateFilter decode
SEVERE: FlateFilter: stop reading corrupt stream due to a DataFormatException
java.io.IOException: java.util.zip.DataFormatException: invalid distance too far back
at org.apache.pdfbox.filter.FlateFilter.decode(FlateFilter.java:82)
at org.apache.pdfbox.cos.COSInputStream.create(COSInputStream.java:69)
at org.apache.pdfbox.cos.COSStream.createInputStream(COSStream.java:162)
at org.apache.pdfbox.pdfparser.PDFXrefStreamParser.<init>(PDFXrefStreamParser.java:56)
at org.apache.pdfbox.pdfparser.COSParser.parseXrefStream(COSParser.java:2075)
at org.apache.pdfbox.pdfparser.COSParser.parseXrefObjStream(COSParser.java:348)
at org.apache.pdfbox.pdfparser.COSParser.parseXref(COSParser.java:303)
at org.apache.pdfbox.pdfparser.PDFParser.initialParse(PDFParser.java:194)
at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:252)
at utils.PDFManager.PDFToText(PDFManager.java:280)
at processing.charge.CertificateUtils.getCertificateTypeFromFile(CertificateUtils.java:56)
at processing.charge.CertificateUtils.getCertificateType(CertificateUtils.java:49)
at processing.Controller.getDocumentType(Controller.java:110)
at processing.Controller.insertIntoDb(Controller.java:43)
at Test.main(Test.java:203)
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)
Caused by: java.util.zip.DataFormatException: invalid distance too far back
at java.util.zip.Inflater.inflateBytes(Native Method)
at java.util.zip.Inflater.inflate(Inflater.java:259)
at java.util.zip.Inflater.inflate(Inflater.java:280)
at org.apache.pdfbox.filter.FlateFilter.decompress(FlateFilter.java:107)
at org.apache.pdfbox.filter.FlateFilter.decode(FlateFilter.java:64)
另外为了验证你的理论,我在 Sublime 中打开了另一个文件(它工作正常),它有相同的空格、制表符和 CR。
【问题讨论】:
-
我删除了 itext 标签,因为问题与 iText 无关。这使您的评论变得多余,@bruno.lowagie。 :)
-
@TilmanHausherr 我已将链接添加到 PDF。请检查这些。谢谢
-
两个文件都无效。可以使用 PDFBox 打开它们,方法是使用 NOTEPAD++ 删除开头的空白字符(CR 和制表符)。您是否获得了类似的这些文件,或者这是网络服务器损坏的一些缺陷?我已经打开了您的文件的问题:issues.apache.org/jira/browse/PDFBOX-3714
-
也许“崇高”编辑器做了其他修改,例如更改 CR LF。我使用的是非常酷的产品 NOTEPAD++。我已在问题中附加了这两个文件。
-
编辑更改后,我使用了 PDFDebugger 命令行应用程序,而那个应用程序只使用了普通的 PDDocument.load()。