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)。