iText-PdfReader:重建失败:字典键endstream不是名称
我使用的是5.4.4版,我遇到了com.itextpdf.text.pdf.PdfReader的问题。
当我阅读PDF时
PdfReader reader = new PdfReader(„Test.pdf");
- 它是一张扫描的纸张,我可以用Adobe Reader打开它 – 发生以下错误:
com.lowagie.text.exceptions.InvalidPdfException:重建失败:字典键endstream不是名称。 在文件指针3913220; 原始消息:字典键endstream不是名称。 在文件指针3913220处
at com.lowagie.text.pdf.PdfReader.readPdf(PdfReader.java:668)
在com.lowagie.text.pdf.PdfReader。(PdfReader.java:189)
在com.lowagie.text.pdf.PdfReader。(PdfReader.java:264)
在com.lowagie.text.pdf.PdfReader。(PdfReader.java:247)
我查看代码,因为itext 5.4.4抛出exception。 在旧版本中,将忽略此exception。
来自方法readDocObj()的代码在第1319行的itext 5.4.3中:
catch (Exception e) { obj = null; // Exception ignored !!!!!!!! }
来自方法readDocObj()的代码在第1319行的itext 5.4.4中:
catch (IOException e) { if (debugmode) { e.printStackTrace(); obj = null; } else throw e; // Exception thrown !!!!!! }
在1346行的最新版本5.5.1中:
catch (IOException e) { if (debugmode) { if (LOGGER.isLogging(Level.ERROR)) LOGGER.error(e.getMessage(), e); obj = null; } else throw e; // Exception thrown !!!!!! }
您的原始PDF包含错误,并忽略该错误可能导致非常奇怪的结果(丢失对象,完全搞砸了PDF)。 因此,我们应该抛出一个错误,告诉你文件有什么问题。 您的PDF可能包含流字典不正确的PDF流。
认为该文件在Adobe Reader中打开良好是一个不好的论点:它并不意味着您的PDF服从ISO-32000-1。 Adobe Reader会尽最大努力打开破坏的文件。 如果您使用Adobe Acrobat打开它并使用Preflight,您会注意到Acrobat也会抱怨该错误。
由于调试具有此类错误的文件非常困难,因此我们引入了debugmode
常量。 默认情况下,此常量为false
,但在iText RUPS中设置为true
。 将此常量设置为true
允许我们读取文件并忽略错误,以便我们可以在RUPS中检查文件。
如果您不关心输入PDF的质量,可以将debugmode
设置为true,但我不建议这样做。 我建议修复原始PDF。
备注:我赞成评论。 您显然没有告诉我们完整的事实,因为您声称您使用的是iText 5版本,但是您有错误消息提到我的名字(我是来自com.lowagie
软件包的Lowagie)。