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 究竟有什么问题? GraphicsMagick 间接使用的 GhostScript 似乎有问题。
- 当我用 iText RUPS v5.8.8 打开它时,它不会向 控制台 选项卡打印任何警告。这是否意味着从 iText RUPS 的角度来看它是有效的?
您的 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,则该问题将被忽略。
问题与报告的问题相同 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 究竟有什么问题? GraphicsMagick 间接使用的 GhostScript 似乎有问题。
- 当我用 iText RUPS v5.8.8 打开它时,它不会向 控制台 选项卡打印任何警告。这是否意味着从 iText RUPS 的角度来看它是有效的?
您的 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,则该问题将被忽略。