objective-c - iOS(iPad)如何获取PDF目录(outline)数据?

标签 objective-c ipad pdf ios

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

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

我看过几种解决方案,但所有解决方案都在一点上保持沉默——如何将“大纲”元数据中的页面与项目的实际页码相关联。我已经使用 [窥视工具] 检查了我的 PDF 文档,我可以在树中看到轮廓。

[This solution] 帮助我弄清楚如何向下导航 Outline/A/S/D 树以找到“Dest”对象,但它使用 [self.pages indexOfObjectIdenticalTo:destPageDic] 执行某种对象比较我不明白。

我已阅读[来自 adobe 的官方 PDF 规范],“12.3.2.3 命名目标”部分描述了大纲条目可以指向页面的方式:

Instead of being defined directly with the explicit syntax shown in Table 151, a destination may be referred to indirectly by means of a name object (PDF 1.1) or a byte string (PDF 1.2).

然后继续我完全无法理解的这一行:

The value of this entry shall be a dictionary in which each key is a destination name and the corresponding value is either an array defining the destination, using the syntax shown in Table 151, or a dictionary with a D entry whose value is such an array.

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

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

我找到了一个讨论的 [lists.apple.com 上的线程]。 [此评论] 暗示您可以比较给定页面的 CGPDFPageGetDictionary 对象的地址(在内存中?),并将其与 PDF 元数据的“大纲”树中的页面进行比较。

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

我最后的希望是查看 apple 的命令行“大纲”工具的源代码 [本书中提到](如 [本主题所建议]),但我无法在任何地方找到它。

底线 - 是否有人了解 PDF 大纲的工作原理,或者知道一些读取 PDF 大纲的开源代码(最好是 objective-c)?

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

最佳答案

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

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

关于objective-c - iOS(iPad)如何获取PDF目录(outline)数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4423249/

相关文章:

javascript - JsPDF 未打印 ScrollView 中的所有内容

javascript - 使用 jsPDF && jsPDF AutoTable 仅将特定的 HTML 表格列转换为 PDF

ios - 加载 UIView 时 exc_bad_access code=1

iphone - iOS - 在数组中查找复杂对象

iPhone - 为 NSSortDescriptor 创建定义...这可能吗?

iphone - 我如何以编程方式通过点击图像进行转义?

php - Apple Mail 不显示使用 Zend_Mail 发送的 PDF

iphone - UIImagePickerController 奇怪的效果

ios - UIAlertView clickedButtonAtIndex 方法未被调用

ios - 沿路径的 SceneKit 动画节点