有人知道iPhone的开源PDF创建项目是否可以从模板生成文档(使用Quartz)?或者是否有人为协调而写的任何功能?我见过libHaru但我知道它缺少一些关键功能。
由于
答案 0 :(得分:1)
您可以使用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中创建一个页面,因此我们开始页面,绘制,然后结束页面。如果您想要多个页面,可以为每个页面重复此操作。
请注意,所有这些图纸将在石英完成坐标空间,因此,如果您已经设置了您的绘图程序来在iPhone视图正确显示,这里将翻转。要抵消这种翻转,您可以在绘图代码中放置以下内容(UIGraphicsPushContext()
之后):
CGContextTranslateCTM(context, 0.0f, self.frame.size.height);
CGContextScaleCTM(context, 1.0f, -1.0f);
答案 1 :(得分:0)
有两种方法可以在iPhone SDK中生成pdf。第一个是使用Core Graphics方法: