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

来源:互联网 发布:淘宝客推广计划 编辑:程序博客网 时间:2024/04/30 00:42
不想解释了,这是做这么久ios以来最蛋疼的功能,没有之一,国内网站上一直找不到相关的,问群里也问不到,不过最后还是在国外网站上找到了,英文差真实软肋,悲催,先留下几个网站吧
 

http://stackoverflow.com/questions/9809723/print-uitableview-that-has-content-off-screen

最后用得是 #import "DHSmartScreenshot.h"  这个类库  //这个 要切记 !!!

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

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

    printViewController. printImage = printImage;

    [self.navigationController pushViewController: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 = [UIPrintInteractionController sharedPrintController];//显示出打印的用户界面。

    printC.delegate = self;

    

    if (!printC) {

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

        [self showAlertView:@"初始化失败"];

    }

    printC.showsNumberOfCopies = YES;

    printC.showsPageRange = YES;

    NSData *imgDate = UIImagePNGRepresentation(jietuImage);

    NSData *data = [NSData dataWithData:imgDate];

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

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

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

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

        

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

        printC.printInfo = printInfo;

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

        

        // 等待完成

        void (^completionHandler)(UIPrintInteractionController *, BOOLNSError *) =

        ^(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上弹出打印那个页面

        } else {

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

        }

    }

}


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

-(void)printActionsbutton2:(id)sender{

    

    //获取要打印的图片

    UIImage * printImage = [detailTableView screenshot];

    //剪切原图(824 * 2235  789 960

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

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

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

    printC.delegate = self;

    

    if (!printC) {

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

        [self showAlertView:@"初始化失败"];

    }

    

    printC.showsNumberOfCopies = YES;

    printC.showsPageRange = YES;

    NSData *imgDate = UIImagePNGRepresentation(jietuImage2);

    NSData *data = [NSData dataWithData:imgDate];

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

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

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

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

        

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

        printC.printInfo = printInfo;

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

        

        // 等待完成

        void (^completionHandler)(UIPrintInteractionController *, BOOLNSError *) =

        ^(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上弹出打印那个页面

        } else {

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

        }

    }

}



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

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

    //设置纸张大小

    CGSize paperSize = CGSizeMake(595, 880);

    return [UIPrintPaper bestPaperForPageSize:paperSize withPapersFromArray:paperList];

}


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

- (UIImage *)scaleToSize:(UIImage *)img size:(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 = [image CGImage];

    CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect);

    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];

    return newImage;

 

}




好了 可能还有些BUG  慢慢再来 

0 0