2012-01-21 7 views
3

J'essaie de modifier les métadonnées PDF (titre, auteur, etc.) d'un PDF existant sur iOS. Bien qu'il soit facile de trouver un exemple de code pour l'analyse PDF et pour la création de PDF à partir de zéro, il ne semble pas y avoir un moyen facile de vider un fichier PDF existant dans un nouveau fichier.Comment lire, modifier, écrire un PDF (CGPDFDocument) sur iOS?

Plus précisément, comment puis-je obtenir l'information obtenue lors de la lecture d'un fichier PDF à peu près comme ceci:

CGPDFDocumentRef myPDF = CGPDFDocumentCreateWithURL((CFURLRef)urlOfInputPDF); 
CGPDFDictionaryRef myPDFDict=CGPDFDocumentGetInfo(myPDF); 

dans le nouveau PDF, que je créerais à peu près ainsi:

CGRect pageRect; 
CFMutableDictionaryRef myDictionary = CFDictionaryCreateMutable(NULL, 0, 
             &kCFTypeDictionaryKeyCallBacks, 
             &kCFTypeDictionaryValueCallBacks); 
CFDictionarySetValue(myDictionary, kCGPDFContextTitle, CFSTR("My PDF File")); 
CFDictionarySetValue(myDictionary, kCGPDFContextCreator, CFSTR("My Name")); 
pdfContext = CGPDFContextCreateWithURL (urlOfOutputPDF, &pageRect, myDictionary); 

Il est évident que , les types de dictionnaire ne correspondent pas, et la sortie créée de cette manière est liée à la page (pas au document).

Des idées, comment je peux copier l'ensemble CGPDFDocumentRef dans un nouveau fichier? Et comment le rendre modifiable, afin que je puisse modifier les méta-données avant de les sauvegarder?

Répondre

-1

Je ne connais pas un moyen avec CoreGraphics de parcourir chaque page et de les imprimer dans le nouveau document. Au moins, c'est ce que je fais dans PSPDFKit. Et re-rendre un document entier est assez lent pour les documents plus volumineux. Vous perdez également des métadonnées quand vous allez de cette façon - peut-être une manipulation beaucoup plus directe du PDF est un meilleur moyen - mais notez que vous devez mettre à jour la bande-annonce xref dans le PDF si vous éditez directement des chaînes, puisque le trailer est une carte de byte-coordonnées qui va changer une fois que vous ajoutez/supprimez des caractères.

0

N'utilisez pas CGPDFDocument (Core Graphics); utilisez plutôt PDFDocument (PDFKit). Cela fournit des méthodes beaucoup plus faciles pour ce genre de chose.

La méthode writeToFile:withOptions vous permet d'enregistrer le fichier PDF dans un nouveau fichier, en spécifiant les données DOCINFO dans un dictionnaire.