说在前面的话

最近在做的一个iOS项目有个打印 pdf的功能。查找资料发现苹果早在 iOS 4.2 就有了 AirPrint 功能。网上关于AirPrint 的资料不多,所以就写了这篇博文。 下面就和大家分享一下自己的学习收获。

内容

1, 什么是AirPrint

  • 其实就是将iOS(iphone,ipad)上的内容,使用支持AirPrint的打印机打印出来。打印过程无线控制, 非常方便。

2, 第一手资料

  • 学习iOS, 第一手资料肯定非苹果官方文档莫属.
    here。 (我下面叙述的内容基本上是对文档的总结, 英语可以的建议直接看文档。。。)

3, Printer Simulator,使用打印模拟器进行测试

  • 既然涉及打印功能,那么就需要有一台支持AirPrint 功能的打印机进行测试喽,你没有?没关系!苹果已经为我们准备好了模拟器。 这个模拟器在Xcode中没有, 需要自己到官网下载:
    下载Printer Simulator (需要先注册登录)

    打印模拟器位置

4, 了解一下AirPrint可以打印的内容

  1. an array of ready-to-print images and PDF documents: 一组图片文件和PDF文件。

  2. a single image or PDF document: 一张图片或是一个pdf文件。、

  3. an instance of any of the built-in print formatter classes: 打印格式化者的实例。(简单文本,html文档,某些View显示的内容)。

  4. a custom page renderer: 自定义页渲染者。
    注释: 1,2 很简单,就不详细解释了,3,4姑且这样翻译了,不懂没关系, 继续向下看。。。

5, 关于AirPrint的API

  • AirPrint的api包含 eight classes and one protocol。 下图是它们之间的关系。(下面这张图明白了, 那你基本就掌握了)。

AirPrint相关类

UIPrintInteractionController 属性:

  1. UIPrintInfo *printInfo: 打印任务的信息。

  2. UIPrintPaper * printPaper : 打印内容的区域。

  3. delegate: 遵守UIPrintInteractionControllerDelegate 协议的代理。

  4. 最重要的就是制定需要打印的内容: printingItem , printingItems, printFormatter, printPageRenderer。 四个属性都是用来指定要打印的内容的。 这四个参数是互斥的, 也就是说只要一个赋值, 其他三个参数就得是nil. 很容易理解,一个打印任务, 不能同时干多个活呀。 这里如果使用 swift的枚举,就很容易理解了。
    这里提到的四个关于内容的属性, 和 第4 点是关联起来的。 下面这张表是对应关系:

    需要打印的内容与相应参数的对应方式

6, 打印流程

  1. 创建 UIPrintInteractionController 实例。

  2. 创建UIPrintInfo 实例。 并 配置参数 output type(输出类型), print orientation(打印方向), job name(打印工作标识), 然后赋值给UIPrintInteractionController 实例的 printInfo属性。

  3. 给delegate 属性赋值, 赋的值必须遵守 UIPrintInteractionControllerDelegate 协议。 这个代理可以 响应 printing options界面的显示和消失, 打印工作的开始和结束 等。

  4. 指定要打印的内容。 也就是指定 printingItem , printingItems, printFormatter, printPageRenderer. 参数的其中一个。

  5. 当你使用 printPageRenderer. 时情况会复杂一些。 你可以绘制每一页的header, footer, 内容。 这是你需要自己计算页数。 另外, 你也可以创建一个或多个 UIPrintFormatter实例, 通过 addPrintFormatter:startingAtPageAtIndex: 或者 printFormatters参数 赋值给 printPageRenderer.实例。 这种情况下不需要自己计算多少页。

  6. 最后就是显示显示出printing options 界面了。 方法: 
    在iPad上:   presentFromBarButtonItem:animated:completionHandler: 或者 presentFromRect:inView:animated:completionHandler:;

    在手机上: presentAnimated:completionHandler:

说了这么多, 理论知识就介绍的差不多了, 下面通过代码演示具体实现。

7,Printing Printer-Ready Content (打印准备好的内容)

  • AirPrint可以直接打印一些内容。 这些内容是 NSData, NSURL, UIImage, and ALAsset 类的实例, 但是这些实例的内容, 或者引用的类型(NSURL)必须是 image 或者pdf.
  • 对于 image来说, NSData, NSURL, UIImage, and ALAsset 类型都可以的。 对于PDF, 只能使用 NSData, NSURL。 然后需要将这些数据实例直接赋值 给 UIPrintInteractionController实例的 printingItem 或者 printingItems 属性。

  • 打印pdf:

  1. - (IBAction)printContent:(id)sender {

  2. UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController];

  3. if (pic && [UIPrintInteractionController canPrintData: self.myPDFData] ) {

  4. pic.delegate = self;

  5. UIPrintInfo *printInfo = [UIPrintInfo printInfo];

  6. printInfo.outputType = UIPrintInfoOutputGeneral;

  7. printInfo.jobName = [self.path lastPathComponent];

  8. printInfo.duplex = UIPrintInfoDuplexLongEdge;

  9. pic.printInfo = printInfo;

  10. pic.showsPageRange = YES;

  11. pic.printingItem = self.myPDFData;

  12. void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =

  13. ^(UIPrintInteractionController *pic, BOOL completed, NSError *error) {

  14. self.content = nil;

  15. if (!completed && error)

  16. NSLog(@"FAILED! due to error in domain %@ with error code %u",

  17. error.domain, error.code);

  18. };

  19. if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

  20. [pic presentFromBarButtonItem:self.printButton animated:YES

  21. completionHandler:completionHandler];

  22. } else {

  23. [pic presentAnimated:YES completionHandler:completionHandler];

  24. }

  25. }

  • 通过在iPhone上测试, 显示出的全部是英文的,不要担心, 因为这是系统的控件,也就是说系统会自动帮你作国际化处理,你不用作任何事情!
    你唯一要作的事–––将Info.plist文件中的第一项 Localization native development region(CFBundleDevelopmentRegion)的值设为 China(zh_CN);

