2010-03-31 5 views
5

Ich verwende Quarz zum Anzeigen von PDF-Inhalten, und ich muss ein Inhaltsverzeichnis erstellen, um durch die PDF zu navigieren. Wenn ich die Dokumentation von Apple gelesen habe, denke ich, dass ich CGPDFDocumentGetCatalog verwenden soll, aber ich kann keine Beispiele finden, wie ich das überall verwenden kann. Irgendwelche Ideen?Erstellen Sie ein Inhaltsverzeichnis aus einer PDF-Datei

Update: Habe noch keine Lösung dafür gefunden. Ich müde Alex‘Lösung, aber der Ausgang I sieht bekommen wie folgt aus:

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 

noch keine Ahnung, wie das Inhaltsverzeichnis in eine nutzbare Tabelle zu drehen. Idealerweise würde ich gerne zu einem Array von NSDictionary Objekten mit einem Titel und einer passenden Seitennummer kommen.

+0

Ryan, haben Sie eine Möglichkeit gefunden, TOC aus vorhandenen PDFs zu erstellen? Wenn ja, bitte führe mich. Ich suche seit einigen Tagen nach demselben. – DivineDesert

+0

Haben Sie eine Lösung gefunden? Wenn ja, bitte fügen Sie hier Ihre Antwort hinzu. – Hemang

Antwort

6

So etwas könnte Ihnen den Einstieg:

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

Wo ist 'CGPDFDocumentApplyFunction' definiert? –

+1

Entschuldigung, das sollte 'CGPDFDictionaryApplyFunction' sein. Siehe die Header-Datei 'CGPDFDictionary.h' in' CoreGraphics.framework'. Danke für den Fang. –

+0

Hallo @AlexReynolds, kannst du deine Antwort für Swift 3 auch konvertieren? – Hemang

4

Hier ist mein Ansatz.
1. Download dieser Rahmen vfr reader
2. Verwenden Sie diese Codezeilen alle PDF Kapitel

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

zu bekommen Hoffe, dass es Ihnen helfen.

+0

Arbeitete perfekt für mich mit VFR-Leser und dieses Snippet. Sehr hilfreich. – AndyDunn