写项目的时候,碰到一个需求,就是在手机端根据指定的文件内容生成PDF文件,并可以保存到手机上,因为以前只是听说过,没有真正的去了解过这个需求,通过查阅资料,可以实现这个功能,话不多说,代码如下:

  1. -(void)creatPDFfile
  2. {
  3. // 1.创建media box
  4. CGFloat myPageWidth = self.view.bounds.size.width;
  5. CGFloat myPageHeight = self.view.bounds.size.height;
  6. CGRect mediaBox = CGRectMake (, , myPageWidth, myPageHeight);
  7.  
  8. // 2.设置pdf文档存储的路径
  9. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  10. NSString *documentsDirectory = paths[];
  11. NSString *filePath = [documentsDirectory stringByAppendingString:@"/test.pdf"];
  12. // NSLog(@"%@", filePath);
  13. const char *cfilePath = [filePath UTF8String];
  14. CFStringRef pathRef = CFStringCreateWithCString(NULL, cfilePath, kCFStringEncodingUTF8);
  15.  
  16. // 3.设置当前pdf页面的属性
  17. CFStringRef myKeys[];
  18. CFTypeRef myValues[];
  19. myKeys[] = kCGPDFContextMediaBox;
  20. myValues[] = (CFTypeRef) CFDataCreate(NULL,(const UInt8 *)&mediaBox, sizeof (CGRect));
  21. myKeys[] = kCGPDFContextTitle;
  22. myValues[] = CFSTR("我的PDF");
  23. myKeys[] = kCGPDFContextCreator;
  24. myValues[] = CFSTR("Jymn_Chen");
  25. CFDictionaryRef pageDictionary = CFDictionaryCreate(NULL, (const void **) myKeys, (const void **) myValues, ,&kCFTypeDictionaryKeyCallBacks, & kCFTypeDictionaryValueCallBacks);
  26.  
  27. // 4.获取pdf绘图上下文
  28. CGContextRef myPDFContext = MyPDFContextCreate (&mediaBox, pathRef);
  29.  
  30. // 5.开始描绘第一页页面
  31. CGPDFContextBeginPage(myPDFContext, pageDictionary);
  32. CGContextSetRGBFillColor (myPDFContext, , , , );
  33. CGContextFillRect (myPDFContext, CGRectMake (, , , ));
  34. CGContextSetRGBFillColor (myPDFContext, , , , .);
  35. CGContextFillRect (myPDFContext, CGRectMake (, , , ));
  36.  
  37. // 为一个矩形设置URL链接www.baidu.com
  38. CFURLRef baiduURL = CFURLCreateWithString(NULL, CFSTR("http://www.baidu.com"), NULL);
  39. CGContextSetRGBFillColor (myPDFContext, , , , );
  40. CGContextFillRect (myPDFContext, CGRectMake (, , , ));
  41. CGPDFContextSetURLForRect(myPDFContext, baiduURL, CGRectMake (, , , ));
  42.  
  43. // 为一个矩形设置一个跳转终点
  44. CGPDFContextAddDestinationAtPoint(myPDFContext, CFSTR("page"), CGPointMake(120.0, 400.0));
  45. CGPDFContextSetDestinationForRect(myPDFContext, CFSTR("page"), CGRectMake(50.0, 300.0, 100.0, 100.0)); // 跳转点的name为page
  46. // CGPDFContextSetDestinationForRect(myPDFContext, CFSTR("page2"), CGRectMake(50.0, 300.0, 100.0, 100.0)); // 跳转点的name为page2
  47. CGContextSetRGBFillColor(myPDFContext, , , , 0.5);
  48. CGContextFillEllipseInRect(myPDFContext, CGRectMake(50.0, 300.0, 100.0, 100.0));
  49.  
  50. CGPDFContextEndPage(myPDFContext);
  51.  
  52. // 6.开始描绘第二页页面
  53. // 注意要另外创建一个page dictionary
  54. CFDictionaryRef page2Dictionary = CFDictionaryCreate(NULL, (const void **) myKeys, (const void **) myValues, ,&kCFTypeDictionaryKeyCallBacks, & kCFTypeDictionaryValueCallBacks);
  55. CGPDFContextBeginPage(myPDFContext, page2Dictionary);
  56.  
  57. // 在左下角画两个矩形
  58. CGContextSetRGBFillColor (myPDFContext, , , , );
  59. CGContextFillRect (myPDFContext, CGRectMake (, , , ));
  60. CGContextSetRGBFillColor (myPDFContext, , , , .);
  61. CGContextFillRect (myPDFContext, CGRectMake (, , , ));
  62.  
  63. // 在右下角写一段文字:"Page 2"
  64. CGContextSelectFont(myPDFContext, "Helvetica", , kCGEncodingMacRoman);
  65. CGContextSetTextDrawingMode (myPDFContext, kCGTextFill);
  66. CGContextSetRGBFillColor (myPDFContext, , , , );
  67. const char *text = [@"Page 2" UTF8String];
  68. CGContextShowTextAtPoint (myPDFContext, , , text, strlen(text));
  69. // CGPDFContextAddDestinationAtPoint(myPDFContext, CFSTR("page2"), CGPointMake(120.0, 120.0)); // 跳转点的name为page2
  70. // CGPDFContextAddDestinationAtPoint(myPDFContext, CFSTR("page"), CGPointMake(120.0, 120.0)); // 跳转点的name为page
  71.  
  72. // 为右上角的矩形设置一段file URL链接,打开本地文件
  73. NSURL *furl = [NSURL fileURLWithPath:@"/Users/one/Library/Application Support/iPhone Simulator/7.0/Applications/3E7CB341-693A-4FE4-8FE5-A827A5210F0A/Documents/test1.pdf"];
  74. CFURLRef fileURL = (__bridge CFURLRef)furl;
  75. CGContextSetRGBFillColor (myPDFContext, , , , );
  76. CGContextFillRect (myPDFContext, CGRectMake (, , , ));
  77. CGPDFContextSetURLForRect(myPDFContext, fileURL, CGRectMake (, , , ));
  78.  
  79. CGPDFContextEndPage(myPDFContext);
  80.  
  81. // 7.创建第三页内容
  82. CFDictionaryRef page3Dictionary = CFDictionaryCreate(NULL, (const void **) myKeys, (const void **) myValues, ,&kCFTypeDictionaryKeyCallBacks, & kCFTypeDictionaryValueCallBacks);
  83. CGPDFContextBeginPage(myPDFContext, page3Dictionary);
  84. CGContextSetRGBFillColor (myPDFContext, , , , );
  85. CGPDFContextEndPage(myPDFContext);
  86.  
  87. // 8.释放创建的对象
  88. CFRelease(page3Dictionary);
  89. CFRelease(page2Dictionary);
  90. CFRelease(pageDictionary);
  91. CFRelease(myValues[]);
  92. CGContextRelease(myPDFContext);
  93. }

