Можно ли получить доступ к PDF-схеме при разработке для iOS - PullRequest
0 голосов
/ 26 августа 2011

, поскольку PDFKit недоступен на iOS, как можно получить схему документа PDF в этой среде?Являются ли коммерческие библиотеки, такие как FastPdfKit или PSPDFKit, единственным решением?

Ответы [ 2 ]

3 голосов
/ 11 марта 2012

Это не слишком сложно, чтобы получить доступ к схеме 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 беспорядок!)

0 голосов
/ 12 июня 2017

Теперь это возможно в iOS 11 +.

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

Вы можете получить PDFOutline PDFDocument. OutlineRoot PDFOutline вернет элементы структуры, если они есть, и NULL, если их нет.

...