我继承了一些iOS代码,它打开源PDF并创建一个CGContextRef从源文档中绘制单个页面的代码.问题是,某些文档有一个文档,遗憾的是我们的帮助文档导致此代码崩溃.
最终目标是一次缓存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,然后写入ctx到一个新的文件.)
如果不是绘制到PDF上下文,而是绘制到如此创建的UIGraphics上下文,那就没有问题了:
CGContextRef graphicsContext = UIGraphicsGetCurrentContext();
当我在PDF上下文中绘制其他内容时也没有问题.
此外,这适用于99%的文档和违规文档中75%的页面.违规文档在多个PDF查看器中正确呈现.
所以我认为我不会有内存问题.我相信CGPDF代码中有一些东西是错误的(我说只有花了一个星期才试图解决这个问题).
我的问题是,还有其他方式我应该/可以这样做吗?
在我的应用程序中,我有一个方法将pdf绘制到上下文中:
 CGPDFPageRef page = CGPDFDocumentGetPage(pdf, index + 1);
 CGAffineTransform transform = aspectFit(CGPDFPageGetBoxRect(page, kCGPDFTrimBox),
                                                          CGContextGetClipBoundingBox(ctx));
 CGContextConcatCTM(ctx, transform);
 CGContextDrawPDFPage(ctx, page);
现在在drawLayer中,在缩放时调用,我进行必要的转换并再次调用 CGContextDrawPDFPage(ctx, page);
会发生的是,在第一个pdf之上绘制缩放的pdf,问题是在仅包含文本的特定页面中,显示了背面和模糊的pdf.这很奇怪,我认为pdf页面有白色背景,如果发生这种情况,那是因为顶部的缩放pdf具有透明背景.
现在,为了解决这个问题,如何在drawLayer方法的CGContextDrawPDFPage(ctx,page)之前清除上下文?我试过了:
//self.view.transform = CGAffineTransformIdentity;
//CGAffineTransform transform = CGAffineTransformIdentity;
//CGContextConcatCTM(ctx, transform);
//CGContextClearRect(ctx, layer.bounds);
什么都行不动......提前谢谢