J'écris une application dans Objective-C (à l'aide de cacao). J'ai un modèle PDF, j'ai besoin de substituer des valeurs réelles en espaces réservés en PDF, puis de sauvegarder le résultat en nouveau PDF. P>
Comment puis-je le faire? quelle bibliothèque dois-je utiliser? P>
3 Réponses :
probablement PDFKit . Pour certaines tâches, l'API PDFKit de haut niveau ne peut pas faire ce que vous voulez, et vous pourriez être obligé d'utiliser le niveau bas CG PDF Analyse de bibliothèques . Ils sont assez bas niveau, cependant. Ils signifient vraiment comprendre le format de fichier PDF. p>
J'ai trouvé la solution! Il relie la puissance de quartz2d et de simplicité d'uigraphique.
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();
Je sais que la question concerne obj-C, mais si vous êtes ici à cause du pdf Edit PDF fort>, ci-dessous il y a une solution dans Swift 3 forte>: PS: Dans ma solution, je devais éditer les informations du document du nouveau PDF, j'ai donc utilisé le paramètre Sujet strong> pour le faire. P> 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()
}