写项目的时候,碰到一个需求,就是在手机端根据指定的文件内容生成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文件生成的更多相关文章

  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. spring 3.0系统集成webservice

    spring 3.0系统集成webservice,踩了很多坑以后总算成功了,故写下这篇博客以记录. 1.准备jar包 由于项目是spring3.0,所以应该要使用cxf 2.7版本才可以成功配置,高版 ...

  2. HDU 1695 GCD(容斥定理)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  3. oracle 统计分析函数

    http://www.cnblogs.com/advocate/archive/2010/11/16/1878693.html

  4. HTTP协议-状态码详解(转)

    原文:http://www.cnblogs.com/lebronjames/archive/2013/01/10/2854981.html HTTP状态码的学习资料到处都有,但是都是理论上讲解.  本 ...

  5. 将SVM用于多类分类

    转自:http://www.lining0806.com/%E5%B0%86svm%E7%94%A8%E4%BA%8E%E5%A4%9A%E7%B1%BB%E5%88%86%E7%B1%BB/ SVM ...

  6. AngularJS 路由:ng-route 与 ui-router

    AngularJS的ng-route模块为控制器和视图提供了[Deep-Linking]URL. 通俗来讲,ng-route模块中的$routeService监测$location.url()的变化, ...

  7. C++ virtual继承

    C++ virtual继承的还有一种名称是菱形继承.主要目的是用于解决从不同类继承来的同名数据成员在内存中有不同的拷贝.造成数据不统一的问题,以致于在进行类释放时造成内存泄漏. 将共同的基类作为虚基类 ...

  8. 每日英语:Asia Has World's Biggest Pay Gap, Study Finds

    In Asia, middle managers such as department heads make more than 14 times as much as operational emp ...

  9. iOS 开发如何入门

    iOS 开发如何入门 新人如何入门 上一篇文章的回复中,很多读者让我推荐入门图书.其实我觉得每个人可能有自己喜欢的学习方式,我习惯的不一定适合你.不过我可以分享一下我当时是如何学习 iOS 开发的. ...

  10. QQ连连看-外挂

    QQ连连看-外挂 2014-11-06 参考 [1] [视频教程] c语言实践课程之qq连连看辅助开发 [2] CE工具下载 [3] [原创]qq连连看外挂制作详解