我正在尝试阅读PDF文件而且我遇到了这个例外
com.itextpdf.text.exceptions.InvalidPdfException: The document has no page root (meaning: it's an invalid PDF).
at com.itextpdf.text.pdf.PdfReader.readPages(PdfReader.java:1248)
at com.itextpdf.text.pdf.PdfReader.readPdf(PdfReader.java:739)
at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:181)
at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:219)
at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:207)
at com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:197)
at com.mitech.med.watermark.Test2.main(Test2.java:11)
我使用了itext 5.5.10。 这是我的代码:
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
PdfReader reader = new PdfReader("C:/Users/matteo.fusi/Downloads/testPDF/1142.pdf");
} catch (Exception e) {
e.printStackTrace();
}
}
这是PDF文档的链接:
https://drive.google.com/file/d/0B2IrLGj9wefRVFZxSUhkN0o0N1k/view?usp=sharing
提前致谢
此致
利玛
答案 0 :(得分:1)
我在itext 5.5.10上遇到了同样的问题。我还没看过最新版本的一些新变化。但它在itext 5.3.4上运行良好。你可以尝试那个版本
答案 1 :(得分:1)
有问题的PDF已被破坏。
这是页面树根词典对象:
1 0 obj
<</Type /Pages /Count 1
/Kids[
4 0 R
]
/Type /Page
/MediaBox [ 0 0 595 842 ]
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/Resources <<
/Font << /F0 6 0 R /F1 7 0 R /F2 8 0 R /F3 9 0 R /F4 10 0 R /F5 11 0 R /F6 12 0 R /F7 13 0 R /F8 14 0 R /F9 15 0 R /F10 16 0 R /F11 17 0 R /F12 18 0 R /F13 19 0 R /F14 20 0 R >>
/XObject <<
/Im0 5 0 R >>
>>
>>endobj
如您所见,类型键出现两次,一次使用值页面,一次使用值页面。但规范ISO 32000-1在7.3.7节 - 字典对象中明确指出:
同一字典中的多个条目不得具有相同的密钥。
(顺便说一句,这对字典对象来说是一个相当明显的要求......)
这种缺陷的结果可能在不同的PDF处理器中有所不同,主要的明显情况如下:
iText似乎是第三种。因此,就iText而言,页面树根词典具有类型值页面。但规范要求页面树节点的类型为页面。因此,iText会抛出观察到的异常。
答案 2 :(得分:0)
首先,我会尝试一种似乎适用于很多人的替代方案:
http://pdfbox.apache.org/&lt; - 受到我研究堆栈溢出的旧帖子的启发
其次在调试问题时我发现了这个
rootPages == null || (!PdfName.PAGES.equals(rootPages.get(PdfName.TYPE))
&& !PdfName.PAGES.equals(rootPages.get(new PdfName("Types"))))
因此不满意你的问题。我相信它可能是Itext中的当前Bug。
DFTBA