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 就是 几页 ,不用再解释了吧。。。
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 *, 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上弹出打印那个页面
} 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 *, 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上弹出打印那个页面
} 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{
// 创建一个bitmap的context
// 并把它设置成为当前正在使用的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 慢慢再来