2015-07-08 5 views
0

Я использую iText 5.0.1 для управления существующим PDF. При анализе существующего PDF с помощью RUPS, я могу видеть, что первая страница содержит/Ресурсы:iText: невозможно получить/Ресурсы со страницы

enter image description here

Однако при манипулировании PDF с помощью following example, я получаю NPE потому pageDictionary. get (PdfName.RESOURCES) возвращает null.

Вот что мой pageDictionnary объект содержит при отладке:

enter image description here

К сожалению, из-за конфиденциальности, я не могу отправить PDF сейчас, но кто-нибудь есть идея, почему я получить этот NPE? Или у кого-нибудь есть идея, как исследовать дальше? (Я далек от того, чтобы быть экспертом в iText и PDF-структуре ... и медленно выходил из идеи)

Большое спасибо!

ответ

3

В примере кода используется предполагает, что Page объекты непосредственные дети словаря, на который указывает Страницы каталоге ключа:

PdfDictionary pages = (PdfDictionary) PdfReader.getPdfObject(reader.getCatalog().get(PdfName.PAGES)); 
PdfArray kids = (PdfArray) PdfReader.getPdfObject(pages.get(PdfName.KIDS)); 
PdfDictionary pageDictionary = (PdfDictionary) PdfReader.getPdfObject((PdfObject) kids.getArrayList().get(pageNum - 1)); 

Это предположение часто это нормально, потому что многие производители PDF генерировать простые но в целом дерево страниц действительно может быть деревом с глубиной более крупным, чем 1, т.е. его листья, Страница узлы, могут быть глубже в строении, дети дети малышей корня страницы словаря и т.д.

В случае Вашего PDF, что имеет место, то Page словарь страница 1 (объект 3) является ребенком из страниц словаря объектов 6, которые в свою очередь, является ребенком корня страниц объект словаря 70.

Таким образом, этот код предполагает посредническую страницы объект словаря 6 к уже быть Page объект.

Это не единственная проблема с этим образцом кода. Например. он также предполагает, что словарь прилагается к самому объекту Page. Это не должно быть правдой, это также может быть присоединен к любому родителю страницы объекта, включая корень дерева страниц:

ресурсов словарь (обязательно; наследуемым) Словарь, содержащий любые ресурсы, необходимые страницы (см. 7.8.3 «Словари ресурсов»). Если страница не требует ресурсов, значение этой записи должно быть пустым словарем. Опускание записи полностью указывает на то, что ресурсы должны быть унаследованы от узла-предка в дереве страниц.

(Таблица 30 - Записи в объекте страницы - в ISO 32000-1, текущая спецификация PDF)

Таким образом, образец вы используете в целом бесполезно, поскольку это не чтит PDF спецификация.


Это было сказано, ваш образец от времени, когда новой версии IText была 1.02b пока вы с помощью IText 5.0.1 ... Почему вы не смотрите для больше текущей выборки? Удивительно, что после четырех основных версий он даже может быть легко скомпилирован!


В текущих версиях IText вы можете получить словарь данной страницы с помощью метода PdfReadergetPageN(final int pageNum) или getPageNRelease(final int pageNum).

Вы не должны ожидать, что текущий PdfReader метода getPageResources(final int pageNum) вернуть ресурсы данной страницы, хотя, как он (так же, как ваш образец кода) выглядит только на страницы словаря для ресурсов словаря


Есть ли какая-то конкретная причина для вас использовать iText 5.0.1? Эта версия довольно старая, и с тех пор были применены многие исправления ошибок и функции.

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