Printer Options显示英文

将英文修改成中文

8, Using Print Formatters (打印格式化者)

系统提供了三个 Print Formatters类, 分别是:

  1. UIViewPrintFormatter—automatically lays out the content of a view over multiple pages. To obtain a print formatter for a view, call the view’s viewPrintFormatter method. Not all built-in UIKit classes support printing. Currently, only the view classes UIWebView, UITextView, and MKMapView know how to draw their contents for printing. View formatters should not be used for printing your own custom views. To print the contents of a custom view, use a UIPrintPageRenderer instead.

  2. UISimpleTextPrintFormatter—automatically draws and lays out plain-text documents. This formatter allows you to set global properties for the text, such a font, color, alignment, and line-break mode.

  3. UIMarkupTextPrintFormatter—automatically draws and lays out HTML documents.

  • 英文介绍已经很详细了, 就不啰嗦了, 直接展示出打印HTML文档的代码:
  1. - (IBAction)printContent:(id)sender {

  2. UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController];

  3. pic.delegate = self;

  4. UIPrintInfo *printInfo = [UIPrintInfo printInfo];

  5. printInfo.outputType = UIPrintInfoOutputGeneral;

  6. printInfo.jobName = self.documentName;

  7. pic.printInfo = printInfo;

  8. UIMarkupTextPrintFormatter *htmlFormatter = [[UIMarkupTextPrintFormatter alloc]

  9. initWithMarkupText:self.htmlString];

  10. htmlFormatter.startPage = 0;

  11. htmlFormatter.contentInsets = UIEdgeInsetsMake(72.0, 72.0, 72.0, 72.0); // 1 inch margins

  12. pic.printFormatter = htmlFormatter;

  13. pic.showsPageRange = YES;

  14. void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =

  15. ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {

  16. if (!completed && error) {

  17. NSLog(@"Printing could not complete because of error: %@", error);

  18. }

  19. };

  20. if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

  21. [pic presentFromBarButtonItem:sender animated:YES completionHandler:completionHandler];

  22. } else {

  23. [pic presentAnimated:YES completionHandler:completionHandler];

  24. }

  25. }

  • 将UIWebView 界面上显示的内容打印出来。
  1. - (void)printWebPage:(id)sender {

  2. UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController];

  3. void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =

  4. ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {

  5. if(!completed && error){

  6. NSLog(@"FAILED! due to error in domain %@ with error code %u",

  7. error.domain, error.code);

  8. }

  9. };

  10. UIPrintInfo *printInfo = [UIPrintInfo printInfo];

  11. printInfo.outputType = UIPrintInfoOutputGeneral;

  12. printInfo.jobName = [urlField text];

  13. printInfo.duplex = UIPrintInfoDuplexLongEdge;

  14. controller.printInfo = printInfo;

  15. controller.showsPageRange = YES;

  16. UIViewPrintFormatter *viewFormatter = [self.myWebView viewPrintFormatter];

  17. viewFormatter.startPage = 0;

  18. controller.printFormatter = viewFormatter;

  19. if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

  20. [controller presentFromBarButtonItem:printButton animated:YES completionHandler:completionHandler];

  21. }else

  22. [controller presentAnimated:YES completionHandler:completionHandler];

  23. }

10, Using a Page Renderer(页渲染器)

这部分内容是最复杂的了, 感觉不怎么用,暂且不深究了, 大家如果项目需要, 自己看文档吧。

总结

到这里,我学习到的 AirPrint的主要技术点已经和大家分享完了。基本可以搞定大部分的需求。 如果那里说错了, 非常欢迎大家能给提出。 另外刚开始写技术博客, 经验不足, 希望大家多提宝贵意见。

作者:hejunm
链接:http://www.jianshu.com/p/f5863a1833d0
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转载于:https://my.oschina.net/huqiji/blog/1518015

