最近有个打印App内网页的需求,在网上找了一些资料,实现了相关功能,顺便写出来,方便查找
/// 开始打印
- (void)startPrint{
NSDictionary *latestPrinterInfo = [Utils userDefaultsValueForKey:@"TCM_PrinterInfo"];
UIPrinter *printer = nil;
if (!TCM_ValidDict(latestPrinterInfo)) {
//找不到打印机信息,则选择打印机
[self pickPrinter];
return;
}else{
NSString *url = [latestPrinterInfo objectForKey:@"url"];
// NSString *name = [latestPrinterInfo objectForKey:@"name"];
if (!TCM_ValidString(url)) {
//打印机信息无效,则选择打印机
[self pickPrinter];
return;
}
printer = [UIPrinter printerWithURL:[NSURL URLWithString:url]];
if (!printer) {
//初始化打印机失败,则选择打印机
[self pickPrinter];
return;
}
}
[self printWebpageWithPrinter:printer];
}
/// 选择打印机
- (void)pickPrinter{
UIPrinterPickerController *pickerController = [UIPrinterPickerController printerPickerControllerWithInitiallySelectedPrinter:nil];
UIPrinterPickerCompletionHandler completionHandler = ^(UIPrinterPickerController * _Nonnull printerPickerController, BOOL userDidSelect, NSError * _Nullable error) {
if (userDidSelect) {
NSDictionary *latestPrinterInfo = @{
@"url": printerPickerController.selectedPrinter.URL.absoluteString,
@"name": printerPickerController.selectedPrinter.displayName
};
[Utils setUserDefaultsValue:latestPrinterInfo forKey:@"TCM_PrinterInfo"];
DLog(@"Printer Info: %@", latestPrinterInfo.debugDescription);
[self printWebpageWithPrinter:printerPickerController.selectedPrinter];
}
};
if (DEVICE_IS_Pad) {
[pickerController presentFromRect:CGRectZero inView:self.view animated:YES completionHandler:completionHandler];
}else{
[pickerController presentAnimated:YES completionHandler:completionHandler];
}
}
/// 打印网页
/// @param printer 打印机
- (void)printWebpageWithPrinter:(UIPrinter *)printer{
if (!printer) {
return;
}
//连接打印机
[printer contactPrinter:^(BOOL available) {
if (available) {
UIPrintInteractionController *printController = [UIPrintInteractionController sharedPrintController];
if (!printController) {
[TCMProgressHUDInstance showMessage:@"打印功能异常" dismissAfterDelay:2.5];
return;
}
//回调
UIPrintInteractionCompletionHandler completionHandler = ^(UIPrintInteractionController * _Nonnull printInteractionController, BOOL completed, NSError * _Nullable error) {
if (completed) {
[TCMProgressHUDInstance showMessage:@"开始打印" dismissAfterDelay:2.5];
}else{
if (error) {
[TCMProgressHUDInstance showMessage:error.debugDescription dismissAfterDelay:2.5];
}else{
[TCMProgressHUDInstance showMessage:@"打印取消" dismissAfterDelay:2.5];
}
DLog(@"打印结果:%@", error.debugDescription);
}
};
UIPrintInfo *printInfo = [UIPrintInfo printInfo];
printInfo.outputType = UIPrintInfoOutputGeneral;
printInfo.jobName = @"打印网页";
printInfo.duplex = UIPrintInfoDuplexLongEdge;
printController.printInfo = printInfo;
printController.showsPageRange = YES;
// printController.showsNumberOfCopies = NO;
UIViewPrintFormatter *printFormatter = [self.commonWebView viewPrintFormatter];
printFormatter.startPage = 0;
printController.printFormatter = printFormatter;
if (DEVICE_IS_Pad) {
[printController presentFromRect:CGRectZero inView:self.view animated:YES completionHandler:completionHandler];
}else{
[printController presentAnimated:YES completionHandler:completionHandler];
}
}else{
[self pickPrinter];
}
}];
}