iText PDF 失败并显示消息 "Dictionary key endstream is not a name"

iText PDF fails with message "Dictionary key endstream is not a name"

问题与报告的问题相同 here

我已经 this image and converted to this PDF 使用 GraphicsMagick v1.3.26(构建于 2017-07-04):

gm convert itext_banner_InvalidPdfException.jpg itext_banner_InvalidPdfException.pdf

当我尝试使用 iText v5.5.12 阅读它时,出现以下异常:

java -cp itextpdf-5.5.12.jar com.itextpdf.text.pdf.parser.PdfContentReaderTool itext_banner_InvalidPdfException.pdf
com.itextpdf.text.exceptions.InvalidPdfException: Rebuild failed: Dictionary key endstream is not a name. at file pointer 1197; Original message: Dictionary key endstream is not a name. at file pointer 1197
    at com.itextpdf.text.pdf.PdfReader.readPdf(PdfReader.java:764)
    at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:197)
    at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:235)
    at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:223)
    at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:213)
    at com.itextpdf.text.pdf.parser.PdfContentReaderTool.listContentStream(PdfContentReaderTool.java:200)
    at com.itextpdf.text.pdf.parser.PdfContentReaderTool.main(PdfContentReaderTool.java:249)

问题:

您的 PDF 包含这个损坏的对象:

11 0 obj
<<

endstream
endobj 

开口 <<endstream 关闭。这不匹配。

如果该对象只是一个字典,它应该看起来像这样:

11 0 obj
<<
    [a reasonable number of dictionary entries]
>>
endobj 

如果该对象是一个流,它应该看起来像这样:

11 0 obj
<<
    [a reasonable number of dictionary entries]
>>
stream
    [stream data]
endstream
endobj 

顺便说一句,PDF 中的任何其他对象均未引用相关对象。因此,如果您在 PdfReader 中以部分模式打开 PDF,则该问题将被忽略。