2010-03-31 2 views
5

Я использую кварц для отображения pdf-содержимого, и мне нужно создать оглавление для навигации по PDF-файлу. От чтения документации Apple я думаю, что я должен использовать CGPDFDocumentGetCatalog, но я не могу найти примеров того, как это использовать. Есть идеи?Создайте оглавление из pdf-файла

Обновление: Еще не нашли решение для этого. Я решение усталого Алекс», но выход я получаю выглядит следующим образом:

2011-07-27 09:16:19.359 LDS Scriptures App-iPad[624:707] key: Pages 
2011-07-27 09:16:19.361 LDS Scriptures App-iPad[624:707] key: Count 
2011-07-27 09:16:19.362 LDS Scriptures App-iPad[624:707] pdf integer value: 238 
2011-07-27 09:16:19.363 LDS Scriptures App-iPad[624:707] key: Kids 
2011-07-27 09:16:19.366 LDS Scriptures App-iPad[624:707] key: Type 
2011-07-27 09:16:19.368 LDS Scriptures App-iPad[624:707] key: Outlines 
2011-07-27 09:16:19.370 LDS Scriptures App-iPad[624:707] key: Count 
2011-07-27 09:16:19.371 LDS Scriptures App-iPad[624:707] pdf integer value: 7 
2011-07-27 09:16:19.372 LDS Scriptures App-iPad[624:707] key: First 
2011-07-27 09:16:19.374 LDS Scriptures App-iPad[624:707] key: Parent 
2011-07-27 09:16:19.375 LDS Scriptures App-iPad[624:707] key: Count 
2011-07-27 09:16:19.376 LDS Scriptures App-iPad[624:707] pdf integer value: 7 

Не знаю, как превратить это в работоспособное оглавлении. В идеале я хотел бы получить массив из NSDictionary объектов с заголовком и соответствующим номером страницы.

+0

Ryan, вы нашли какой-либо способ создания TOC из существующего PDF? Если да, пожалуйста, помогите мне. Я ищу то же самое с нескольких дней. – DivineDesert

+0

Вы нашли решение? Если да, добавьте здесь свой ответ. – Hemang

ответ

6

Нечто подобное могло бы помочь вам начать работу:

NSURL *documentURL = ...; // URL to file or http resource etc. 
CGPDFDocumentRef pdfDocument = CGPDFDocumentCreateWithURL((CFURLRef)documentURL); 
CGPDFDictionaryRef pdfDocDictionary = CGPDFDocumentGetCatalog(pdfDocument); 
// loop through dictionary... 
CGPDFDictionaryApplyFunction(pdfDocDictionary, ListDictionaryObjects, NULL); 
CGPDFDocumentRelease(pdfDocument); 

... 

void ListDictionaryObjects (const char *key, CGPDFObjectRef object, void *info) { 
    NSLog("key: %s", key); 
    CGPDFObjectType type = CGPDFObjectGetType(object); 
    switch (type) { 
     case kCGPDFObjectTypeDictionary: { 
      CGPDFDictionaryRef objectDictionary; 
      if (CGPDFObjectGetValue(object, kCGPDFObjectTypeDictionary, &objectDictionary)) { 
       CGPDFDictionaryApplyFunction(objectDictionary, ListDictionaryObjects, NULL); 
      } 
     } 
     case kCGPDFObjectTypeInteger: { 
      CGPDFInteger objectInteger; 
      if (CGPDFObjectGetValue(object, kCGPDFObjectTypeInteger, &objectInteger)) { 
       NSLog("pdf integer value: %ld", (long int)objectInteger); 
      } 
     } 
     // test other object type cases here 
     // cf. http://developer.apple.com/mac/library/documentation/GraphicsImaging/Reference/CGPDFObject/Reference/reference.html#//apple_ref/doc/uid/TP30001117-CH3g-SW1 
    }  
} 
+0

Где находится 'CGPDFDocumentApplyFunction'? –

+1

Извините, это должно быть 'CGPDFDictionaryApplyFunction'. См. Заголовочный файл 'CGPDFDictionary.h' в' CoreGraphics.framework'. Спасибо за уловку. –

+0

Привет @AlexReynolds, можете ли вы преобразовать свой ответ для Swift 3? – Hemang

4

Вот мой подход.
1. Скачать рамки vfr reader
2. Используйте эти строки коды, чтобы получить весь PDF главу

NSString *path = [[NSBundle mainBundle] pathForResource:@"Reader" ofType:@"pdf"]; 
NSURL *targetURL = [NSURL fileURLWithPath:path]; 
NSArray *arr = [ReaderDocumentOutline outlineFromFileURL:targetURL password:@""]; 

Надеется, что это поможет.

+0

Работала отлично для меня, используя vfr reader и этот фрагмент. Очень полезно. – AndyDunn