0

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

4

2 回答 2

3

访问 pdf 大纲并不难。我的大纲解析器有大约 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 文档中都有命名目的地,需要额外的步骤来解决。我将它们保存在一个数组中并稍后解决它们。

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

于 2012-03-11T06:11:27.853 回答
0

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

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

您可以获得 PDFDocument 的 PDFOutline。PDFOutline 的 outlineRoot 将返回大纲项(如果有),如果没有则返回 NULL。

于 2017-06-11T21:36:45.650 回答