You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何读取并打印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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:57:18