新的需求又来了,这次的需求是用户可以在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文件和打印功能相关推荐

  1. wps js宏实战案例:批量汇总订单数据、识别黑名单、自动统计业绩、每笔订单生成带条形码的发货单并输出为pdf文件用于打印

    wps js支持ES6语法,对比vba能节省非常多的代码量,不过缺点也很明显,wps js环境暂时不支持调用win系统组件和第三方控件.小声比比:可能有调用的方法,只是我没发现. 基本需求: 可以选择 ...

  2. 保存pdf文件的一种方法

    功能:保存pdf文件 判断是否为pdf:(ctrl+s)弹出保存框保存的文件夹后缀为pdf类型则为pdf文件 可以扩展为任何的类型 实现原理其实比较简单:实现热键 strl+s  然后执行热键 ent ...

  3. PDF文件只能打印出第一页

    PDF文件只能打印出第一页 异常表现 解决过程 取消不了的任务怎么办? 异常表现 PDF有好多页,都可以正常预览 打印时,只打印出第一页,后续页面打印不出 该打印任务卡死,无法取消 新任务因该任务进程 ...

  4. 极速pdf文件打印时此计算机未连接到网络,PDF文件不能打印的五种解决方案

    原标题:PDF文件不能打印的五种解决方案 有时我们会发现有些PDF文档虽然能够正常打开,点击打印缺没有反应,是打印机坏了吗?当然不是,PDF不能打印90%是被加密,想要正常重新打印其实很简单. 方式一 ...

  5. Vue实现PDF导出和打印功能

    在Vue页面上实现PDF导出和打印功能依赖于两个npm插件,分别为vue-to-pdf和vue-easy-printer. 安装命令: npm i vue-to-pdf --save npm i vu ...

  6. PDF文件怎么打印?几个步骤轻松教会你

    提到PDF格式的文件,相信很多已经在工作的小伙伴们不会陌生,毕竟PDF文件的优点非常多,不管是分享查阅以及本身的安全性较高,我们平时很多文档文件都会使用保存为PDF的格式.想必大家也知道PDF格式的文 ...

  7. 【教程】PDF组件Spire.PDF 教程:在C#中显示PDF文件的打印预览

    本文演示如何使用Spire.PDF和c#在Windows窗体应用程序中显示PDF文件的打印预览. 在使用下面的代码之前,我们需要创建一个Windows窗体应用程序,在窗体中添加一个PrintPrevi ...

  8. 解决PDF文件无法打印的问题(安全保护)

    解决PDF文件无法打印的问题(安全保护),非常有效,直接解密(不是遍历硬破解那种) [size=large][b]Ault PDF Password Recover[/b][/size]

  9. PDF 文件无法打印、转换、合并、修改,提示“PDF文件已被保护” 密码移除

    带密码保护的 PDF文件无法打印.转换.合并.修改时,常用办法有以下几种 一.在线转换成其他格式 一般除了纯文字性的比较清晰的文档,其他带排版的文档经过转换,格式会变,或出现字符缺失.乱码等 通常在线 ...

最新文章

  1. live555的编译及使用
  2. 新预训练模型CodeBERT出世,编程语言和自然语言都不在话下
  3. echarts学习文档
  4. mongoDB 删除集合后,空间不释放的解决方法
  5. 阿里不让 MySQL 多表 Join ?我偏要!
  6. springboot-mail
  7. 【LeetCode】跳水板
  8. Linux定制history命令的输出格式
  9. Objective-C控制语句
  10. Python version 3.3 required, which was not found in the registry
  11. yum安装Elasticsearch5.x
  12. win32 api 显示一张位图的简单代码,释疑用的。
  13. 淘淘商城第34讲——内容管理
  14. Wintel做不了“山寨机顶盒”的救星
  15. 教程|教你如何给你的头像添加一个好看的国旗
  16. Python 爬虫:抓取豆瓣top250电影数据
  17. IO缓冲区(buffer)的原理及作用
  18. 黄金票据的制作与使用
  19. 计算机游戏是什么意思,端游是什么意思啊,吃鸡端游是什么意思啊
  20. Android 12 Watchdog(4) Trace生成过程

热门文章

  1. 自媒体写作秘籍——每天1小时,1个月涨粉3W+易撰自媒体
  2. OPPO Find X6屏幕参数怎么样 屏幕好不好? OPPO Find X6 电池容量多大
  3. 开心一刻,魔道,天官
  4. python里的demo是什么_Python类demo详解
  5. 接口自动化框架python+pytest+Allure 思路总结
  6. 苹果手机怎么连接蓝牙耳机_苹果手机用哪个蓝牙耳机?(不买air)?
  7. 聊聊本科的毕业设计如何合理选题?
  8. php bootstrap表格,Bootstrap表格
  9. js 实现表格统计 html,js实现html表格增减
  10. 中国银行将构建以电商为核心的网络银行