我一直在阅读 adobe pdf 规范,以及 apple 用于 pdf 渲染和解析的 quartz 2d 文档。我还下载了 Voyeur 并用它检查了本地 pdf 以查看它的内部数据。此时我可以获取文档目录,然后从那里获取大纲字典。我可以看到嵌套在 outlines dictionary 字典中的是名为“/Dest”的节点,其值如下:
G1.1025588 等等
我想知道是否有一种方法可以让我使用这些值来获取对页面的引用,以使用我在 github 项目(例如 Reader)中看到的一些方法以及 apple 记录的示例进行呈现。
PDF 处理绝对是一个挑战,因此我们将不胜感激。
最佳答案
大纲项字典中的/Dest
条目可以是名称、字符串 或数组强>.
最简单的情况是它是一个数组;那么第一项是大纲条目指向的页面对象(字典)。要获取页码,您必须遍历文档中的所有页面并查看哪一个等于 (
==
) 您拥有的字典(CGPDFPageRef
实际上是CGPDFDictionaryRef
)。您还可以遍历页面树,这有点困难,但可能会更快(不像您预期的那样多,我不会在这里过早优化)。数组中的其他项目是页面上的位置等,在 PDF 规范中搜索“显式目标”以了解更多信息。如果条目是名称 或字符串,则它是一个命名目标。您必须将名称映射到文档目录的
/Dests
条目中的目标,该条目是包含名称树的字典。名称树本质上是一个 TreeMap ,它允许快速访问命名值而无需一次读取所有数据(与普通字典一样)。不幸的是,Quartz 中不直接支持名称树,因此您必须做更多的工作才能递归地解析此结构(请参阅 PDF spec 中的“名称树”)。
请注意,大纲项不一定具有 /Dest
条目,它还可以通过 /A
(操作)条目指定其目的地,这是一个稍微复杂一点。然而,在大多数情况下,该操作将是一个“GoTo”操作,它本质上是一个目的地的包装器。
名称到目的地的映射也可以存储为普通字典。在这种情况下,它位于文档目录中/Names 字典的 /Dests
条目中。虽然我很少看到这个,但它在 PDF 1.2(当前是 1.7)之后被弃用了。
您肯定需要 PDF 规范:http://www.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/PDF32000_2008.pdf
关于iphone - 如何在 iOS 上检索 PDF 中 Outline 目标的页码或页面引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4643489/