2017-01-13 3 views
0

Я пытаюсь прочитать PDF файлы, и я получил это исключениеJava com.itextpdf.text.exceptions.InvalidPdfException: Документ не имеет корня страницы

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

я та же проблема на itext 5.5.10. Я еще не взглянул на некоторые новые изменения в последней версии. Но он отлично работает на нем. 5.3.4. Вы можете попробовать на этой версии

+0

* он отлично работает на нем. 5.3.4 * - ** рабочий штраф ** должен означать ** отклонение PDF **, поскольку он сломан. – mkl

0

Во-первых, я хотел бы попробовать альтернативу, которая, кажется, работает для многих людей:

http://pdfbox.apache.org/ < - Вдохновленные старой почте я researchd на переполнение стека

Во-вторых во время отладки вопрос я нашел это

rootPages == null || (!PdfName.PAGES.equals(rootPages.get(PdfName.TYPE)) 
&& !PdfName.PAGES.equals(rootPages.get(new PdfName("Types")))) 

Не удовлетворено, следовательно, ваша проблема. Я считаю, что это может быть текущий Bug в Itext.

DFTBA

+0

* «Я считаю, что это может быть настоящий Bug в Itext». * - Почему вы так верите? (В некотором смысле это выражение действительно ошибочно, но только потому, что оно слишком слабое *** и позволяет ** Типы ** в качестве альтернативы ** Тип **.) – mkl

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 

Как вы видите ключ Тип происходит дважды, один раз со значением Страницы и один раз значение Page. Но спецификация ISO 32000-1 четко указана в разделе 7.3.7. Словарь объектов:

Несколько записей в одном словаре не должны иметь одинаковый ключ.

(Это, кстати, является довольно очевидным требованием для объектов словаря вообще ...)


В результате такого дефекта может быть различным в разных процессорах PDF, главным очевидные случаи:

  • Они могут явно проверять наличие таких проблем и полностью отклонять файл.
  • Они могут не проверять, а использовать первое значение, присвоенное ключу.
  • Они могут не проверять, а использовать последнее значение, присвоенное ключу.

iText похоже на третий вид. Что касается iText, поэтому словарь корневых файлов дерева страниц имеет Тип значение Page. Но для спецификации требуется Тип узла дерева страниц - Страницы. Таким образом, iText вызывает наблюдаемое исключение.

Смежные вопросы