0

我正在使用 iText 5.0.1 来操作现有的 PDF。使用RUPS分析现有 PDF 时,我可以看到第一页包含 /Resources :

在此处输入图像描述

但是,当使用以下示例操作 PDF 时,我得到一个 NPE,因为pageDictionary.get(PdfName.RESOURCES)返回 null。

这是调试时我的pageDictionnary对象包含的内容:

在此处输入图像描述

不幸的是,由于机密性,我现在无法发布 PDF,但是有人知道我为什么会收到此 NPE 吗?或者有谁知道如何进一步调查?(我远不是 iText 和 PDF 结构方面的专家......并且慢慢地失去了想法)

非常感谢 !

4

1 回答 1

4

您使用的示例代码假定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时最新版本的 iText1.02b时开始的……您为什么不寻找更新的示例?奇怪的是,在 4 个主要版本之后,它甚至可以调整以轻松编译!


PdfReader在当前的 iText 版本中,您可以使用方法getPageN(final int pageNum)或获取给定页面的字典getPageNRelease(final int pageNum)

但是,您不应该期望当前PdfReader方法getPageResources(final int pageNum)返回给定页面的资源,因为它(就像您的示例代码一样)只查看资源字典的页面字典


您使用 iText 5.0.1是否有特定原因?该版本相当旧,从那时起已经应用了许多错误修复和功能。

于 2015-07-08T21:37:54.620 回答