在CGContext中绘制PDF正面朝上

时间:2010-03-17 02:37:34

标签: iphone objective-c cocoa cocoa-touch

我在自定义UIView中覆盖了drawRect:方法,我正在做一些自定义绘图。一切进展顺利,直到我需要将PDF资源(准确地说是矢量字形)绘制到上下文中。首先,我从文件中检索PDF:

NSURL *pdfURL = [NSURL fileURLWithPath:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"CardKit.bundle/A.pdf"]];
CGPDFDocumentRef pdfDoc = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL);
CGPDFPageRef pdfPage = CGPDFDocumentGetPage(pdfDoc, 1);

然后我创建一个与加载的PDF尺寸相同的框:

CGRect box = CGPDFPageGetBoxRect(pdfPage, kCGPDFArtBox);

然后我保存了我的图形状态,所以我不会搞砸任何东西:

CGContextSaveGState(context);

然后我执行CTM的缩放+翻译,理论上翻转整个上下文:

CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0.0, rect.size.height);

然后我缩放PDF以使其适当地适合视图:

CGContextScaleCTM(context, rect.size.width/box.size.width, rect.size.height/box.size.height);

最后,我绘制PDF并恢复图形状态:

CGContextDrawPDFPage(context, pdfPage);
CGContextRestoreGState(context);

问题在于没有任何可见的东西。所有这些代码理论上应该将PDF字形绘制到视图中,对吧?

如果我删除用于翻转上下文的缩放+翻译,它会完美地绘制:它只是颠倒过来。

有什么想法吗?

4 个答案:

答案 0 :(得分:10)

尝试在比例尺之前进行翻译:

CGContextTranslateCTM(context, 0.0, rect.size.height);
CGContextScaleCTM(context, 1.0, -1.0);

答案 1 :(得分:2)

CGContextTranslateCTM(context, 0, self.bounds.size.height);
CGContextScaleCTM(context, 1.0, -1.0);

CGPDFPageRef page = CGPDFDocumentGetPage(pdf, currentPage);
CGContextSaveGState(context);




CGRect box = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);

CGContextScaleCTM(context, self.bounds.size.width/box.size.width, self.bounds.size.height/box.size.height);
CGContextDrawPDFPage(context, page);
CGContextRestoreGState(context);

这是您问题的正确答案

答案 2 :(得分:0)

要在翻译之前进行缩放,我认为我们可以在翻译时加减。

CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0.0, -rect.size.height);

答案 3 :(得分:0)

对我来说,这一切都是正确的:

pdfDisplayView.layer.geometryFlipped = YES; //(NO)