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 - 需要保存由"应用程序本身"产生的文件或者数据,例如:游戏进度.涂鸦软件的绘图 - 目录中的文件会被 ...
随机推荐
- 【linux】查看内存和CPU使用情况
1.内存命令:free 解释:以上数据单位KB. 所以,上面的mem物理内存共1G 下面是对这些数值的解释: total:总计物理内存的大小. used:已使用多大. free:可用有多少. Shar ...
- Java中Math类的几个四舍五入方法的区别
JAVA取整以及四舍五入 下面来介绍将小数值舍入为整数的几个方法:Math.ceil().Math.floor()和Math.round(). 这三个方法分别遵循下列舍入规则:Math.ceil()执 ...
- 小程序 wx.request ajax示例
简单示例 https://developers.weixin.qq.com/miniprogram/dev/api/network-request.html wx.request({ method: ...
- mysql 字面值
mysql 数据库中实现了许多的数据类型.通常我们用的最多的是在建表的时候指定列的数据类型 如:brithday date default '2000-01-01' 那么我们如何给字面值(直接量)指定 ...
- 点滴积累【JS】---JS实现动画闪烁效果
效果: 思路:首先获得图片数组,然后做JS定时用setTimeout和setInterval在用显示隐藏实现闪烁效果. 代码: <!DOCTYPE html PUBLIC "-//W3 ...
- 推荐一个入门最佳Git教程
这是我最近发现的一个针对入门Git教程,浅显易懂,点到为止,很适合初学者及使用Git的爱好者,学完该教程应付开发工作绰绰有余. http://www.liaoxuefeng.com/wiki/0013 ...
- Shape Control for .NET
Shape Control for .NET Yang Kok Wah, 23 Mar 2017 CPOL 4.83 (155 votes) Rate this: vote 1vote 2v ...
- json中把非json格式的字符串转换成json对象再转换成json字符串
JSON.toJson(str).toString()假如key和value都是整数的时候,先转换成jsonObject对象,再转换成json字符串
- hdu1285 确定比赛名次(拓扑排序多种方法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 Problem Description 有N个比赛队(1<=N<=500),编号依次 ...
- wait和waitpid
当有多个子进程的SIGCHLD信号到达父进程的时候,如果父进程用wait等待,那么父进程在处理第一个达到的SIGCHLD信号的时候,其他的SIGCHLD信号被堵塞,而且信号不被缓存,这样就会导致信号丢 ...