iText:无法从页面检索/资源
iText : unable to retrieve /Resources from a page
我正在使用 iText 5.0.1 来处理现有的 PDF。使用 RUPS 分析现有 PDF 时,我可以看到第一页包含 /Resources :
但是,当使用 following example 操作 PDF 时,我得到了 NPE,因为 pageDictionary.get(PdfName.RESOURCES) 是返回空值。
这是调试时我的 pageDictionnary 对象包含的内容:
遗憾的是,由于保密原因,我现在无法 post PDF,但有人知道我为什么会收到此 NPE 吗?或者有人知道如何进一步调查吗? (我远不是 iText 和 PDF 结构方面的专家......并且慢慢失去了想法)
非常感谢!
您使用的示例代码假定 Page object 是 Pages[=60= 指向的字典的直接子项] 目录键:
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,即它的叶子,Page 节点,可能在结构的更深处,根 Pages[=60 的孩子的孩子的孩子=] 词典等
如果您的 PDF 是这种情况,第 1 页(object 3)的 Page 词典是 Pages[ 的孩子=60=] 字典 object 6 又是根 Pages 字典 object 70.
的孩子
因此,该代码假定中间 Pages 字典 object 6 已经是 Page object .
但这不是该示例代码的唯一问题。例如。它还假定 Resources 字典附加到 Page object 本身。这不一定是真的,它也可以附加到任何 parent Pages object 包括页面树根:
Resources dictionary (Required; inheritable) A dictionary containing any resources required by the page (see 7.8.3, "Resource Dictionaries"). If the page requires no resources, the value of this entry shall be an empty dictionary. Omitting the entry entirely indicates that the resources shall be inherited from an ancestor node in the page tree.
(Table 30 – Entries in a page object - in ISO 32000-1, the current PDF specification)
因此,您通常使用的示例是无用的,因为它不符合 PDF 规范。
也就是说,您的示例来自 最新版本的 iText 是 1.02b 而您是 使用 iText 5.0.1... 您为什么不寻找更新的样本?难怪经过4个主要版本后,它甚至可以调整以轻松编译!
在当前的 iText 版本中,您可以使用 PdfReader
方法 getPageN(final int pageNum)
或 getPageNRelease(final int pageNum)
.
获取给定页面的字典
你不应该期望当前的 PdfReader
方法 getPageResources(final int pageNum)
到 return 给定页面的资源,因为它(就像你的示例代码一样)只查看页面 资源 词典
的词典
您 使用 iText 5.0.1 有什么具体原因吗?那个版本很旧,从那时起应用了许多错误修复和功能。
我正在使用 iText 5.0.1 来处理现有的 PDF。使用 RUPS 分析现有 PDF 时,我可以看到第一页包含 /Resources :
但是,当使用 following example 操作 PDF 时,我得到了 NPE,因为 pageDictionary.get(PdfName.RESOURCES) 是返回空值。
这是调试时我的 pageDictionnary 对象包含的内容:
遗憾的是,由于保密原因,我现在无法 post PDF,但有人知道我为什么会收到此 NPE 吗?或者有人知道如何进一步调查吗? (我远不是 iText 和 PDF 结构方面的专家......并且慢慢失去了想法)
非常感谢!
您使用的示例代码假定 Page object 是 Pages[=60= 指向的字典的直接子项] 目录键:
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,即它的叶子,Page 节点,可能在结构的更深处,根 Pages[=60 的孩子的孩子的孩子=] 词典等
如果您的 PDF 是这种情况,第 1 页(object 3)的 Page 词典是 Pages[ 的孩子=60=] 字典 object 6 又是根 Pages 字典 object 70.
的孩子因此,该代码假定中间 Pages 字典 object 6 已经是 Page object .
但这不是该示例代码的唯一问题。例如。它还假定 Resources 字典附加到 Page object 本身。这不一定是真的,它也可以附加到任何 parent Pages object 包括页面树根:
Resources dictionary (Required; inheritable) A dictionary containing any resources required by the page (see 7.8.3, "Resource Dictionaries"). If the page requires no resources, the value of this entry shall be an empty dictionary. Omitting the entry entirely indicates that the resources shall be inherited from an ancestor node in the page tree.
(Table 30 – Entries in a page object - in ISO 32000-1, the current PDF specification)
因此,您通常使用的示例是无用的,因为它不符合 PDF 规范。
也就是说,您的示例来自 最新版本的 iText 是 1.02b 而您是 使用 iText 5.0.1... 您为什么不寻找更新的样本?难怪经过4个主要版本后,它甚至可以调整以轻松编译!
在当前的 iText 版本中,您可以使用 PdfReader
方法 getPageN(final int pageNum)
或 getPageNRelease(final int pageNum)
.
你不应该期望当前的 PdfReader
方法 getPageResources(final int pageNum)
到 return 给定页面的资源,因为它(就像你的示例代码一样)只查看页面 资源 词典
您 使用 iText 5.0.1 有什么具体原因吗?那个版本很旧,从那时起应用了许多错误修复和功能。