使用Quartz将PDF文档保存到磁盘 [英] Saving a PDF document to disk using Quartz

查看:186
本文介绍了使用Quartz将PDF文档保存到磁盘的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图绘制一个pdf页面到pdf上下文,然后保存到磁盘。我似乎不知道什么是错的。有人可以给我一些指针。感谢。

   - (void)testQuartz:(NSData *)pdfDocumentData 
{
//创建pdf文档参考
CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((CFDataRef)pdfDocumentData);
CGPDFDocumentRef document = CGPDFDocumentCreateWithProvider(dataProvider);
CGDataProviderRelease(dataProvider); //释放数据提供者

//创建pdf上下文
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)
{
//将页面绘制到新上下文
page = CGPDFDocumentGetPage(document,0);
CGContextDrawPDFPage(pdfContext,page);
}
else
{
NSLog(@无法创建文档);
}

//写入磁盘
[(NSMutableData *)mutableData writeToFile:@/ Users / David / Desktop / test.pdfatomically:YES];

//清理
CGDataConsumerRelease(dataConsumer);
CFRelease(mutableData);
CGPDFDocumentRelease(document);
}


解决方案

用它。


  1. PDF页面从1开始而不是0。

  2. 需要告诉pdf上下文页面开始和结束。

  3. 在将数据写入磁盘之前,请释放pdf上下文。

  4. 以下是修正后的程式码。

       - (void)testQuartz:(NSData *)pdfDocumentData 
    {
    //创建pdf文档引用
    CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData )pdfDocumentData);
    CGPDFDocumentRef document = CGPDFDocumentCreateWithProvider(dataProvider);

    //创建pdf上下文
    CGPDFPageRef page = CGPDFDocumentGetPage(document,1); //页面从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)
    {
    //将页面绘制到新上下文
    // page = CGPDFDocumentGetPage文件,1); //页面从1开始编号

    CGPDFContextBeginPage(pdfContext,NULL);
    CGContextDrawPDFPage(pdfContext,page);
    CGPDFContextEndPage(pdfContext);
    }
    else
    {
    NSLog(@无法创建文档);
    }

    CGContextRelease(pdfContext); //在将数据写入磁盘之前释放。

    //写入磁盘
    [(NSData *)mutableData writeToFile:@/ Users / David / Desktop / test.pdfatomically:YES];

    //清理
    CGDataProviderRelease(dataProvider); //释放数据提供者
    CGDataConsumerRelease(dataConsumer);
    CGPDFDocumentRelease(document);
    CFRelease(mutableData);
    }


    I am trying to draw a pdf page onto a pdf context and then save it to disk. I cannot seem to figure out what is wrong. Can someone give me a few pointers. Thanks.

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

    解决方案

    So I found 3 things wrong with it.

    1. PDF pages start at 1 and not 0.
    2. Need to tell the pdf context when a page begins and ends.
    3. Release the pdf context prior to writing the data to disk. This is key for some reason.

    Here is the corrected code that works.

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

    这篇关于使用Quartz将PDF文档保存到磁盘的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