2010-09-23 7 views
3

Je suis en train de dessiner une page pdf sur un contexte pdf puis enregistrez-le sur le disque. Je n'arrive pas à comprendre ce qui ne va pas. Quelqu'un peut-il me donner quelques conseils. Merci.Enregistrement d'un document PDF sur le disque en utilisant Quartz

- (void)testQuartz:(NSData *)pdfDocumentData 
{ 
    //Create the pdf document reference 
    CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((CFDataRef)pdfDocumentData); 
    CGPDFDocumentRef document = CGPDFDocumentCreateWithProvider(dataProvider); 
    CGDataProviderRelease(dataProvider); //Release the data provider 

    //Create the pdf context 
    CGPDFPageRef page = CGPDFDocumentGetPage(document, 0); 
    CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox); 
    CFMutableDataRef mutableData = CFDataCreateMutable(NULL, 0); 

    CGDataConsumerRef dataConsumer = CGDataConsumerCreateWithCFData(mutableData); 
    CGContextRef pdfContext = CGPDFContextCreate(dataConsumer, &pageRect, NULL); 

    if (CGPDFDocumentGetNumberOfPages(document) > 0) 
    {  
     //Draw the page onto the new context 
     page = CGPDFDocumentGetPage(document, 0); 
     CGContextDrawPDFPage(pdfContext, page); 
    } 
    else 
    { 
     NSLog(@"Failed to create the document"); 
    } 

    //Write to disk 
    [(NSMutableData *)mutableData writeToFile:@"/Users/David/Desktop/test.pdf" atomically:YES]; 

    //Clean up 
    CGDataConsumerRelease(dataConsumer); 
    CFRelease(mutableData); 
    CGPDFDocumentRelease(document); 
} 
+0

Alors qu'est-ce qui ne fonctionne pas? Est-ce que ça ne compile pas? Recevez-vous des erreurs ou des avertissements lors de la construction? Votre message de journal est-il en sortie? – Abizern

+0

Je n'obtiens aucun avertissement ou erreur lorsque le code est exécuté. Je sais que quelque chose ne va pas parce que le fichier pdf ne s'ouvrira pas. – David

Répondre

12

J'ai donc trouvé 3 choses qui ne vont pas avec.

  1. pages PDF à partir de 1 et de 0.
  2. besoin de dire le contexte pdf lorsqu'une page commence et se termine.
  3. La version pdf du contexte avant l'écriture des données sur le disque. C'est la clé pour une raison quelconque.

Voici le code corrigé qui fonctionne.

- (void)testQuartz:(NSData *)pdfDocumentData 
{  
    //Create the pdf document reference 
    CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((CFDataRef)pdfDocumentData); 
    CGPDFDocumentRef document = CGPDFDocumentCreateWithProvider(dataProvider); 

    //Create the pdf context 
    CGPDFPageRef page = CGPDFDocumentGetPage(document, 1); //Pages are numbered starting at 1 
    CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox); 
    CFMutableDataRef mutableData = CFDataCreateMutable(NULL, 0); 

    //NSLog(@"w:%2.2f, h:%2.2f",pageRect.size.width, pageRect.size.height); 
    CGDataConsumerRef dataConsumer = CGDataConsumerCreateWithCFData(mutableData); 
    CGContextRef pdfContext = CGPDFContextCreate(dataConsumer, &pageRect, NULL); 


    if (CGPDFDocumentGetNumberOfPages(document) > 0) 
    {  
     //Draw the page onto the new context 
     //page = CGPDFDocumentGetPage(document, 1); //Pages are numbered starting at 1 

     CGPDFContextBeginPage(pdfContext, NULL); 
     CGContextDrawPDFPage(pdfContext, page); 
     CGPDFContextEndPage(pdfContext); 
    } 
    else 
    { 
     NSLog(@"Failed to create the document"); 
    } 

    CGContextRelease(pdfContext); //Release before writing data to disk. 

    //Write to disk 
    [(NSData *)mutableData writeToFile:@"/Users/David/Desktop/test.pdf" atomically:YES]; 

    //Clean up 
    CGDataProviderRelease(dataProvider); //Release the data provider 
    CGDataConsumerRelease(dataConsumer); 
    CGPDFDocumentRelease(document); 
    CFRelease(mutableData); 
} 
Questions connexes