iOS开发--APP调用打印机(非蓝牙)

日常的生活与工作中,有时候难免需要从 iPhone 手机上打印一些文件内容。由于我们使用的 iPhone 手机与打印机,以及连接打印机的电脑系统平台的差别,从而导致我们的手机不能直接连接打印机。iPhone 其实是支持网络打印的,但只是针对一些特殊的支持的 iPhone 的打印机。这里简单介绍一些方法,可以让我们的 iPhone 连接到网络打印机或电脑上的普通打印机,从而实现打印的功能。最近的项目中,刚好遇到这样的一个功能,把APP调用打印机整理一下;

首先感谢NSHipster

真机测试图.png

功能原理:

利用苹果iOS系统内置AirPrint功能WiFi无线打印照片,Word,PDF等各种文件到你的Air Printer打印机,但有个前提是你的打印机必须支持苹果Air Print功能,即AirPrint-Enable Printer。

打印机型号:

目前打印机品牌如兄弟、佳能、戴尔、惠普、利盟和三星都开始制造兼容AirPrint的打印机,对于普通打印机目前有些还不支持。

iPhone调取打印机:

方法一、通过 QQ 来打印

无论是在电脑上,还是在 iPhone 手机上,相信大家都会安装 QQ 这款通讯软件。当前 QQ 最新的版本支持手机连接电脑端的打印机,也就是说当我们的 QQ 在电脑上登录以后,在 iPhone 手机上的 QQ 可以远程连接到电脑上进行文件的打印。

在 iPhone 上登录 QQ 软件,点击底部的“联系人”栏目.png

方法二、 iPhone中支持AirPrint的应用

大多数来自苹果的应用都支持,象Mail,Safari和iPhoto。你还可以从手机中打印电子邮件、文档和图片。

iPhoto.png

方法三、 通过应用打印

访问iTunes应用商店,找到打印应用。你会找到一个供选择的支持从iPhone打印的应用列表。关于下载应用的更多信息可以查阅如何从iTunes 应用商店下载和使用应用。


打印任务,首先看下打印选项配置

UIPrintInteractionController

UIKit 打印 APIs 的核心是 UIPrintInteractionController。这个类的一个共享实例管理着打印工作的细节和配置任何将要呈现给用户的 UI。它还为你的内容的格式提供了三个级别的控制。

UIPrintInteractionController设置

这里有些关于UIPrintInteractionController的设置你需要配置下在开始展示打印UI之前。它们包括:

UIPrintInteractionController设置.png

将你的内容格式化

通过UIPrintInteractionController四个不同的属性,你可以选择你想要的内容控制规格(复杂度)。

内容格式化.png

UIPrintInfo

UIPrintInfo实例中存放着打印任务详情设置。你可以找到如下属性:

UIPrintInfo.png

代码

打印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 或 .LongEd​​ge。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上弹出打印那个页面  
    }  
    
    
}

iOS打印 AirPrint

随手点个喜欢吧~

关注我

QQ--iOS 交流群:107548668

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 最近竞品公司出了一个接入蓝牙打印机的功能,作为竞争对手公司肯定不能少所以就给我分了任务,搞定蓝牙打印机 首先介绍一...
    呆北默阅读 3,109评论 12 10
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • 我生于江苏偏北块儿靠海的一座小城。小城小城,岁月静好。一条蜿蜒曲折河,流经小城,流向远方,小城生活便在河流前行中安...
    玥九爷阅读 543评论 5 2
  • 当下的我,因为生病,早早上床休息,不用像两周前为了复习熬夜读书到十二点多,然后还失眠到一点多。 当下的我,可以尽情...
    逸包包阅读 242评论 0 1
  • 尊重客观性,一切从实际出发,注意时间和地点的变化,处理事情的方式会不同,明者因时而变,知者随时而制
    一片小心情阅读 103评论 0 0