ios开发之--PDF文件生成
写项目的时候,碰到一个需求,就是在手机端根据指定的文件内容生成PDF文件,并可以保存到手机上,因为以前只是听说过,没有真正的去了解过这个需求,通过查阅资料,可以实现这个功能,话不多说,代码如下:
- -(void)creatPDFfile
- {
- // 1.创建media box
- CGFloat myPageWidth = self.view.bounds.size.width;
- CGFloat myPageHeight = self.view.bounds.size.height;
- CGRect mediaBox = CGRectMake (, , myPageWidth, myPageHeight);
- // 2.设置pdf文档存储的路径
- NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
- NSString *documentsDirectory = paths[];
- NSString *filePath = [documentsDirectory stringByAppendingString:@"/test.pdf"];
- // NSLog(@"%@", filePath);
- const char *cfilePath = [filePath UTF8String];
- CFStringRef pathRef = CFStringCreateWithCString(NULL, cfilePath, kCFStringEncodingUTF8);
- // 3.设置当前pdf页面的属性
- CFStringRef myKeys[];
- CFTypeRef myValues[];
- myKeys[] = kCGPDFContextMediaBox;
- myValues[] = (CFTypeRef) CFDataCreate(NULL,(const UInt8 *)&mediaBox, sizeof (CGRect));
- myKeys[] = kCGPDFContextTitle;
- myValues[] = CFSTR("我的PDF");
- myKeys[] = kCGPDFContextCreator;
- myValues[] = CFSTR("Jymn_Chen");
- CFDictionaryRef pageDictionary = CFDictionaryCreate(NULL, (const void **) myKeys, (const void **) myValues, ,&kCFTypeDictionaryKeyCallBacks, & kCFTypeDictionaryValueCallBacks);
- // 4.获取pdf绘图上下文
- CGContextRef myPDFContext = MyPDFContextCreate (&mediaBox, pathRef);
- // 5.开始描绘第一页页面
- CGPDFContextBeginPage(myPDFContext, pageDictionary);
- CGContextSetRGBFillColor (myPDFContext, , , , );
- CGContextFillRect (myPDFContext, CGRectMake (, , , ));
- CGContextSetRGBFillColor (myPDFContext, , , , .);
- CGContextFillRect (myPDFContext, CGRectMake (, , , ));
- // 为一个矩形设置URL链接www.baidu.com
- CFURLRef baiduURL = CFURLCreateWithString(NULL, CFSTR("http://www.baidu.com"), NULL);
- CGContextSetRGBFillColor (myPDFContext, , , , );
- CGContextFillRect (myPDFContext, CGRectMake (, , , ));
- CGPDFContextSetURLForRect(myPDFContext, baiduURL, CGRectMake (, , , ));
- // 为一个矩形设置一个跳转终点
- CGPDFContextAddDestinationAtPoint(myPDFContext, CFSTR("page"), CGPointMake(120.0, 400.0));
- CGPDFContextSetDestinationForRect(myPDFContext, CFSTR("page"), CGRectMake(50.0, 300.0, 100.0, 100.0)); // 跳转点的name为page
- // CGPDFContextSetDestinationForRect(myPDFContext, CFSTR("page2"), CGRectMake(50.0, 300.0, 100.0, 100.0)); // 跳转点的name为page2
- CGContextSetRGBFillColor(myPDFContext, , , , 0.5);
- CGContextFillEllipseInRect(myPDFContext, CGRectMake(50.0, 300.0, 100.0, 100.0));
- CGPDFContextEndPage(myPDFContext);
- // 6.开始描绘第二页页面
- // 注意要另外创建一个page dictionary
- CFDictionaryRef page2Dictionary = CFDictionaryCreate(NULL, (const void **) myKeys, (const void **) myValues, ,&kCFTypeDictionaryKeyCallBacks, & kCFTypeDictionaryValueCallBacks);
- CGPDFContextBeginPage(myPDFContext, page2Dictionary);
- // 在左下角画两个矩形
- CGContextSetRGBFillColor (myPDFContext, , , , );
- CGContextFillRect (myPDFContext, CGRectMake (, , , ));
- CGContextSetRGBFillColor (myPDFContext, , , , .);
- CGContextFillRect (myPDFContext, CGRectMake (, , , ));
- // 在右下角写一段文字:"Page 2"
- CGContextSelectFont(myPDFContext, "Helvetica", , kCGEncodingMacRoman);
- CGContextSetTextDrawingMode (myPDFContext, kCGTextFill);
- CGContextSetRGBFillColor (myPDFContext, , , , );
- const char *text = [@"Page 2" UTF8String];
- CGContextShowTextAtPoint (myPDFContext, , , text, strlen(text));
- // CGPDFContextAddDestinationAtPoint(myPDFContext, CFSTR("page2"), CGPointMake(120.0, 120.0)); // 跳转点的name为page2
- // CGPDFContextAddDestinationAtPoint(myPDFContext, CFSTR("page"), CGPointMake(120.0, 120.0)); // 跳转点的name为page
- // 为右上角的矩形设置一段file URL链接,打开本地文件
- NSURL *furl = [NSURL fileURLWithPath:@"/Users/one/Library/Application Support/iPhone Simulator/7.0/Applications/3E7CB341-693A-4FE4-8FE5-A827A5210F0A/Documents/test1.pdf"];
- CFURLRef fileURL = (__bridge CFURLRef)furl;
- CGContextSetRGBFillColor (myPDFContext, , , , );
- CGContextFillRect (myPDFContext, CGRectMake (, , , ));
- CGPDFContextSetURLForRect(myPDFContext, fileURL, CGRectMake (, , , ));
- CGPDFContextEndPage(myPDFContext);
- // 7.创建第三页内容
- CFDictionaryRef page3Dictionary = CFDictionaryCreate(NULL, (const void **) myKeys, (const void **) myValues, ,&kCFTypeDictionaryKeyCallBacks, & kCFTypeDictionaryValueCallBacks);
- CGPDFContextBeginPage(myPDFContext, page3Dictionary);
- CGContextSetRGBFillColor (myPDFContext, , , , );
- CGPDFContextEndPage(myPDFContext);
- // 8.释放创建的对象
- CFRelease(page3Dictionary);
- CFRelease(page2Dictionary);
- CFRelease(pageDictionary);
- CFRelease(myValues[]);
- CGContextRelease(myPDFContext);
- }
获得图形上下文:
- /*
- * 获取pdf绘图上下文
- * inMediaBox指定pdf页面大小
- * path指定pdf文件保存的路径
- */
- CGContextRef MyPDFContextCreate (const CGRect *inMediaBox, CFStringRef path)
- {
- CGContextRef myOutContext = NULL;
- CFURLRef url;
- CGDataConsumerRef dataConsumer;
- url = CFURLCreateWithFileSystemPath (NULL, path, kCFURLPOSIXPathStyle, false);
- if (url != NULL)
- {
- dataConsumer = CGDataConsumerCreateWithURL(url);
- if (dataConsumer != NULL)
- {
- myOutContext = CGPDFContextCreate (dataConsumer, inMediaBox, NULL);
- CGDataConsumerRelease (dataConsumer);
- }
- CFRelease(url);
- }
- return myOutContext;
- }
沙盒内容如下:
至此,一个PDF生成就结束了,目前打开的话,我这边写的是使用UIActivity进行打开操作,目前还没有找到存到到本机的方法,只是从沙盒里面取出来打开!
参考:http://blog.csdn.net/jymn_chen/article/details/14209855
ios开发之--PDF文件生成的更多相关文章
- IOS下载查看PDF文件(有下载进度)
IOS(object-c) 下载查看 PDF 其实还是蛮容易操作的.在下载前,首先要把 IOS 可以保存文件的目录给过一遍: IOS 文件保存目录 IOS 可以自定义写入的文件目录,是很有限的,只能是 ...
- iOS开发网络篇—文件的上传
iOS开发网络篇—文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代 ...
- iOS 开发http post 文件的上传
iOS开发网络篇—文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代 ...
- iOS开发-- 创建podspec文件,为自己的项目添加pod支持
开篇扯淡 作为一个iOS开发者,一定用过CocoaPods吧,没用过?点这儿去面壁吧 Cocoapods作为iOS开发的包管理器,给我们的开发带来了极大的便利,而且越来越多的第三方类库支持Pod,可以 ...
- iOS开发——Swift篇&文件,文件夹操作
文件,文件夹操作 ios开发经常会遇到读文件,写文件等,对文件和文件夹的操作,这时就可以使用NSFileManager,NSFileHandle等类来实现. 下面总结了各种常用的操作: 1,遍 ...
- 对扫描的pdf文件生成目录
很多pdf文件是直接扫描生成的,于是它的内容都是一张张的图片,当然就更没有目录索引了. 有的时候想找某些内容,只能一点点的移动滚动条,非常不方便. 那么有什么方法能生成目录呢? 方法一:使用福昕pdf ...
- IOS加载PDF文件
今天的任务是:在iOS上加载显示pdf文件. 方法一:利用webview -(void)loadDocument:(NSString *)documentName inView:(UIWebView ...
- iOS开发系列-Shell脚本生成IPA
概述 在公司开发到了测试阶段需要频繁打包交付给测试,看似简单的工作,重复的流程总是感觉不是那么好,我们可以借助苹果提供的编译指令编译项目. 自动化脚本编译打包IPA 常见的iOS项目就是基于xcode ...
- iOS开发——多线程篇——快速生成沙盒目录的路径,多图片下载的原理、SDWebImage框架的简单介绍
一.快速生成沙盒目录的路径 沙盒目录的各个文件夹功能 - Documents - 需要保存由"应用程序本身"产生的文件或者数据,例如:游戏进度.涂鸦软件的绘图 - 目录中的文件会被 ...
随机推荐
- windows下安装redis及其客户端
首先下载redis安装包:https://github.com/MSOpenTech/redis/releases 解压安装包到相应文件夹,任何盘符都行. 文件介绍:redis-server.exe: ...
- 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 ...
- 迭代器适配器{(插入迭代器back_insert_iterator)、IO流迭代器(istream_iterator、ostream_iterator)}
一.迭代器适配器 反向迭代器 插入迭代器 IO流迭代器 其中反向迭代器可以参考以前的文章. 二.插入迭代器 插入迭代器实际上是一个输出迭代器(*it=; ++) back_insert_iterato ...
- poj 3691 DNA repair(AC自己主动机+dp)
DNA repair Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5877 Accepted: 2760 Descri ...
- AutoFac文档4(转载)
目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 自动装配 从容器中可用 ...
- Json映射为Map,避免定义过多pojo类
我们在开发过程中经常会遇到解析Json字符串的情况,这时候采用开源工具可以快速将json字符串映射为pojo对象.而在某些业务场景中,往往为了获得json字符串中某个属性的值而不得不定义一个pojo类 ...
- find_if查找vector内对象的成员 作为菜鸟一直不会用也不敢用
用stl的find方法查找一个包含简单类型的vector中的元素是很简单的,例如 vector<string> strVec; find(strVec.begin(),strVec.end ...
- Eclipse的vim插件viPlugin的安装
1.viPlugin是什么? viPlugin是一个eclipse 针对vi的插件,使用此插件可以让你在使用eclipse进行编码时使用几乎所有vi命令,可以极大的提高开发编码效率. 2.viPl ...
- jquery获取元素索引值index()
jquery获取元素索引值index()方法实例. jquery获取元素索引值index()方法: jquery的index()方法 搜索匹配的元素,并返回相应元素的索引值,从0开始计数. 如果不给 ...
- js delete
在开始之前,先让我们看一段代码 >>> var sum = function(a, b) {return a + b;} >>> var add = sum; &g ...