2009-08-26 6 views
10

J'écris une application en objectif-c (en utilisant du cacao). J'ai un modèle PDF, j'ai besoin de remplacer les valeurs réelles dans des espaces réservés en PDF, puis enregistrer le résultat dans un nouveau PDF.comment éditer un PDF dans le objective-c?

comment puis-je le faire? quelle bibliothèque dois-je utiliser?

Répondre

23

J'ai trouvé la solution! Il relie la puissance de quartz2d et la simplicité d'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

Je t'aime tellement! – Seb

5

Probablement PDFKit. Pour certaines tâches, l'API PDFKit de haut niveau ne peut pas faire ce que vous voulez, et vous pourriez être forcé d'utiliser le niveau bas CG PDF parsing libraries. Ils sont assez bas, cependant. Ils signifient vraiment comprendre le format de fichier PDF.

0

Je sais que la question est sur obj-c, mais si vous êtes ici à cause de la modifier pdf, ci-dessous il y a une solution dans Swift 3:

PS: Dans mon J'ai eu besoin de la solution pour éditer les informations de document du nouveau PDF, donc j'ai utilisé le paramètre sujet pour ce faire.

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() 
} 
Questions connexes