说在前面的话

最近在做的一个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。 下图是它们之间的关系。(下面这张图明白了, 那你基本就掌握了)。

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:

- (IBAction)printContent:(id)sender {UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController];if  (pic && [UIPrintInteractionController canPrintData: self.myPDFData] ) {pic.delegate = self;UIPrintInfo *printInfo = [UIPrintInfo printInfo];printInfo.outputType = UIPrintInfoOutputGeneral;printInfo.jobName = [self.path lastPathComponent];printInfo.duplex = UIPrintInfoDuplexLongEdge;pic.printInfo = printInfo;pic.showsPageRange = YES;pic.printingItem = self.myPDFData;void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =^(UIPrintInteractionController *pic, BOOL completed, NSError *error) {self.content = nil;if (!completed && error)NSLog(@"FAILED! due to error in domain %@ with error code %u",error.domain, error.code);};if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {[pic presentFromBarButtonItem:self.printButton animated:YEScompletionHandler:completionHandler];} else {[pic presentAnimated:YES completionHandler:completionHandler];}
}
  • 通过在iPhone上测试, 显示出的全部是英文的,不要担心, 因为这是系统的控件,也就是说系统会自动帮你作国际化处理,你不用作任何事情!
    你唯一要作的事–––将Info.plist文件中的第一项 Localization native development region(CFBundleDevelopmentRegion)的值设为 China(zh_CN);


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文档的代码:
- (IBAction)printContent:(id)sender {UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController];pic.delegate = self;UIPrintInfo *printInfo = [UIPrintInfo printInfo];printInfo.outputType = UIPrintInfoOutputGeneral;printInfo.jobName = self.documentName;pic.printInfo = printInfo;UIMarkupTextPrintFormatter *htmlFormatter = [[UIMarkupTextPrintFormatter alloc]initWithMarkupText:self.htmlString];htmlFormatter.startPage = 0;htmlFormatter.contentInsets = UIEdgeInsetsMake(72.0, 72.0, 72.0, 72.0); // 1 inch marginspic.printFormatter = htmlFormatter;pic.showsPageRange = YES;void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {if (!completed && error) {NSLog(@"Printing could not complete because of error: %@", error);}};if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {[pic presentFromBarButtonItem:sender animated:YES completionHandler:completionHandler];} else {[pic presentAnimated:YES completionHandler:completionHandler];}
}

  • 将UIWebView 界面上显示的内容打印出来。
- (void)printWebPage:(id)sender {UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController];void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {if(!completed && error){NSLog(@"FAILED! due to error in domain %@ with error code %u",error.domain, error.code);}};UIPrintInfo *printInfo = [UIPrintInfo printInfo];printInfo.outputType = UIPrintInfoOutputGeneral;printInfo.jobName = [urlField text];printInfo.duplex = UIPrintInfoDuplexLongEdge;controller.printInfo = printInfo;controller.showsPageRange = YES;UIViewPrintFormatter *viewFormatter = [self.myWebView viewPrintFormatter];viewFormatter.startPage = 0;controller.printFormatter = viewFormatter;if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {[controller presentFromBarButtonItem:printButton animated:YES completionHandler:completionHandler];}else[controller presentAnimated:YES completionHandler:completionHandler];
}

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

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


总结

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

