iPhone PDF创建库或功能

时间:2010-07-12 14:31:44

标签: iphone pdf-generation

有人知道iPhone的开源PDF创建项目是否可以从模板生成文档(使用Quartz)?或者是否有人为协调而写的任何功能?我见过libHaru但我知道它缺少一些关键功能。

由于

2 个答案:

答案 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方法:

  1. CGContextRef CGPDFContextCreateWithURL(CFURLRef url,const CGRect * mediaBox,CFDictionaryRef auxiliaryInfo)
  2. void CGContextBeginPage(CGContextRef c,const CGRect * mediaBox)
  3. void CGContextEndPage(CGContextRef c) 第二种方法是使用UIKit方法创建pdf上下文。你可以找到它here
  4. 有一个关于使用iPhone SDK以编程方式生成pdf的好教程,您可以找到它here