代码之家  ›  专栏  ›  技术社区  ›  David

使用Quartz将PDF文档保存到磁盘

  •  3
  • David  · 技术社区  · 15 年前

    我正在尝试将一个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);
    }
    
    1 回复  |  直到 15 年前
        1
  •  12
  •   David    15 年前

    所以我发现它有三个问题。

    1. PDF页面从1开始,而不是0。
    2. 需要告诉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);
    }