【问题标题】:How to obtain PDF table of contents (outline) data in iOS (iPad)?如何在iOS(iPad)中获取PDF目录(大纲)数据?
【发布时间】: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


    【解决方案1】:

    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;
      }
    }
    

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

    【讨论】:

    • 这是一个很好的答案。您最终的目标应该是创建一个包含标题-> 页码的键/值对的 nsdictionary。这将构成 TOC。
    • 其实outlinePageRef不能直接和CGPDFPageRef比较,但是可以和CGPDFPageGetDictionary(page)比较。
    猜你喜欢
    • 1970-01-01
    • 2015-03-21
    • 2011-03-04
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2021-09-25
    • 2021-05-09
    • 1970-01-01
    相关资源
    最近更新 更多