java com.itextpdf.text.exceptions.InvalidPdfException:文档没有页面根目录

时间:2017-01-13 09:44:26

标签: java itext

我正在尝试阅读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

提前致谢

此致

利玛

3 个答案:

答案 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