文档章节

iOS创建PDF文件

于赟
 于赟
发布于 2012/11/15 00:08
字数 729
阅读 1571
收藏 3

参考了官方文档:《PDF Document Creation, Viewing, and Transforming》

pdf文档在iOS中是通过Quartz 2D库提供的api来操作的。iOS有两个图形库:

  • Quartz 2D,是iOS原生的,简单易用,缺点是只有2D,仅限于iOS
  • OpenGL ES,是开放标准的,2D和3D均有

使用Quartz 2D绘图到任意图形上下文(graphics context)创建pdf文件是很容易的事情。这需要:

  • 指定pdf文件的位置
  • 设置pdf的图形上下文(graphics context)

写了个特别简单的示例,效果如下:

image

完整的代码如下:

-(void)createPdf{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *saveDirectory = [paths objectAtIndex:0]; 
    NSString *saveFileName = @"myPDF.pdf"; 
    NSString *newFilePath = [saveDirectory stringByAppendingPathComponent:saveFileName]; 
    const char *filename = [newFilePath UTF8String]; 
    CGRect pageRect=CGRectMake(0, 0, 612, 792); 
    // This code block sets up our PDF Context so that we can draw to it 
    CGContextRef pdfContext; 
    CFStringRef path; 
    CFURLRef url; 
    CFMutableDictionaryRef myDictionary = NULL; 
    // Create a CFString from the filename we provide to this method when we call it 
    path = CFStringCreateWithCString (NULL, filename, 
                                      kCFStringEncodingUTF8); 
    // Create a CFURL using the CFString we just defined 
    url = CFURLCreateWithFileSystemPath (NULL, path, 
                                         kCFURLPOSIXPathStyle, 0); 
    CFRelease (path); 
    // This dictionary contains extra options mostly for ’signing’ the PDF 
    myDictionary = CFDictionaryCreateMutable(NULL, 0, 
                                             &kCFTypeDictionaryKeyCallBacks, 
                                             &kCFTypeDictionaryValueCallBacks); 
    CFDictionarySetValue(myDictionary, kCGPDFContextTitle, CFSTR("My PDF File")); 
    CFDictionarySetValue(myDictionary, kCGPDFContextCreator, CFSTR("My Name")); 
    // Create our PDF Context with the CFURL, the CGRect we provide, and the above defined dictionary 
    pdfContext = CGPDFContextCreateWithURL (url, &pageRect, myDictionary); 
    // Cleanup our mess 
    CFRelease(myDictionary); 
    CFRelease(url); 
    // Done creating our PDF Context, now it’s time to draw to it 
    // Starts our first page 
    CGContextBeginPage (pdfContext, &pageRect); 
    // Draws a black rectangle around the page inset by 50 on all sides 
    CGContextStrokeRect(pdfContext, CGRectMake(50, 50, pageRect.size.width – 100, pageRect.size.height – 100)); 
    // Adding some text on top of the image we just added 
    CGContextSelectFont (pdfContext, "Helvetica", 30, kCGEncodingMacRoman); 
    CGContextSetTextDrawingMode (pdfContext, kCGTextFill); 
    CGContextSetRGBFillColor (pdfContext, 0, 0, 0, 1); 
    const char *text =  (char *)[@"Hello world" UTF8String]; 
    CGContextShowTextAtPoint (pdfContext, 260, 390, text, strlen(text)); 
    // End text 
    // We are done drawing to this page, let’s end it 
    // We could add as many pages as we wanted using CGContextBeginPage/CGContextEndPage 
    CGContextEndPage (pdfContext); 
    // We are done with our context now, so we release it 
    CGContextRelease (pdfContext); 
}

 

会在当前应用的Documents目录下创建一个myPDF.pdf文件,文件中只有一行字,Hello world。

以下这段:

// This dictionary contains extra options mostly for ’signing’ the PDF 
    myDictionary = CFDictionaryCreateMutable(NULL, 0, 
                                             &kCFTypeDictionaryKeyCallBacks, 
                                             &kCFTypeDictionaryValueCallBacks); 
    CFDictionarySetValue(myDictionary, kCGPDFContextTitle, CFSTR("My PDF File")); 
    CFDictionarySetValue(myDictionary, kCGPDFContextCreator, CFSTR("My Name"));

可以不用,是设置pdf文件的一些属性的,比如作者等,那么可以:

pdfContext = CGPDFContextCreateWithURL (url, &pageRect, nil);

