iText:无法从页面

时间:2015-07-08 09:23:32

标签: java pdf nullpointerexception itext pdf-manipulation

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

enter image description here

然而,当使用following example操作PDF时,我得到一个NPE,因为 pageDictionary.get(PdfName.RESOURCES)返回null。

以下是我的 pageDictionnary 对象在调试时包含的内容:

enter image description here

不幸的是,由于机密性,我现在无法发布PDF,但有没有人知道为什么我会收到这个NPE?或者有人知道如何进一步调查? (我远没有成为iText和PDF结构的专家......而且慢慢失去理念)

非常感谢!

1 个答案:

答案 0 :(得分:4)

您使用的示例代码假定页面对象是页面目录键指向的词典的直接孩子:

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是这种情况,第1页(对象3)的页面字典是页面字典对象6的孩子,而该对象又是孩子根字典对象70。

因此,该代码假定中间 Pages 字典对象6已经是 Page 对象。

但这不是该示例代码的唯一问题。例如。它还假定资源字典附加到页面对象本身。这不一定是真的,它也可以附加到任何父 Pages 对象,包括页面树根:

  

资源字典(必需;可继承)包含页面所需资源的字典(参见7.8.3,"资源字典")。如果页面不需要资源,则此条目的值应为空字典。 完全省略该条目表示资源应从页面树中的祖先节点继承。

     

(表30 - 页面对象中的条目 - 在ISO 32000-1中,当前的PDF规范)

因此,您使用的样本通常没用,因为它不符合PDF规范。

话虽如此,您的样本是从最新版本的iText 1.02b 开始,而您使用iText 5.0.1 ...为什么你不寻找更新的样品?令人惊奇的是,在4个主要版本之后,它甚至可以进行调整以便轻松编译!

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

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

的字典

您有使用iText 5.0.1 的具体原因吗?该版本相当陈旧,从那时起就应用了许多错误修复和功能。