是否可以在开发iOS时访问pdf大纲

时间:2011-08-26 10:47:32

标签: ios pdf pdfkit outline

由于iOS上没有PDFKit,如何在该环境中获取pdf文档的大纲?像FastPdfKit或PSPDFKit这样的商业图书馆是唯一的解决方案吗?

2 个答案:

答案 0 :(得分: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);

最令人烦恼的是,大多数pdf文档中都有Named Destinations,需要额外的步骤才能解决。我将它们保存在一个数组中,然后再解决它们。

“正确”需要花费很长时间,因为PDF中存在很多差异,即使您按照PDF参考实现所有内容,在您进一步应用之前,某些文件也无法正常工作调整。 (PDF是一团糟!)

答案 1 :(得分:0)

现在可以在iOS 11 +中使用。

https://developer.apple.com/documentation/pdfkit

您可以获取PDF文档的PDFOutline。 如果有的话,PDFOutline的outlineRoot将返回大纲项,如果没有,则返回NULL。