您可以使用 PDF 文件作为渲染目标创建 Quartz 上下文,然后简单地在其中绘制。例如,以下代码将在 NSData 对象中创建一个 PDF 文件,然后您可以将其附加到电子邮件或保存到磁盘:
NSMutableData *pdfData = [[NSMutableData alloc] init];
CGDataConsumerRef dataConsumer = CGDataConsumerCreateWithCFData((CFMutableDataRef)pdfData);
const CGRect mediaBox = CGRectMake(0.0f, 0.0f, drawingWidth, drawingHeight);
CGContextRef pdfContext = CGPDFContextCreate(dataConsumer, &mediaBox, NULL);
UIGraphicsPushContext(pdfContext);
CGContextBeginPage(pdfContext, &mediaBox);
// Draw your content here
CGContextEndPage(pdfContext);
CGPDFContextClose(pdfContext);
UIGraphicsPopContext();
CGContextRelease(pdfContext);
CGDataConsumerRelease(dataConsumer);
这里发生了一些事情。首先,我们创建一个 NSMutableData 实例并将其设置为数据使用者(PDF 上下文写入的目的地)。因为 Core Graphics 使用 Core Foundation 类型,而不是 Cocoa 类,所以CGDataConsumerCreateWithCFData() 需要一个 CFMutableDataRef 参数。我们可以简单地将我们创建的 NSMutableData 类转换为这种类型,因为 NSData 是一个免费的桥接类。这意味着它可以在 Cocoa 方法或 Core Foundation 函数中使用,而无需在类型之间进行转换。
之后,我们设置 PDF 上下文的页面大小(以磅为单位)并使用我们之前设置的数据使用者创建 PDF 上下文。然后,我们使用UIGraphicsPushContext() 将其作为绘图的活动上下文。
在这种情况下,我们只在我们正在绘制的 PDF 中创建一个页面,因此我们开始页面,绘制,然后结束页面。如果你想做多页,你可以对每一页重复这个。
请注意,所有这些绘图都将在 Quartz 坐标空间中完成,因此如果您已将绘图例程设置为在 iPhone 视图中正确显示,它将在此处翻转。为了抵消这种翻转,您可以在绘图代码中添加以下内容(UIGraphicsPushContext() 之后):
CGContextTranslateCTM(context, 0.0f, self.frame.size.height);
CGContextScaleCTM(context, 1.0f, -1.0f);