如何获取iOS(iPad)中的PDF目录(大纲)数据?

我正在构build一个显示PDF的iPad应用程序,我希望能够显示目录并让用户导航到相关页面。

我已经投入了几个小时的研究在这一点上,看起来PDFKit [iOS不支持],我唯一的select是手动parsingPDF元数据。

我已经看了几个解决scheme,但是他们都没有提到一点 – 如何将“大纲”元数据中的一个页面与该项目的实际页码进行关联。 我用[偷窥工具]检查了我的PDF文件,我可以在树上看到轮廓。

[这个解决scheme]帮助我找出如何浏览Outline / A / S / D树来find“Dest”对象,但它使用[self.pages indexOfObjectIdenticalTo:destPageDic]执行某种对象比较,不明白

我已阅读[Adobe官方PDF规范],并且“12.3.2.3命名的目的地”一节描述了大纲条目可以指向页面的方式:

可以通过名称对象(PDF 1.1)或字节string(PDF 1.2)间接引用目标,而不是直接使用表151中显示的显式语法来定义目标。

并继续我完全无法理解的这条线:

这个条目的值应该是一个字典,其中每个键是一个目的地名称,相应的值是一个定义目的地的数组,使用表151中所示的语法,或者一个带有D条目的字典,其值是一个数组。

这指的是页面366,“12.3.2.2显式目的地”,其中一个表格描述了一个页面:“在每种情况下,页面是对页面对象的间接引用”

那么CGPDFDocumentGetPage或CGPDFPageGetDictionary的结果是“页面对象的间接引用”?

我发现一个[lists.apple.com上的线程]讨论。 [此评论]意味着您可以比较给定页面的CGPDFPageGetDictionary对象的地址(内存中?),并将其与PDF元数据的“Outline”树中的页面进行比较。

但是,当我查看“大纲”树中页面对象的地址并将它们与地址进行比较时,它们绝不会相同。 在该线程中使用的行“TTDPRINT(@”​​%d =>%p“,k + 1,dict);” 打印“字典”作为内存中的指针..没有理由相信,返回的对象将会返回到其他地方一样..他们会在不同的地方在内存!

我最后的希望是从苹果的命令行“outline”工具(在本书中提到)(如本文提出的)中查看源代码,但是我找不到任何地方。

底线 – 是否有人对PDF概述如何工作有所了解,或者了解一些读取PDF概述的开源代码(最好是objective-c)?

ARGG:我在这里发布了各种链接,但显然一个新用户一次只能发布一个链接

CGPDFDocumentGetPage的结果与在大纲项目中parsing目标时获得的间接页面引用相同。 两者本质上都是字典,你可以使用==比较它们。 当你有一个CGPDFDictionaryRef,你想知道的页码,你可以做这样的事情:

CGPDFDocumentRef doc = ...; CGPDFDictionaryRef outlinePageRef = ...; for (int p=1; p<=CGPDFDocumentGetNumberOfPages(doc); p++) { CGPDFPageRef page = CGPDFDocumentGetPage(doc, p); if (page == outlinePageRef) { printf("found the page number: %i", p); break; } } 

然而,显式的目标不是页面,而是第一个元素是页面的数组。 其他元素是页面上的滚动位置等。