PDF目录使用iOS Quartz 2D进行解析

时间:2010-12-21 00:50:40

标签: iphone cocoa-touch pdf ios

我知道之前已经问过这个问题了。但是,没有人回答得很好。我想知道如何在iPhone上解析PDF的“目录”。文档告诉我使用CGPDFDocumentGetCatalog而不是如何使用它。他们所说的只是它返回一本字典。另外,我找不到任何示例代码。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

在SO上看起来最接近的是Create a table of contents from a pdf file

答案 1 :(得分:0)

它基本上只是在CGPDFPage中解析名为“Outline”的CGPDFDictionary。

    // get outline & loop through dictionary...
    CGPDFDictionaryRef outlineRef;
    if(CGPDFDictionaryGetDictionary(pdfDocDictionary, "Outlines", &outlineRef)) {
    }

然后你从第一个元素开始并解析你的方式。

    CGPDFDictionaryGetDictionary(outlineRef, "First", &firstEntry)

您想获得标题和目的地。

   NSString *outlineTitle = PSPDFStringFromPDFDict(outlineElementRef, @"Title");
   CGPDFDictionaryGetObject(outlineElementRef, "Dest", &destinationRef)

棘手的事情始于获取正确的目的地,因为有(horray,PDF!)几种方式来存储它,以及几种未在PDF参考中定义但仍然在野外的方式。还有几个刚刚破解的变种,你必须处理它。

例如,您可以使用

获取大纲词典的Count
CGPDFInteger elements;
if(CGPDFDictionaryGetInteger(outlineRef, "Count", &elements)) {
    PSPDFLog(@"parsing outline: %ld elements. (Count will be ignored anyway)", (long int)elements);
}else {
    PSPDFLogError(@"Error while parsing outline. No outlineRef?");
}

但请注意,由于PDF创建工具损坏,Count有时无效。请将PDF视为HTML。即使它被破坏,解析器也会尽力显示尽可能多的数据。所以我的建议是忽略Count并解析字典。 (几周前我遇到了一个计数= -10的文件。去图)

我无法发布完整的代码,因为它来自我的商业PDF库PSPDFKit,我需要以它为生;)但这应该让你开始。