我继承了一些iOS代码,它可以打开源文件并创建一个CGContextRef,我们可以从源文件中将一个页面绘制到这个the。问题是某些页面只有一个文档,不幸的是,我们的帮助文档会导致代码崩溃。
最终目标是一次缓存8个页面,以改善用户体验。
CFMutableDataRef consumerData = CFDataCreateMutable(kCFAllocatorDefault, 0);
CGDataConsumerRef contextConsumer = CGDataConsumerCreateWithCFData(consumerData);
CGPDFPageRef page = CGPDFDocumentGetPage(sourceDocument, pageNumber);
const CGRect mediaBox = CGPDFPageGetBoxRect(page, kCGPDFCropBox);
CGContextRef pdfOutContext = CGPDFContextCreate(contextConsumer, &mediaBox, NULL);
CGContextDrawPDFPage(pdfOutContext, page); //If I comment out this line, no exception occurs
CGPDFPageRelease(page);
CGPDFContextEndPage(pdfOutContext);
CGPDFContextClose(pdfOutContext); //EXC_BAD_ACCESS
CGContextRelease(pdfOutContext);(这是代码的简化版本,原始代码打开一个源文档和一个页面,检查page和ctx上的null,然后将ctx写入新文档。)
如果不是绘制到PDF上下文,而是绘制到这样创建的UIGraphics上下文,这是没有问题的:
CGContextRef graphicsContext = UIGraphicsGetCurrentContext();
当我将其他东西绘制到PDF上下文中时,也没有问题。
此外,这适用于99%的文档和75%的违规文档中的页面。有问题的文档可在多个PDF查看器中正确呈现。
所以我不认为我的记忆有问题。我相当确信CGPDF代码中有一些错误(我只是在花了一周的时间来解决这个问题之后才这么说)。
我的问题是,有没有其他我应该/可以这样做的方式?
发布于 2011-11-22 08:26:58
你要错过CGPDFContextBeginPage了。
https://stackoverflow.com/questions/8216450
复制相似问题