日常的生活与工作中,有时候难免需要从 iPhone 手机上打印一些文件内容。由于我们使用的 iPhone 手机与打印机,以及连接打印机的电脑系统平台的差别,从而导致我们的手机不能直接连接打印机。iPhone 其实是支持网络打印的,但只是针对一些特殊的支持的 iPhone 的打印机。这里简单介绍一些方法,可以让我们的 iPhone 连接到网络打印机或电脑上的普通打印机,从而实现打印的功能。最近的项目中,刚好遇到这样的一个功能,把APP调用打印机整理一下;
首先感谢NSHipster
功能原理:
利用苹果iOS系统内置AirPrint功能WiFi无线打印照片,Word,PDF等各种文件到你的Air Printer打印机,但有个前提是你的打印机必须支持苹果Air Print功能,即AirPrint-Enable Printer。
打印机型号:
目前打印机品牌如兄弟、佳能、戴尔、惠普、利盟和三星都开始制造兼容AirPrint的打印机,对于普通打印机目前有些还不支持。
iPhone调取打印机:
方法一、通过 QQ 来打印
无论是在电脑上,还是在 iPhone 手机上,相信大家都会安装 QQ 这款通讯软件。当前 QQ 最新的版本支持手机连接电脑端的打印机,也就是说当我们的 QQ 在电脑上登录以后,在 iPhone 手机上的 QQ 可以远程连接到电脑上进行文件的打印。
方法二、 iPhone中支持AirPrint的应用
大多数来自苹果的应用都支持,象Mail,Safari和iPhoto。你还可以从手机中打印电子邮件、文档和图片。
方法三、 通过应用打印
访问iTunes应用商店,找到打印应用。你会找到一个供选择的支持从iPhone打印的应用列表。关于下载应用的更多信息可以查阅如何从iTunes 应用商店下载和使用应用。
打印任务,首先看下打印选项配置
UIPrintInteractionController
UIKit 打印 APIs 的核心是 UIPrintInteractionController。这个类的一个共享实例管理着打印工作的细节和配置任何将要呈现给用户的 UI。它还为你的内容的格式提供了三个级别的控制。
UIPrintInteractionController设置
这里有些关于UIPrintInteractionController的设置你需要配置下在开始展示打印UI之前。它们包括:
将你的内容格式化
通过UIPrintInteractionController四个不同的属性,你可以选择你想要的内容控制规格(复杂度)。
UIPrintInfo
UIPrintInfo实例中存放着打印任务详情设置。你可以找到如下属性:
代码
打印PDF
/**
* PDF
*
* @param sender <#sender description#>
*/
-(void)printAction:(id)sender{
NSString *str = [[NSBundle mainBundle] pathForResource:@"123.pdf" ofType:nil];
self.myPDFData = [NSData dataWithContentsOfFile:str];
UIPrintInteractionController* pic = [UIPrintInteractionController sharedPrintController];
NSData *imageData = [NSData dataWithData:self.myPDFData];
if (pic && [UIPrintInteractionController canPrintData:imageData])
{
pic.delegate = self;
// 打印任务细节在 UIPrintInfo 实例中设置。可以使用以下属性:
UIPrintInfo* printInfo = [UIPrintInfo printInfo];
// UIPrintInfoOutputType:给 UIKit 提供要打印内容的类型提示。可以是以下任意一个:
// .General(默认):文本和图形混合类型;允许双面打印。
// .Grayscale:如果你的内容只包括黑色文本,那么该类型比 .General 更好。
// .Photo:彩色或黑白图像;禁用双面打印,更适用于图像媒体的纸张类型。
// .PhotoGrayscale:对于仅灰度的图像,根据打印机的不同,该类型可能比 .Photo 更好。
printInfo.outputType = UIPrintInfoOutputGeneral;
// jobName String:此打印任务的名称。这个名字将被显示在设备的打印中心,对于有些打印机则显示在液晶屏上
printInfo.jobName = @"PrintingImage";
// UIPrintInfoDuplex:.None、.ShortEdge 或 .LongEdge。short- 和 long- 的边界设置指示如何装订双面页面,而 .None 不支持双面打印(这里不是 UI 切换为双面打印,令人困惑)
printInfo.duplex = UIPrintInfoDuplexShortEdge;
// UIPrintInfo:之前所述的打印任务的配置
pic.printInfo = printInfo;
// showsPageRange Bool:当值为 true 时,让用户从打印源中选择一个子范围。这只在多页内容时有用,它默认关闭了图像。
pic.showsPageRange = NO;
pic.printingItem = imageData;
void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {
if (!completed && error) {
NSLog(@"FAILED! due to error in domain %@ with error code %lu", error.domain, error.code);
}
};
// [pic presentAnimated:YES completionHandler:completionHandler];
if([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) {
[pic presentFromRect:self.view.frame inView:self.view animated:YES completionHandler:completionHandler];
}
else {
[pic presentAnimated:YES completionHandler:completionHandler];
}
}
}
打印UIWebView
/**
* UIWebView、
*
* @param sender <#sender description#>
*/
- (IBAction)clike:(UIButton *)sender {
UIPrintInteractionController *printC = [UIPrintInteractionController sharedPrintController];//显示出打印的用户界面。
printC.delegate = self;
UIPrintInfo *printInfo = [UIPrintInfo printInfo];//准备打印信息以预设值初始化的对象。
printInfo.outputType = UIPrintInfoOutputGeneral;//设置输出类型。
printC.showsPageRange = YES;//显示的页面范围
// 打印网页
[self.myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://nshipster.cn/uiprintinteractioncontroller/"]]];//网页
printC.printFormatter = [self.myWebView viewPrintFormatter];//布局打印视图绘制的内容。
// // 打印文本
// UISimpleTextPrintFormatter *textFormatter = [[UISimpleTextPrintFormatter alloc]
// initWithText:@"ここの ういえい 子に うぃっl willingseal 20655322 你好么? #@¥%……&*"];
// textFormatter.startPage = 0;
// textFormatter.contentInsets = UIEdgeInsetsMake(200, 300, 0, 72.0); // 插入内容页的边缘 1 inch margins
// textFormatter.maximumContentWidth = 16 * 72.0;//最大范围的宽
// printC.printFormatter = textFormatter;
//
// 等待完成
void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =
^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {
if (!completed && error) {
NSLog(@"可能无法完成,因为印刷错误: %@", error);
}
};
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:sender];//调用方法的时候,要注意参数的类型-下面presentFromBarButtonItem:的参数类型是 UIBarButtonItem..如果你是在系统的UIToolbar or UINavigationItem上放的一个打印button,就不需要转换了。
[printC presentFromBarButtonItem:item animated:YES completionHandler:completionHandler];//在ipad上弹出打印那个页面
// [printC presentFromRect:CGRectMake(500, 500, 100, 200) inView:self.webView animated:YES completionHandler:completionHandler];//第二种方法
} else {
[printC presentAnimated:YES completionHandler:completionHandler];//在iPhone上弹出打印那个页面
}
}