2009-08-26 15 views
10

Estoy escribiendo una aplicación en Objectivo-c (usando cacao). Tengo una plantilla en PDF, necesito sustituir los valores reales en marcadores de posición en PDF y luego guardar el resultado en un nuevo PDF.cómo editar un PDF en Object-C?

¿cómo puedo hacerlo? ¿Qué biblioteca debo usar?

Respuesta

23

¡He encontrado la solución! Conecta el poder de quartz2d y la simplicidad de UIGraphics.

NSString *newFilePath = @"path/to/your/newfile.pdf"; 
NSString *templatePath = @"path/to/your/template.pdf"; 

//create empty pdf file; 
UIGraphicsBeginPDFContextToFile(newFilePath, CGRectMake(0, 0, 792, 612), nil); 

CFURLRef url = CFURLCreateWithFileSystemPath (NULL, (CFStringRef)templatePath, kCFURLPOSIXPathStyle, 0); 

//open template file 
CGPDFDocumentRef templateDocument = CGPDFDocumentCreateWithURL(url); 
CFRelease(url); 

//get amount of pages in template 
size_t count = CGPDFDocumentGetNumberOfPages(templateDocument); 

//for each page in template 
for (size_t pageNumber = 1; pageNumber <= count; pageNumber++) { 
    //get bounds of template page 
    CGPDFPageRef templatePage = CGPDFDocumentGetPage(templateDocument, pageNumber); 
    CGRect templatePageBounds = CGPDFPageGetBoxRect(templatePage, kCGPDFCropBox); 

    //create empty page with corresponding bounds in new document 
    UIGraphicsBeginPDFPageWithInfo(templatePageBounds, nil); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    //flip context due to different origins 
    CGContextTranslateCTM(context, 0.0, templatePageBounds.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    //copy content of template page on the corresponding page in new file 
    CGContextDrawPDFPage(context, templatePage); 

    //flip context back 
    CGContextTranslateCTM(context, 0.0, templatePageBounds.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    /* Here you can do any drawings */ 
    [@"Test" drawAtPoint:CGPointMake(200, 300) withFont:[UIFont systemFontOfSize:20]]; 
} 
CGPDFDocumentRelease(templateDocument); 
UIGraphicsEndPDFContext(); 
+3

¡Te amo tanto! – Seb

5

Probablemente PDFKit. Para algunas tareas, la API PDFKit de alto nivel no puede hacer lo que usted desea, y es posible que se vea forzado a utilizar el bajo nivel CG PDF parsing libraries. Sin embargo, tienen un nivel bastante bajo. Significan realmente entender el formato de archivo PDF.

0

sé que la pregunta es sobre obj-c, pero si usted está aquí debido a la editar pdf, a continuación hay una solución en Swift 3:

PD: En mi solución que necesitaba para editar la información del documento del nuevo PDF, así que usé el tema parámetro para hacer esto.

func createPDF(on path: String?, from templateURL: URL?, with subject: String?) { 
    guard let newPDFPath = path, 
     let pdfURL = templateURL else { return } 

    let options = [(kCGPDFContextSubject as String): subject ?? ""] as CFDictionary 

    UIGraphicsBeginPDFContextToFile(newPDFPath, .zero, options as? [AnyHashable : Any]) 

    let templateDocument = CGPDFDocument(pdfURL as CFURL) 
    let pageCount = templateDocument?.numberOfPages ?? 0 

    for i in 1...pageCount { 

     //get bounds of template page 
     if let templatePage = templateDocument?.page(at: i) { 
      let templatePageBounds = templatePage.getBoxRect(.cropBox) 

      //create empty page with corresponding bounds in new document 
      UIGraphicsBeginPDFPageWithInfo(templatePageBounds, nil) 
      let context = UIGraphicsGetCurrentContext() 

      //flip context due to different origins 
      context?.translateBy(x: 0.0, y: templatePageBounds.height) 
      context?.scaleBy(x: 1.0, y: -1.0) 

      //copy content of template page on the corresponding page in new file 
      context?.drawPDFPage(templatePage) 

      //flip context back 
      context?.translateBy(x: 0.0, y: templatePageBounds.height) 
      context?.scaleBy(x: 1.0, y: -1.0) 
     } 
    } 
    UIGraphicsEndPDFContext() 
} 
Cuestiones relacionadas