如何读取并打印WebView中Canvas传来的Base64编码NSImage?
解决Base64图片打印问题
你当前代码的核心错误在于Base64字符串的处理逻辑:直接将NSString调用dataUsingEncoding:得到的NSData赋值给NSImage类型变量,不仅类型不匹配,而且这并不是Base64解码的正确方式——dataUsingEncoding:是把字符串本身转成二进制数据,而非解码Base64内容。
以下是修正后的完整代码:
- (void)printImage:(NSString *)printerName andData:(NSString *)base64img andW:(float)paperW andH:(float)paperH { // 1. 解码Base64字符串为图片二进制数据 NSData *imageData = [[NSData alloc] initWithBase64EncodedString:base64img options:NSDataBase64DecodingIgnoreUnknownCharacters]; if (!imageData) { NSLog(@"Base64图片解码失败"); return; } // 2. 用二进制数据创建NSImage对象 NSImage *img = [[NSImage alloc] initWithData:imageData]; if (!img) { NSLog(@"创建NSImage实例失败"); return; } // 3. 配置打印参数 NSPrintInfo *printInfo = [NSPrintInfo sharedPrintInfo]; [printInfo setTopMargin:0.0]; [printInfo setBottomMargin:0.0]; [printInfo setLeftMargin:0.0]; [printInfo setRightMargin:0.0]; [printInfo setHorizontalPagination:NSFitPagination]; [printInfo setVerticalPagination:NSFitPagination]; [printInfo setPaperSize:NSMakeSize(paperW, paperH)]; // 校验指定打印机是否存在 if (printerName.length > 0) { NSPrinter *targetPrinter = [NSPrinter printerWithName:printerName]; if (targetPrinter) { [printInfo setPrinter:targetPrinter]; } else { NSLog(@"指定的打印机不存在"); } } // 4. 执行打印操作 NSPrintOperation *op = [img printOperationForPrintInfo:printInfo autoRotate:YES]; [op setShowsPrintPanel:NO]; [op setShowsProgressPanel:NO]; [op runOperation]; }
关键修正点说明:
- Base64解码:使用
initWithBase64EncodedString:options:方法完成Base64字符串到二进制数据的转换,NSDataBase64DecodingIgnoreUnknownCharacters参数可忽略字符串中可能存在的无关字符(如换行符)。 - 图片实例化:通过解码后的二进制数据初始化
NSImage,确保图片对象有效。 - 打印机校验:增加打印机存在性判断,避免无效打印机名称导致的异常。
内容的提问来源于stack exchange,提问作者Josiah
相关产品推荐
相关产品推荐

