2010-03-31 25 views
5

Estoy usando cuarzo para mostrar contenido en PDF, y necesito crear una tabla de contenidos para navegar a través del pdf. Al leer la documentación de Apple, creo que se supone que debo usar CGPDFDocumentGetCatalog, pero no puedo encontrar ningún ejemplo sobre cómo usar esto en cualquier lugar. ¿Algunas ideas?Crear una tabla de contenido a partir de un archivo pdf

Actualización: Todavía no hemos encontrado una solución para esto. Me solución cansada Alex', pero la salida me sale el siguiente aspecto:

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 

Ni idea todavía cómo convertir esto en una tabla de contenidos utilizable. Idealmente, me gustaría obtener una matriz de objetos NSDictionary con un título y un número de página coincidente.

+0

Ryan, ¿encontró alguna forma de crear TOC a partir de PDF existente? Si es así, por favor guíame. Estoy buscando lo mismo desde hace algunos días. – DivineDesert

+0

¿Has encontrado alguna solución? Si es así, por favor agregue su respuesta aquí. – Hemang

Respuesta

6

Algo como esto podría ayudarle a empezar:

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

¿Dónde se define 'CGPDFDocumentApplyFunction'? –

+1

Lo sentimos, debería ser 'CGPDFDictionaryApplyFunction'. Vea el archivo de encabezado 'CGPDFDictionary.h' en' CoreGraphics.framework'. Gracias por la captura. –

+0

Hola @AlexReynolds, ¿puedes convertir tu respuesta para Swift 3 también? – Hemang

4

Aquí está mi enfoque.
1. Descargar este marco vfr reader
2. El uso de estas líneas de código para obtener todos los capítulos PDF

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

Espero que le ayudará.

+0

Funcionó perfectamente para mí usando vfr reader y este fragmento. Muy útil. – AndyDunn

Cuestiones relacionadas