【问题标题】:Saving a PDF document to disk using Quartz使用 Quartz 将 PDF 文档保存到磁盘
【发布时间】:2010-09-23 16:58:57
【问题描述】:

我正在尝试将 pdf 页面绘制到 pdf 上下文中,然后将其保存到磁盘。我似乎无法弄清楚出了什么问题。有人可以给我一些指点。谢谢。

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

【问题讨论】:

  • 那么什么不起作用?不是在编译吗?您在构建时是否收到错误或警告?您的日志消息是否正在输出?
  • 执行代码时我没有收到任何警告或错误。我知道有问题,因为 pdf 文件无法打开。

标签: objective-c cocoa pdf quartz-2d


【解决方案1】:

所以我发现它有 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);
}

【讨论】:

    猜你喜欢
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 2020-01-13
    • 1970-01-01
    • 2020-12-17
    • 2016-07-22
    • 2013-12-19
    相关资源
    最近更新 更多