使用iOS AirPrint 让你的APP轻松实现打印功能相关推荐

  1. uniapp中使用lodop打印控件实现app广域、局域网打印功能,亲测可用

    文章目录 前言 一.本文目的 二.使用步骤 1.准备工作 2.引入库文件 3.页面使用 总结 前言 在项目中使用了lodop控件,然而蛋疼的发现这玩意uniapp app端不能直接使用,在vip售后群 ...

  2. 巧用推荐墙入口,APP轻松盈利

    巧用推荐墙入口,APP轻松盈利 对不少资深移动应用开发者来说,对有米推荐墙并不陌生.推荐墙是有米广告集成优质应用和游戏供用户下载,同时开发者获得相应的广告收入的一种友好的广告形式.早在2012年2月, ...

  3. IOS开发设置应用程序App启动图片

    IOS开发设置应用程序App启动图片 在资源Assets 的图片区域 右键建立一个Launch Image ,如第二张图,然后把相应的启动图片拖进去. 最后选中项目,找到 Assets ,设置 启动图 ...

  4. 捕获iOS模拟器视频以进行App预览

    本文翻译自:Capture iOS Simulator video for App Preview Okay, so we can now submit video previews of our a ...

  5. 苹果ios签名过期了,APP应用还能照常使用吗?

    对于苹果签名,相信很多小伙伴们都不是很了解,尤其是刚刚接触的,他们在和小编的聊天过程中,都会向小编咨询同一个问题,如果苹果ios签名到期了,app应用还能继续使用吗?对于这个问题我们要具体问题具体分析 ...

  6. iOS动手做一个直播app开发(代码篇)

    iOS动手做一个直播app开发(代码篇) ###开篇 好久没写简书,因为好奇的我跑去学习直播了,今天就分享一下我的感慨. 目前为止直播还是比较热点的技术的,简书,git上有几篇阅读量和含金量都不错的文 ...

  7. IOS个人账户转公司账户,TPshop APP提交审核

    IOS个人账户转公司账户,TPshop APP提交审核 之前的TPshop IOS版用个人账户提交审核的, 最近更新一个版本, 要求使用公司账户. 没办法, 在人家的地盘上玩就得遵守人家的规则,于是计 ...

  8. 9月27日云栖精选夜读:阿里云首推免费人脸识别SDK 让每个APP轻松拥有短视频AR特效...

    摘要: 早在今年五月,阿里云已经推出了短视频解决方案.近日,阿里云再次率先颠覆行业,在业内首推免费的人脸识别SDK,结合其原有的短视频能力,大大降低了人脸识别+AR特效+短视频的入行门槛. 早在今年五 ...

  9. IOS抖音短视频APP开发关于扫描二维码,并根据文本生成二维码

    IOS抖音短视频APP开发关于扫描二维码,(根据光线强弱显示隐藏闪光灯)并根据文本生成二维码. WeakSelf; //IOS抖音短视频APP开发构建扫描样式视图 _scanView = [[WSLS ...

  10. 9月27日云栖精选夜读:阿里云首推免费人脸识别SDK 让每个APP轻松拥有短视频AR特效

    想不想知道是什么 早在今年五月,阿里云已经推出了短视频解决方案.近日,阿里云再次率先颠覆行业,在业内首推免费的人脸识别SDK,结合其原有的短视频能力,大大降低了人脸识别+AR特效+短视频的入行门槛. ...

最新文章

  1. bokeh pandas_使用Pandas和Bokeh将Rolling Stone的500张最伟大专辑可视化
  2. PL/SQL编程:用for循环算出5的阶乘
  3. ultraMaskedEdit使用心得
  4. Swift 异常处理
  5. Hbase Solr 二级索引 同步int数据报错com.ngdata.hbaseindexer.parse.ByteArrayValueMappers: Error mapping byte
  6. 基于JRTPLIB库的RTP数据传输设计文档(1)
  7. 基于Promise对象的新一代Ajax API--fetch
  8. 卢伟冰暗示Redmi K30 Pro:亮点多多值得再憋憋
  9. Linux中同步MySQL
  10. Webstorm 下的Angular2.0开发之路
  11. Ajax与jQuery异步加载数据
  12. microsoft excel 正在等待其他某个应用程序_(Mac常见问题)都有哪些应用程序可以在M1 Mac上运行?...
  13. C语言:丹尼斯·里奇的不朽遗产
  14. linux安装db2数据库并设置开机自启动
  15. html网页中wmode,关于html:Quicktime-Wmode透明问题
  16. 佳能打印机 出现5100错误怎么办
  17. python实现匿名发邮件_Python 实现邮件发送功能(初级)
  18. iPhone6 微信视频通话没有声音
  19. 计算机网络协议ppt,计算机网络基础——TCP-IP协议.ppt
  20. [hadoop3.x]HDFS中的内存存储支持(七)概述

热门文章

  1. 高等数学公式(latex)
  2. 计算机代码大全喜欢你,2020微信表白代码大全
  3. 机器码、序列号、认证码、注册码的生成算法(五)
  4. 昂达obook11安装Linux,隐藏超大彩蛋!昂达oBook11居然支持手写笔?
  5. class文件的加载过程
  6. 怎么使用et代理换ip软件切换电脑手机的上网ip_使用教程
  7. 什么是静态网页 什么是HTML5,什么是静态网页?
  8. 创建MSN界面式的Ext JS布局
  9. 帝国cms 7.5 wap标签大全
  10. Oracle账号及客户端下载