【发布时间】:2011-05-28 13:56:54
【问题描述】:
这个问题以前有人问过,我知道。但是,没有人回答得很好。我想知道如何在 iPhone 上解析 PDF 的“目录”。文档告诉我使用 CGPDFDocumentGetCatalog 但不告诉我如何使用它。他们只说它返回一个字典。另外,我找不到任何示例代码。有什么建议吗?
【问题讨论】:
标签: iphone cocoa-touch pdf ios
这个问题以前有人问过,我知道。但是,没有人回答得很好。我想知道如何在 iPhone 上解析 PDF 的“目录”。文档告诉我使用 CGPDFDocumentGetCatalog 但不告诉我如何使用它。他们只说它返回一个字典。另外,我找不到任何示例代码。有什么建议吗?
【问题讨论】:
标签: iphone cocoa-touch pdf ios
它基本上只是解析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)
棘手的事情从获得正确的目的地开始,因为有(好啊,PDF!)几种存储它的方法,还有几种在 PDF 参考中未定义但仍然存在的方法。加上几个刚刚损坏的变体,您必须处理它。
例如,您可以使用
获取大纲字典的计数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 并解析字典。 (几周前我遇到了一个 Count = -10 的文档。看图)
我不能发布完整的代码,因为它来自我的商业 PDF 库 PSPDFKit,我需要靠它谋生;)但这应该让你开始。
【讨论】:
看起来在 SO 上最接近的东西是 Create a table of contents from a pdf file
【讨论】: