【iOS】保存PDF文件和打印功能
新的需求又来了,这次的需求是用户可以在App中打印当前页面,也可以将当前页面保存成pdf文件,以便日后打印。
首先解决一下保存文件的问题,用户需要在文件管理中能查看pdf文件。iOS允许暴露给用户的只有Documents目录,暴露Documents目录只需要在info里添加两个字段
Application requires iPhone environment
Supports opening documents in place
ok,运行一下已经能在文件管理中看见documents的文件了。接下来处理保存成pdf的功能。
//保存viewNSMutableData *pdfData = [NSMutableData data];UIGraphicsBeginPDFContextToData(pdfData, [[[viewArray firstObject] layer] bounds], nil);//循环for (UIView *view in viewArray) {UIGraphicsBeginPDFPage();CGContextRef pdfContext = UIGraphicsGetCurrentContext();[[view layer] renderInContext:pdfContext];}UIGraphicsEndPDFContext();NSString *path = [ZYFileManager getDocumentFilePathWithName:@"xx.pdf"];BOOL isComplete = [ZYFileManager saveDataForPath:path withData:pdfData];if (show) {if (isComplete) {[ZYSVProgressHUD showSuccessWithStatus: @"保存PDF成功,请前往文件管理查看"];}else{[ZYSVProgressHUD showErrorWithStatus: @"保存PDF失败,请检查是否有足够空间"];}}
如果只保存一页pdf的话就不需要循环部分,直接去掉外层的forin。我这里是不确定pdf会有几页,所以将需要保存的view添加进数组,循环数组来添加page。
这里有个问题,最开始UIGraphicsBeginPDFContextToData这里我用的是view.bounds,保存成pdf之后是正常的,但是在打印时会缩到1/2大小。研究了一下发现是ui给的设计图中这个view的尺寸只有a4纸标准尺寸(21.0 / 2.54 * 72, 29.7 / 2.54 * 72)的一半。可view扩大之后页面显示就有问题。最后想了个笨办法,view创建的时候按照a4的尺寸创建,然后按比例缩小到显示的大小。所以在保存pdf的时候我用了view.layer.bounds来绘制,这样打印的时候a4是正好的大小。
最后就是打印。打印可以打印文本,照片,pdf文件等等,打印信息也可以选择文本,nsdata等等。我这里需求就是打印pdf文件,所以写的比较简单。思路就是先把要打印的view保存成pdf,然后获取pdf文件进行打印,打印结束后再删除pdf文件。
//先保存pdf,打印结束之后再删除pdf文件[self SX_XT_PrintViewPDFButtonClickHandleWithSource:viewArray isShow:show];//获取到刚刚的地址NSString *path = [ZYFileManager getDocumentFilePathWithName:@"xx.pdf"];//通过地址取文件NSData *pdfData = [NSData dataWithContentsOfFile:path];//创建打印对象UIPrintInteractionController *printer = [UIPrintInteractionController sharedPrintController];printer.delegate = self;//配置打印信息UIPrintInfo *Pinfo = [UIPrintInfo printInfo];Pinfo.outputType = UIPrintInfoOutputPhoto;//可打印文本、图形、图像Pinfo.jobName = @"xx";//可选属性,用于在打印中心中标识打印作业Pinfo.duplex = UIPrintInfoDuplexNone;//NONE为禁止双面Pinfo.orientation = UIPrintInfoOrientationPortrait;//打印纵向还是横向printer.printInfo = Pinfo;printer.printingItem = pdfData;[printer presentAnimated:YES completionHandler:^(UIPrintInteractionController * _Nonnull printInteractionController, BOOL completed, NSError * _Nullable error) {if (!completed && error) {[ZYSVProgressHUD showErrorWithStatus:@"打印失败"];NSLog(@"Error");}}];
最后在打印成功的协议方法里删掉pdf文件就ok了。
PS:打印测试我用的是苹果官方的打印机模拟器,附一个模拟器网盘备份。
https://pan.baidu.com/s/1CXbpSIbTjNsoipPPYAj5sQ 提取码: wcmx
【iOS】保存PDF文件和打印功能相关推荐
- wps js宏实战案例:批量汇总订单数据、识别黑名单、自动统计业绩、每笔订单生成带条形码的发货单并输出为pdf文件用于打印
wps js支持ES6语法,对比vba能节省非常多的代码量,不过缺点也很明显,wps js环境暂时不支持调用win系统组件和第三方控件.小声比比:可能有调用的方法,只是我没发现. 基本需求: 可以选择 ...
- 保存pdf文件的一种方法
功能:保存pdf文件 判断是否为pdf:(ctrl+s)弹出保存框保存的文件夹后缀为pdf类型则为pdf文件 可以扩展为任何的类型 实现原理其实比较简单:实现热键 strl+s 然后执行热键 ent ...
- PDF文件只能打印出第一页
PDF文件只能打印出第一页 异常表现 解决过程 取消不了的任务怎么办? 异常表现 PDF有好多页,都可以正常预览 打印时,只打印出第一页,后续页面打印不出 该打印任务卡死,无法取消 新任务因该任务进程 ...
- 极速pdf文件打印时此计算机未连接到网络,PDF文件不能打印的五种解决方案
原标题:PDF文件不能打印的五种解决方案 有时我们会发现有些PDF文档虽然能够正常打开,点击打印缺没有反应,是打印机坏了吗?当然不是,PDF不能打印90%是被加密,想要正常重新打印其实很简单. 方式一 ...
- Vue实现PDF导出和打印功能
在Vue页面上实现PDF导出和打印功能依赖于两个npm插件,分别为vue-to-pdf和vue-easy-printer. 安装命令: npm i vue-to-pdf --save npm i vu ...
- PDF文件怎么打印?几个步骤轻松教会你
提到PDF格式的文件,相信很多已经在工作的小伙伴们不会陌生,毕竟PDF文件的优点非常多,不管是分享查阅以及本身的安全性较高,我们平时很多文档文件都会使用保存为PDF的格式.想必大家也知道PDF格式的文 ...
- 【教程】PDF组件Spire.PDF 教程:在C#中显示PDF文件的打印预览
本文演示如何使用Spire.PDF和c#在Windows窗体应用程序中显示PDF文件的打印预览. 在使用下面的代码之前,我们需要创建一个Windows窗体应用程序,在窗体中添加一个PrintPrevi ...
- 解决PDF文件无法打印的问题(安全保护)
解决PDF文件无法打印的问题(安全保护),非常有效,直接解密(不是遍历硬破解那种) [size=large][b]Ault PDF Password Recover[/b][/size]
- PDF 文件无法打印、转换、合并、修改,提示“PDF文件已被保护” 密码移除
带密码保护的 PDF文件无法打印.转换.合并.修改时,常用办法有以下几种 一.在线转换成其他格式 一般除了纯文字性的比较清晰的文档,其他带排版的文档经过转换,格式会变,或出现字符缺失.乱码等 通常在线 ...
最新文章
- live555的编译及使用
- 新预训练模型CodeBERT出世,编程语言和自然语言都不在话下
- echarts学习文档
- mongoDB 删除集合后,空间不释放的解决方法
- 阿里不让 MySQL 多表 Join ?我偏要!
- springboot-mail
- 【LeetCode】跳水板
- Linux定制history命令的输出格式
- Objective-C控制语句
- Python version 3.3 required, which was not found in the registry
- yum安装Elasticsearch5.x
- win32 api 显示一张位图的简单代码,释疑用的。
- 淘淘商城第34讲——内容管理
- Wintel做不了“山寨机顶盒”的救星
- 教程|教你如何给你的头像添加一个好看的国旗
- Python 爬虫:抓取豆瓣top250电影数据
- IO缓冲区(buffer)的原理及作用
- 黄金票据的制作与使用
- 计算机游戏是什么意思,端游是什么意思啊,吃鸡端游是什么意思啊
- Android 12 Watchdog(4) Trace生成过程
热门文章
- 自媒体写作秘籍——每天1小时,1个月涨粉3W+易撰自媒体
- OPPO Find X6屏幕参数怎么样 屏幕好不好? OPPO Find X6 电池容量多大
- 开心一刻,魔道,天官
- python里的demo是什么_Python类demo详解
- 接口自动化框架python+pytest+Allure 思路总结
- 苹果手机怎么连接蓝牙耳机_苹果手机用哪个蓝牙耳机?(不买air)?
- 聊聊本科的毕业设计如何合理选题?
- php bootstrap表格,Bootstrap表格
- js 实现表格统计 html,js实现html表格增减
- 中国银行将构建以电商为核心的网络银行