В примере кода используется предполагает, что 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 вы можете получить словарь данной страницы с помощью метода PdfReader
getPageN(final int pageNum)
или getPageNRelease(final int pageNum)
.
Вы не должны ожидать, что текущий PdfReader
метода getPageResources(final int pageNum)
вернуть ресурсы данной страницы, хотя, как он (так же, как ваш образец кода) выглядит только на страницы словаря для ресурсов словаря
Есть ли какая-то конкретная причина для вас использовать iText 5.0.1? Эта версия довольно старая, и с тех пор были применены многие исправления ошибок и функции.