【发布时间】:2010-12-12 18:31:48
【问题描述】:
我正在构建一个显示 PDF 的 iPad 应用程序,我希望能够显示目录并让用户导航到相关页面。
此时我已经投入了几个小时的研究,看来由于 PDFKit [iOS 不支持],我唯一的选择是手动解析 PDF 元数据。
我查看了几种解决方案,但它们都没有提到一点——如何将“大纲”元数据中的页面与项目的实际页码相关联。我使用 [Voyeur 工具] 检查了我的 PDF 文档,我可以在树中看到大纲。
[此解决方案] 帮助我弄清楚如何向下导航 Outline/A/S/D 树以找到“Dest”对象,但它使用 [self.pages indexOfObjectIdenticalTo:destPageDic] 执行某种对象比较我不明白。
我已阅读 [来自 adobe 的官方 PDF 规范],“12.3.2.3 命名目标”部分描述了大纲条目可以指向页面的方式:
而不是直接用 表中显示的显式语法 151,可以参考目的地 通过名称对象间接地 (PDF 1.1) 或字节串 (PDF 1.2)。
然后继续我完全无法理解的这句话:
此条目的值应为 每个键都是一个字典 目的地名称和相应的 value 是一个数组,定义 目的地,使用如下所示的语法 表 151,或带有 D 的字典 其值为此类数组的条目。
这指的是第 366 页,“12.3.2.2 显式目标”,其中表格描述了一个页面:“在每种情况下,页面都是对页面对象的间接引用”
那么 CGPDFDocumentGetPage 或 CGPDFPageGetDictionary 的结果是“对页面对象的间接引用”吗?
我发现了一个讨论的 [lists.apple.com 上的线程]。 [此评论] 意味着您可以比较给定页面的 CGPDFPageGetDictionary 对象的地址(在内存中?),并将其与 PDF 元数据的“大纲”树中的页面进行比较。
但是,当我查看大纲树中页面对象的地址并将它们与地址进行比较时,它们永远不会相同。该线程中使用的行 "TTDPRINT(@"%d => %p", k+1, dict);"正在将“dict”打印为内存中的指针。没有理由相信返回的对象与返回其他地方的对象相同。它们会在内存中的不同位置!
我最后的希望是查看苹果命令行“outline”工具的源代码[本书中提到](如[此线程建议的]),但我在任何地方都找不到。
底线 - 是否有人对 PDF 大纲的工作原理有所了解,或者知道一些读取 PDF 大纲的开源代码(最好是 Objective-c)?
ARGG:我在这里发布了各种链接,但显然新用户一次只能发布一个链接
【问题讨论】:
标签: objective-c ipad pdf ios