iphone - 如何在 iOS 上检索 PDF 中 Outline 目标的页码或页面引用?

标签 iphone objective-c pdf ios

我一直在阅读 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/

相关文章:

objective-c - iOS:AutoresizingMask 使用数组?

ios - 标准显示转场动画

pdf - 纯 javascript 中的 Apache FOP 替代方案

c# - 如何在 C# 中引用 Ghostscript DLL

c# - 如何定位 PDF 中的字符串?

iphone - UITextView 和 UIPickerView 都有自己的 UIToolbar

iOS:仅当 APP 处于事件状态时重复任务(无后台)

ios - #define vs self.method检查分配

iphone - 防止缩放时覆盖消失 - MKMapView 和 MKOverlay

iphone - iOS UIImageView vs drawRect 图像拉伸(stretch)