您使用的示例代码假定Page对象是Pages目录键所指向的字典的直接子对象:
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的树,即它的叶子,页面节点,可能在结构中更深,孩子根Pages词典等的孩子的孩子。
如果您的 PDF 是这种情况,则第 1 页(对象 3)的Page字典是 Pages 字典对象 6 的子项,而Pages字典对象 6 又是根Pages字典对象 70 的子项。
因此,该代码假定中间Pages字典对象 6 已经是Page对象。
不过,这不是该示例代码的唯一问题。例如,它还假设Resources字典附加到Page对象本身。这不一定是真的,它也可以附加到任何父Pages对象,包括页面树根:
资源字典(必需;可继承)包含页面所需的任何资源的字典(参见 7.8.3,“资源字典”)。如果页面不需要资源,则该条目的值应为空字典。完全省略该条目表示资源应从页面树中的祖先节点继承。
(表 30 - 页面对象中的条目 - 在 ISO 32000-1 中,当前 PDF 规范)
因此,您通常使用的示例是无用的,因为它不符合 PDF 规范。
话虽如此,您的示例是从您使用 iText 5.0.1时最新版本的 iText为1.02b时开始的……您为什么不寻找更新的示例?奇怪的是,在 4 个主要版本之后,它甚至可以调整以轻松编译!
PdfReader
在当前的 iText 版本中,您可以使用方法getPageN(final int pageNum)
或获取给定页面的字典getPageNRelease(final int pageNum)
。
但是,您不应该期望当前PdfReader
方法getPageResources(final int pageNum)
返回给定页面的资源,因为它(就像您的示例代码一样)只查看资源字典的页面字典
您使用 iText 5.0.1是否有特定原因?该版本相当旧,从那时起已经应用了许多错误修复和功能。