写入pdf是从CGContextBeginPage 函数开始,到CGContextEndPage函数截至。然后需要释放context:CGContextRelease。

目前不完美的是有两条:

  1. 汉字乱码
  2. 有报错

对第一个,据说需要使用其他方法,需要用NSString,可以参考这个帖子:

http://www.cocoachina.com/bbs/read.php?tid-2111.html

有报错,如这样:

Thu Oct 14 13:28:43 Henzil-mato-iPad pdfDemo[2200] <Error>: FT_Load_Glyph failed: error 6.

大量的这样的error,虽然我只是写了一行文本。引发错误的是:

CGContextShowTextAtPoint (pdfContext, 260, 390, text, strlen(text));

屏蔽这行就不抱错了。

搜到这个帖子:

http://discussions.apple.com/thread.jspa?messageID=7820664

但是将字体调大也无法解决问题,我调大30问题依旧。

所幸目前写的项目是老外用的,中文不是问题,另外,日志虽然报错,但是能正常生成文档。等有时间再解决这两个问题。

© 著作权归作者所有

共有 人打赏支持
上一篇: 读取pdf
于赟
粉丝 20
博文 59
码字总数 25221
作品 0
海淀
程序员
私信 提问
来自CodeCanyo的15个优秀移动应用和工具

随着移动站点的发展和普及,毫无疑问CodeCanyon的移动应用集合有了巨大的增长。从iPhone到Android,开发者已经贡献了一些令人惊艳的移动站点开发工具。 这里快速列出了一些市场上所销售的顶级...

MrMign
2012/03/06
959
1
(转)直接拿来用!最火的iOS开源项目(一)

AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目。AFNetworking是一个轻量级的iOS、Mac OS X网络通信类库,现在是GitHub上第三大Objective-C库。它建立在...

孙启超
2013/06/21
0
0
一步一步学习iOS 5编程(第三版)-PDF中文版-正式发布!

目前,这是第一本介绍iOS 5.x 和 Xcode 4.4 的中文版书籍,尤其适合于iOS 编程开发初学者。本教程由 EntLib.com 团队编写。如有任何技术问题,欢迎留言。 电子版 – PDF 格式,支持iPhone、i...

entlib
2012/09/20
0
2
老牌压缩软件WinZip发布iOS版应用

大家听过WinZip压缩软件把,这款软件在1991年发布,支持Windows和Mac系统。现在WinZip刚刚发布了一款iOS版应用,允许你在iOS设备上查看压缩文件。iOS版WinZip主要功能包括: -从邮件中打开Z...

红薯
2012/02/17
2K
2
一步一步学习 iOS 6 编程(第四版)正式发布

所有范例程序及其截图都采用Xcode 4.4 和Xcode 4.5 最新版开发工具,本书包含了最新的iOS 6 开发技术,如自动布局(Auto Layout)、集合视图(Collection View)等等。 新增内容包括:分割视...

entlib
2012/10/25
0
2

没有更多内容

加载失败,请刷新页面

加载更多

常用缓存淘汰算法

LFU(Least Frequently Used)算法根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”。 LRU(Least recently used,最近最少使用)算...

wangmarke
25分钟前
2
0
linux查看系统配置,例如一级缓存总大小、一级缓存行大小

chuqq@chuqq-vb:~$ getconf -a|grep CACHELEVEL1_ICACHE_SIZE 32768LEVEL1_ICACHE_ASSOC 8LEVEL1_ICACHE_LINESIZE 64LEVEL1_DCACHE_SIZE ......

chuqq
28分钟前
1
0
全职ui设计师岗位需要具备哪些工作技能

好的UI设计不仅是让软件变得有个性有品位,还要让软件的操作变得舒适简单、自由,充分体现软件的定位和特点。Ui设计师可以让网页变的更美,让图片变的更真实,而今,ui设计师成了一个公司不可...

纤纤郡主
28分钟前
0
0
分布式之数据库和缓存双写一致性方案解析

先做一个说明,从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。这种方案下,我们可以对存入缓存的数据设置过期时间,所有的写操作以数据库为准,对缓存操作只是尽最大努力即...

微笑向暖wx
33分钟前
0
0
正则验证整数或保留小数一位

var reg = new Regex(@"^\d*\.{0,1}\d{0,1}$"); if (!reg.IsMatch(body.Quota.ToString())) {}...

Lytf
33分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部