2011-08-26 62 views

回答

3

访问pdf轮廓不是太棘手。我的outline parser有大约420 LOC。我会张贴一些片段,这样你就会明白。我不能发布完整的代码,因为它是一个商业库。

基本上,你这样开始:

CGPDFDictionaryRef outlineRef; 
if(CGPDFDictionaryGetDictionary(pdfDocDictionary, "Outlines", &outlineRef)) { 

下降到

NSArray *outlineElements = nil; 
CGPDFDictionaryRef firstEntry; 
if (CGPDFDictionaryGetDictionary(outlineRef, "First", &firstEntry)) { 
    NSMutableArray *pageCache = [NSMutableArray arrayWithCapacity:CGPDFDocumentGetNumberOfPages(documentRef)]; 
    outlineElements = [self parseOutlineElements:firstEntry level:0 error:&error documentRef:documentRef cache:pageCache]; 
}else { 
    PSPDFLogWarning(@"Error while parsing outline. First entry not found!"); 
} 

你解析单个项目是这样的:

// parse title 
NSString *outlineTitle = stringFromCGPDFDictionary(outlineElementRef, @"Title"); 
PSPDFLogVerbose(@"outline title: %@", outlineTitle); 
if (!outlineTitle) { 
    if (error_) { 
     *error_ = [NSError errorWithDomain:kPSPDFOutlineParserErrorDomain code:1 userInfo:nil]; 
    } 
    return nil; 
} 

NSString *namedDestination = nil; 
CGPDFObjectRef destinationRef; 
if (CGPDFDictionaryGetObject(outlineElementRef, "Dest", &destinationRef)) { 
    CGPDFObjectType destinationType = CGPDFObjectGetType(destinationRef); 

最讨厌的事情是,你必须Named Destinations在大多数pdf文档中,需要额外的步骤来解决。我将它们保存在一个数组中,稍后解决。

“正确地对待”花了很长时间,因为PDF中存在大量差异,即使您按照PDF参考实现了所有内容,但某些文件在您应用之后才会生效进一步调整。 (PDF是一团糟!)