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