2010-12-21 193 views
0

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

回答

0

它基本上只是解析CGPDFDictionary堪称CGPDFPage“纲要”。

// 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参考野生定义,但还在外面(horray,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创建工具。将PDF看作HTML。即使它被破坏了,解析器也会尽其所能地显示尽可能多的数据。所以我的建议是无视Count和解析字典。 (几个星期前,我遇到了一个Count = -10的文档)Go To Figure

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

+0

负值计数值表示轮廓在查看器中折叠显示。正值计数值表示轮廓在查看器中展开显示。 – iPDFdev 2012-07-16 14:06:09

+0

该死的,谢谢你!你永远不会停止学习PDF相关的东西。虽然这似乎很模糊。 (为什么不为这个额外的属性?)谢谢! – steipete 2012-07-16 14:28:47