2010-09-23 2 views
3

Я пытаюсь нарисовать pdf-страницу в контексте pdf, а затем сохранить ее на диск. Я не могу понять, что не так. Может кто-нибудь дать мне несколько указателей. Благодарю.Сохранение PDF-документа на диск с использованием 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

Так что же не работает? Разве это не компиляция? Вы получаете ошибки или предупреждения при создании? Выводится ли ваше сообщение в журнале? – Abizern

+0

Я не получаю никаких предупреждений или ошибок при выполнении кода. Я знаю, что что-то не так, потому что файл PDF не открывается. – David

ответ

12

Так что я нашел 3 вещи не так.

  1. PDF страницы начинаются с 1, а не 0.
  2. Нужно сказать контекст Pdf, когда страница начинается и заканчивается.
  3. Освободите контекст pdf перед записью данных на диск. По какой-то причине это ключ.

Вот исправленный код, который работает.

- (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); 
}