获得图形上下文:

  1. /*
  2. * 获取pdf绘图上下文
  3. * inMediaBox指定pdf页面大小
  4. * path指定pdf文件保存的路径
  5. */
  6. CGContextRef MyPDFContextCreate (const CGRect *inMediaBox, CFStringRef path)
  7. {
  8. CGContextRef myOutContext = NULL;
  9. CFURLRef url;
  10. CGDataConsumerRef dataConsumer;
  11.  
  12. url = CFURLCreateWithFileSystemPath (NULL, path, kCFURLPOSIXPathStyle, false);
  13.  
  14. if (url != NULL)
  15. {
  16. dataConsumer = CGDataConsumerCreateWithURL(url);
  17. if (dataConsumer != NULL)
  18. {
  19. myOutContext = CGPDFContextCreate (dataConsumer, inMediaBox, NULL);
  20. CGDataConsumerRelease (dataConsumer);
  21. }
  22. CFRelease(url);
  23. }
  24. return myOutContext;
  25. }

沙盒内容如下:

至此,一个PDF生成就结束了,目前打开的话,我这边写的是使用UIActivity进行打开操作,目前还没有找到存到到本机的方法,只是从沙盒里面取出来打开!

参考:http://blog.csdn.net/jymn_chen/article/details/14209855

