Вот (java, извините) источник для readPages:
protected internal void ReadPages() {
catalog = trailer.GetAsDict(PdfName.ROOT);
rootPages = catalog.GetAsDict(PdfName.PAGES);
pageRefs = new PageRefs(this);
}
trailer,
каталог ,
rootPages , and
pageRefs` - все переменные-члены PdfReader.
Если трейлер или корневой / каталожный объект PDF-файла просто отсутствуют, ваш PDF-файл ДЕЙСТВИТЕЛЬНО ПОВРЕЖДЕН. Скорее всего, таблица внешних ссылок немного отклонена, и рассматриваемые объекты просто не совсем там, где они должны быть (что плохо, но можно восстановить).
ОДНАКО, когда PdfReader впервые открывает PDF, он анализирует ВСЕ объекты в файле и преобразует их в соответствующие классы, производные от PdfObject.
То, что он не не делает , проверяет, что номер объекта, указанный в таблице внешних ссылок, и номер объекта, считанные из файла Actual Match. Весьма маловероятно, но возможно. Плохое программное обеспечение может записывать свои объекты PDF в неправильном порядке, но сохранять правильные смещения байтов в таблице внешних ссылок. Программное обеспечение, которое перекрывает номер объекта из таблицы внешних ссылок номером из этого конкретного байтового смещения в файле, подойдет.
iText не в порядке.
Я все еще хочу посмотреть PDF.
Да. Этот PDF сломан хорошо. В частности:
Первые 70 КБ файла или около того определяют довольно чистый маленький PDF. Затем изменения были добавлены в PDF.
Проверьте это. Кто-то попытался добавить изменения в PDF и потерпел неудачу. Плохо. Чтобы понять, насколько плохо, позвольте мне объяснить некоторый внутренний синтаксис PDF, проиллюстрированный на этом примере:
%%PDF1.6
1 0 obj
<</Type/SomeObject ...>>
endobj
2 0 obj
<</Type/SomeOtherObj /Ref 1 0 R>>
endobj
3 0 obj
...
endobj
<etc>
xref
0 10
0000000000 65535 f
0000000010 00001 n
0000000049 00002 n
0000000098 00003 n
...
trailer
<</Root 4 0 R /Size 10>>
startxref 124
%%EOF
Итак, у нас есть заголовок / версия "%% PDF1.v", список объектов (здесь они называются словарями), таблица перекрестных ссылок (x), в которой перечислены смещения байтов и номера объектов всех объектов в список и трейлер с указанием корневого объекта и количества объектов в PDF, а также смещение байта в «x» в «xref».
Вы можете добавить изменения в существующий PDF. Для этого вы просто добавляете новые или измененные объекты после существующего %% EOF, таблицу перекрестных ссылок на эти новые объекты и трейлер. Трейлер добавленного изменения должен включать ключ / Prev с байтовым смещением к предыдущей таблице перекрестных ссылок.
В вашем PDF-файле NOT-OKAY кто-то пытался добавить изменения в PDF, И УЖАСНО УДАЛЕН .
Оригинальный PDF все еще там, без изменений. Это то, что Reader показывает вам, и что вы получаете, когда сохраняете PDF. Я взломал все после первого %% EOF в шестнадцатеричном редакторе, и файл был в порядке.
Итак, вот макет вашего НЕ-OKAY pdf:
%PDF1.4.1
1 0 obj...
2 through 7
xref
0 7
<healthy xref>
trailer <</Size 8 /Root 6 0 R /Info 7 0 R>>
startxref 68308
%%EOF
Пока все хорошо. Здесь все становится ужасно
<binary garbage>
endstream
endobj
xref
0 7
<horribly wrong xref>
trailer <</ID [...] /Info 1 0 R /Root 2 0 R /Size 7>>
startxref 223022
%%EOF
Единственное, что ПРАВИЛЬНО в этом разделе - это значение startxref.
Проблемы:
- Второй трейлер не имеет ключа / Prev.
- ВСЕ смещения байтов во второй таблице внешних ссылок неверны.
- Является частью объекта «поток», но начало этого объекта пропадает. Потоки должны выглядеть примерно так
1 0 obj
<</Type/SomeType/Length 123>>
stream
123 bytes of data
endstream
endobj
Конец этого файла состоит из некоторой части (сжатого, я бы себе представлял) потока ... но без словаря в начале, говорящего нам, что фильтрует его использование и как долго это (не говоря уже о какие-либо пропущенные данные), с этим ничего не поделаешь.
Я подозреваю, что кто-то пытался полностью перестроить этот PDF, а затем случайно написал оригинальные 70 КБ в начале своей версии. Kaboom.
Похоже, что Adobe просто игнорирует некорректно добавленные изменения. iText может сделать это тоже, , но вы можете :
Когда iText не удается открыть PDF:
1. Выполните поиск в обратном направлении в файле в поисках второй до последней %%EOF
. Не обращайте внимания на тот, что в самом конце, мы хотим предыдущее состояние файла.
2. Удалите все после второго-последнего %%EOF
(если есть) и попробуйте открыть его снова.
Печально то, что этот поврежденный PDF-файл мог полностью отличаться от «оригинальных» 70 КБ, а затем некоторая ошибка ввода-вывода перезаписала первую часть файла. Вряд ли, но нет уверенности.