【问题标题】:iPhone PDF creation library or functionsiPhone PDF 创建库或函数
【发布时间】:2010-07-12 14:31:44
【问题描述】:

有没有人知道一个用于 iPhone 的开源 PDF 创建项目,用于从模板生成文档(使用 Quartz)?还是人们为对齐等编写了任何功能?我见过 libHaru,但我知道它缺少一些关键功能。

谢谢

【问题讨论】:

  • 还没有看到任何开源 apis (也没有看起来很难),但是在苹果的 api 中有各种各样的支持。尝试寻找 CGPFDocument 和类似的东西。

标签: iphone pdf-generation


【解决方案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 中创建一个页面,因此我们开始页面,绘制,然后结束页面。如果你想做多页,你可以对每一页重复这个。

请注意,所有这些绘图都将在 Quartz 坐标空间中完成,因此如果您已将绘图例程设置为在 iPhone 视图中正确显示,它将在此处翻转。为了抵消这种翻转,您可以在绘图代码中添加以下内容(UIGraphicsPushContext() 之后):

CGContextTranslateCTM(context, 0.0f, self.frame.size.height);
CGContextScaleCTM(context, 1.0f, -1.0f);

【讨论】:

  • 感谢您的代码。我还希望为某些功能找到更高级别的包装器。
  • @Rael - 他们在 3.2+ 中使用 UIGraphicsBeginPDFContextToData() 等稍微改进了一些整体 PDF 创建功能,但听起来你想要一些东西来抽象出实际的排版和布局一个页面,而不是 PDF 本身的生成。
【解决方案2】:

在 iPhone SDK 中有 2 种方法可以生成 pdf。第一个是使用 Core Graphics 方法:

  1. CGContextRef CGPDFContextCreateWithURL(CFURLRef url, const CGRect *mediaBox, CFDictionaryRef assistantInfo)
  2. void CGContextBeginPage(CGContextRef c, const CGRect *mediaBox)
  3. void CGContextEndPage(CGContextRef c) 第二种方法是使用 UIKit 方法创建 pdf 上下文。你可以找到它here

有一个很好的使用 iPhone SDK 以编程方式生成 pdf 的教程,你可以找到它here

【讨论】:

    猜你喜欢
    • 2010-10-27
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多