ios开发之--PDF文件生成的更多相关文章

  1. IOS下载查看PDF文件(有下载进度)

    IOS(object-c) 下载查看 PDF 其实还是蛮容易操作的.在下载前,首先要把 IOS 可以保存文件的目录给过一遍: IOS 文件保存目录 IOS 可以自定义写入的文件目录,是很有限的,只能是 ...

  2. iOS开发网络篇—文件的上传

    iOS开发网络篇—文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代 ...

  3. iOS 开发http post 文件的上传

    iOS开发网络篇—文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代 ...

  4. iOS开发-- 创建podspec文件,为自己的项目添加pod支持

    开篇扯淡 作为一个iOS开发者,一定用过CocoaPods吧,没用过?点这儿去面壁吧 Cocoapods作为iOS开发的包管理器,给我们的开发带来了极大的便利,而且越来越多的第三方类库支持Pod,可以 ...

  5. iOS开发——Swift篇&文件,文件夹操作

    文件,文件夹操作   ios开发经常会遇到读文件,写文件等,对文件和文件夹的操作,这时就可以使用NSFileManager,NSFileHandle等类来实现. 下面总结了各种常用的操作:   1,遍 ...

  6. 对扫描的pdf文件生成目录

    很多pdf文件是直接扫描生成的,于是它的内容都是一张张的图片,当然就更没有目录索引了. 有的时候想找某些内容,只能一点点的移动滚动条,非常不方便. 那么有什么方法能生成目录呢? 方法一:使用福昕pdf ...

  7. IOS加载PDF文件

    今天的任务是:在iOS上加载显示pdf文件. 方法一:利用webview -(void)loadDocument:(NSString *)documentName inView:(UIWebView  ...

  8. iOS开发系列-Shell脚本生成IPA

    概述 在公司开发到了测试阶段需要频繁打包交付给测试,看似简单的工作,重复的流程总是感觉不是那么好,我们可以借助苹果提供的编译指令编译项目. 自动化脚本编译打包IPA 常见的iOS项目就是基于xcode ...

  9. iOS开发——多线程篇——快速生成沙盒目录的路径,多图片下载的原理、SDWebImage框架的简单介绍

    一.快速生成沙盒目录的路径 沙盒目录的各个文件夹功能 - Documents - 需要保存由"应用程序本身"产生的文件或者数据,例如:游戏进度.涂鸦软件的绘图 - 目录中的文件会被 ...

随机推荐

  1. windows下安装redis及其客户端

    首先下载redis安装包:https://github.com/MSOpenTech/redis/releases 解压安装包到相应文件夹,任何盘符都行. 文件介绍:redis-server.exe: ...

  2. mybatis WARN No appenders could be found for logger的解决方法

    log4j:WARN No appenders could be found for logger (org.apache.ibatis.logging.LogFactory).log4j:WARN ...

  3. 迭代器适配器{(插入迭代器back_insert_iterator)、IO流迭代器(istream_iterator、ostream_iterator)}

    一.迭代器适配器 反向迭代器 插入迭代器 IO流迭代器 其中反向迭代器可以参考以前的文章. 二.插入迭代器 插入迭代器实际上是一个输出迭代器(*it=; ++) back_insert_iterato ...

  4. poj 3691 DNA repair(AC自己主动机+dp)

    DNA repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5877   Accepted: 2760 Descri ...

  5. AutoFac文档4(转载)

    目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 自动装配 从容器中可用 ...

  6. Json映射为Map,避免定义过多pojo类

    我们在开发过程中经常会遇到解析Json字符串的情况,这时候采用开源工具可以快速将json字符串映射为pojo对象.而在某些业务场景中,往往为了获得json字符串中某个属性的值而不得不定义一个pojo类 ...

  7. find_if查找vector内对象的成员 作为菜鸟一直不会用也不敢用

    用stl的find方法查找一个包含简单类型的vector中的元素是很简单的,例如 vector<string> strVec; find(strVec.begin(),strVec.end ...

  8. Eclipse的vim插件viPlugin的安装

    1.viPlugin是什么?   viPlugin是一个eclipse 针对vi的插件,使用此插件可以让你在使用eclipse进行编码时使用几乎所有vi命令,可以极大的提高开发编码效率. 2.viPl ...

  9. jquery获取元素索引值index()

    jquery获取元素索引值index()方法实例. jquery获取元素索引值index()方法: jquery的index()方法 搜索匹配的元素,并返回相应元素的索引值,从0开始计数. 如果不给 ...

  10. js delete

    在开始之前,先让我们看一段代码 >>> var sum = function(a, b) {return a + b;} >>> var add = sum; &g ...