在iOS上使用AirPrint实现无线打印功能相关推荐

  1. 安卓调用PrinterShare实现无线打印功能

    最近项目需要用到蓝牙打印,百度了很多资料,关于安卓移动打印的文章都不是很详细.要知道自己去写一个蓝牙打印模块那可是一个比较大的工作量了,而且还需要对市面上的打印机进行兼容.这个我引用一篇文章大家看下: ...

  2. 在该系统上全局禁用了虚拟打印功能,不会为该虚拟机启用此功能--解决办法

    问题描述:在开启此虚拟机时,提示在该系统上全局禁用了虚拟打印功能,不会为该虚拟机启用此功能. 解决办法:在VMware workstation页面依次点击 编辑--首选项--设备--启用虚拟机打印-- ...

  3. 在Ubuntu上用cups api实现打印功能

    ​ 最近由于工作需要,要写一套打印相关的接口. Linux上一般自带一套管理打印机的通用工具,叫cups. 它提供了打印机的连接,配置,打印等等功能,因此我这次选择用cups的api来实现打印相关的内 ...

  4. 【iOS】保存PDF文件和打印功能

    新的需求又来了,这次的需求是用户可以在App中打印当前页面,也可以将当前页面保存成pdf文件,以便日后打印. 首先解决一下保存文件的问题,用户需要在文件管理中能查看pdf文件.iOS允许暴露给用户的只 ...

  5. VMware虚拟机提示在该系统上全局禁用了虚拟机打印功能

    问题: 解决步骤:

  6. 在该系统上全局禁用了虚拟打印功能,不会为该虚拟机启用此功能。虚拟设备“serial0“”将开始断开连接。

    VMware Workstation安装Ubuntu时,出现 解决方法: 点击"编辑",选择"首选项" 喜欢技术的,一起进群交流学习吧!!!

  7. 邮宝打印面单尺寸调整_摆脱束缚,自由轻松!无线打印奥利给(上)

    说起无线打印,不少人都会觉得这是个高端的玩意儿,甚至觉得有些鸡肋_,不就还是打印吗?插线和没插线能有多大区别.这种想法在以往打印机只为单机服务时也许问题还不大,可如今别说大中型企业了,就是小微企业往往 ...

  8. 惠普打印机m226dn教程_WiFi当道 手把手教你完成手机无线打印

    [中关村在线办公打印频道原创]我们从一个地方到另一个新地方,利用率最多的一句话大概就是"这里有WiFi吗",可见"WiFi君"的重要性.那么公司的WiFi除了日 ...

  9. 手机使用计算机网络打印机,手机也可连接打印机 NETGEAR WNDR4700 无线打印

    现如今越来越多的路由器趋近于智能化,也融入了更多的生活元素,为了让生活中许多事情做起来更方便,路由器厂商也是煞费苦心.就像美国网件NETGEAR 的一款产品 WNDR4700一样,竟然可以让手机连接上 ...

  10. 华为手机如何连接无线打印服务器,惊呆了!华为Mate 20居然支持无线打印

    原标题:惊呆了!华为Mate 20居然支持无线打印 在办公室里,想要打印一些资料.照片,日常情况基本是这样的:如果文件在电脑里,那么只要选择局域网里的打印机就可以了,但如果文件在手机里,恐怕就得麻烦很 ...

最新文章

  1. 基于QProbe创建基本Android图像处理框架
  2. NC:南农团队解码并重构微生物群体感应系统
  3. 数据通信技术_华为数据通信创新峰会在长春圆满举行
  4. hdu 1753大小数相加
  5. Spring - BeanDefinition的注册顺序 DeffredImportSelector
  6. _Linux安装软件方法总结
  7. Tomcat 下载安装、配置、启动、报错问题
  8. linux u盘新建文件夹加密,linux磁盘的加密保护以及u盘加密的方法。
  9. Unity动画系统经验谈:换装系统与骨骼调节
  10. 无法移动或重命名“Documents and Settings”文件夹
  11. 在Global中Application_Error事件处理错误信息
  12. python异步调用_python如何实现异步调用函数执行
  13. BigDecimal 加减乘除 | 比较大小 | 取最大最小值 | 保留小数位 |转String
  14. sw修改器初始化服务器错误,solidworks打开出现Loadlibrary failed with error 1114:动态链接库(DLL)初始化例程失败如何解决?...
  15. dubbo源码解析-spi(四)
  16. 通过read_excel打开xls文件时,报错struct.error: unpack requires a bytes object of length 2
  17. Tomcat中temp文件夹出现项目副本问题的解决方法
  18. uni-app设置背景图自适应手机屏幕尺寸
  19. 开博客,立决心,学oracle,做DBA!
  20. 22/04/30本周总结

热门文章

  1. 新能源汽车行业资讯-2022-9-13
  2. 【数据处理】——利用Excel VBA批量将详细地址转换成省市区三级行政区划
  3. ATAPI(磁盘端口驱动)级文件保护简单实现
  4. smart原则_目标管理:OKR与SMART原则的异同
  5. H264格式 详细介绍
  6. 在计算机上配置超级终端,电脑中如何添加超级终端?添加超级终端的方法
  7. window.opener 与 window.dialogArguments的用法
  8. 禁止QQ自动转义表情字符
  9. 全体离职员工致某IT老板的一封公开信
  10. 基础回顾:测井曲线划分油、气、水层