ios打印功能实现(ScrollerView打印)

不想解释了,这是做这么久ios以来最蛋疼的功能,没有之一,国内网站上一直找不到相关的,问群里也问不到,不过最后还是在国外网站上找到了,英文差真实软肋,悲催,先留下几个网站吧


最后用得是  #import "DHSmartScreenshot.h"  这个类库

   UIImage *printImage = [detailTableViewscreenshot];//打印就这一句话 

   PrintInfoViewController *printViewController =[[PrintInfoViewController alloc]init];

    printViewController.printImage = printImage;

   [self.navigationControllerpushViewController:printViewController animated:YES];


累觉不爱 !!!


是不是上面打印出来的 图片都是比较小的,没有充满整张A4 纸 ,解决这玩意儿 解决了 N天,国内网站关于打印相关的毛都找不到,国外又看不懂,被坑的不要不要的,哎 。。。 无意间看到项目中另外一个废弃地方打印的代码,深感不易,记下来供有缘人参考。。。



// 打印

-(void)printActionsbutton:(id)sender{

   //获取要打印的图片

   UIImage *printImage = [detailTableView screenshot];

   //剪切原图(824* 2235  这里需要说明下因为A4 纸的72像素的 大小是(595,824) 为了打印出A4 纸 之类把原图转化成A4 的宽度,高度可适当调高以适应页面内容的需求 ,调这个很简单地,打开你目前截取的图片,点击工具,然后点击调整大小,把宽度设置成595 就可以了,看高度是多少除以 824 就是 几页 ,不用再解释了吧。。。ios打印功能实现(ScrollerView打印)

    UIImage * scanImage = [self scaleToSize:printImage size:CGSizeMake(595, 1660)];

    

    UIImage *jietuImage = [self imageFromImage:scanImage inRect:CGRectMake(0, 0, 595, 880)];

    

   UIPrintInteractionController *printC = [UIPrintInteractionControllersharedPrintController];//显示出打印的用户界面。

    printC.delegate = self;

    

    if (!printC) {

       NSLog(@"打印机不存在");

       [selfshowAlertView:@"初始化失败"];

    }

   printC.showsNumberOfCopies = YES;

    printC.showsPageRange = YES;

   NSData *imgDate =UIImagePNGRepresentation(jietuImage);

    NSData *data = [NSData dataWithData:imgDate];

   if(printC &&[UIPrintInteractionController canPrintData:data]) {

       UIPrintInfo*printInfo = [UIPrintInfoprintInfo];//准备打印信息以预设值初始化的对象。

       printInfo.outputType=UIPrintInfoOutputGeneral;//设置输出类型。

       printC.showsPageRange = YES;//显示的页面范围

       

       //printInfo.jobName =@"my.job";

       printC.printInfo = printInfo;

       printC.printingItem =data;//single NSData, NSURL, UIImage, ALAsset

       

       //等待完成

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

       ^(UIPrintInteractionController*printController, BOOLcompleted, NSError *error){

          if (!completed &&error) {

              NSLog(@"可能无法完成,因为印刷错误:%@", error);

           }

       };

       if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

          UIBarButtonItem *item = [[UIBarButtonItem alloc]initWithCustomView:sender];//调用方法的时候,要注意参数的类型-下面presentFromBarButtonItem:的参数类型是UIBarButtonItem..如果你是在系统的UIToolbaror UINavigationItem上放的一个打印button,就不需要转换了。

          [printCpresentFromBarButtonItem:itemanimated:YES completionHandler:completionHandler];//ipad上弹出打印那个页面

       } else {

           [printCpresentAnimated:YES completionHandler:completionHandler];//iPhone上弹出打印那个页面

       }

    }

}


// 打印 这里解释下,由于要分页打印,我暂时 没找到合适的方法 就用了两个Button 设置了两个点击事件,jietuImage2 这个的Y坐标 设置到上面的高度,然后就可以打印第二页了,没办法,项目赶紧,坑坑坑,有找到分页打印的帮忙留下代码,非常感谢

-(void)printActionsbutton2:(id)sender{

    

   //获取要打印的图片

   UIImage *printImage = [detailTableView screenshot];

   //剪切原图(824* 2235 789960

    UIImage * scanImage = [self scaleToSize:printImage size:CGSizeMake(595, 1660)];

    UIImage *jietuImage2 = [self imageFromImage:scanImage inRect:CGRectMake(0, 880, 595, 824)];

   UIPrintInteractionController *printC = [UIPrintInteractionControllersharedPrintController];//显示出打印的用户界面。

    printC.delegate = self;

    

    if (!printC) {

       NSLog(@"打印机不存在");

       [selfshowAlertView:@"初始化失败"];

    }

    

   printC.showsNumberOfCopies = YES;

    printC.showsPageRange = YES;

    NSData *imgDate = UIImagePNGRepresentation(jietuImage2);

    NSData *data = [NSData dataWithData:imgDate];

   if(printC &&[UIPrintInteractionController canPrintData:data]) {

       UIPrintInfo*printInfo = [UIPrintInfoprintInfo];//准备打印信息以预设值初始化的对象。

       printInfo.outputType=UIPrintInfoOutputGeneral;//设置输出类型。

       printC.showsPageRange = YES;//显示的页面范围

       

       //printInfo.jobName =@"my.job";

       printC.printInfo = printInfo;

       printC.printingItem =data;//single NSData, NSURL, UIImage, ALAsset

       

       //等待完成

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

       ^(UIPrintInteractionController*printController, BOOLcompleted, NSError *error){

          if (!completed &&error) {

              NSLog(@"可能无法完成,因为印刷错误:%@", error);

           }

       };

       if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

          UIBarButtonItem *item = [[UIBarButtonItem alloc]initWithCustomView:sender];//调用方法的时候,要注意参数的类型-下面presentFromBarButtonItem:的参数类型是UIBarButtonItem..如果你是在系统的UIToolbaror UINavigationItem上放的一个打印button,就不需要转换了。

          [printCpresentFromBarButtonItem:itemanimated:YES completionHandler:completionHandler];//ipad上弹出打印那个页面

       } else {

           [printCpresentAnimated:YES completionHandler:completionHandler];//iPhone上弹出打印那个页面

       }

    }

}



//______ 暂时无用  paperList据说是分页的,但是没找到具体信息,回头再找

- (UIPrintPaper*)printInteractionController:(UIPrintInteractionController*)printInteractionController choosePaper:(NSArray *)paperList {

   //设置纸张大小

    CGSize paperSize = CGSizeMake(595, 880);

   return [UIPrintPaperbestPaperForPageSize:paperSizewithPapersFromArray:paperList];

}


//绘制原图这个就是将原图改变为A4 纸宽度的图片

- (UIImage*)scaleToSize:(UIImage *)imgsize:(CGSize)size{

   // 创建一个bitmapcontext

   // 并把它设置成为当前正在使用的context

   UIGraphicsBeginImageContext(size);

   // 绘制改变大小的图片

    [img drawInRect:CGRectMake(20,20,size.width,size.height)];

   //从当前context中创建一个改变大小后的图片

   UIImage*scaledImage =UIGraphicsGetImageFromCurrentImageContext();

   // 使当前的context出堆栈

   UIGraphicsEndImageContext();

   //返回新的改变大小后的图片

    return scaledImage;

}


 

//截取原图 截取部分 打印的图片就是从这里来

- (UIImage*)imageFromImage:(UIImage*)image inRect:(CGRect)rect{

    CGImageRef sourceImageRef = [imageCGImage];

    CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef,rect);

    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];

    return newImage;

 

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值