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

Bob*_*Bob 8 pdf objective-c ipad ios

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

此时我在研究上投入了几个小时,看来由于PDFKit [在iOS中不支持],我唯一的选择是手动解析PDF元数据.

我已经看了几个解决方案,但所有这些解决方案都保持沉默 - 如何将"大纲"元数据中的页面与项目的实际页面编号相关联.我用[偷窥工具]检查了我的PDF文档,我可以看到树中的轮廓.

[这个解决方案]帮我弄清楚如何向下导航Outline/A/S/D树以找到"Dest"对象,但它使用[self.pages indexOfObjectIdenticalTo:destPageDic]执行某种对象比较明白.

我已阅读[adobe的官方PDF规范],"12.3.2.3命名目的地"部分描述了大纲条目指向页面的方式:

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

继续这条线对我来说是完全不可理解的:

此条目的值应为字典,其中每个键是目标名称,相应的值是定义目标的数组,使用表151中显示的语法,或者是具有D条目的字典,其值是这样的数组.

这是指第366页,"12.3.2.2显式目的地",其中表描述页面:"在每种情况下,页面是对页面对象的间接引用"

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

我找到了一个讨论的[threads.apple.com上的线程].[此注释]意味着您可以比较给定页面的CGPDFPageGetDictionary对象的地址(在内存中?),并将其与PDF元数据的"大纲"树中的页面进行比较.

但是,当我在Outline树中查看页面对象的地址并将它们与地址进行比较时,它们永远不会相同.该线程中使用的行"TTDPRINT(@"​​%d =>%p",k + 1,dict);" 打印"dict"作为内存中的指针..没有理由相信那里返回的对象与其他地方返回的对象相同......它们会在内存中的不同位置!

我最后的希望是从苹果的命令行"大纲"工具[在本书中提到](作为[此线程的建议])查看源代码,但我无法在任何地方找到它.

底线 - 是否有人对PDF轮廓如何工作有所了解,或者知道一些读取PDF轮廓的开源代码(最好是Objective-c)?

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

omz*_*omz 3

CGPDFDocumentGetPage 的结果与解析大纲项中的目标时获得的间接页面引用相同。两者本质上都是字典,您可以使用 == 来比较它们。当您想知道 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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