Flutter中使用esc_pos_printer v4.1.0打印马拉地语文本报错求解决方案
Flutter打印马拉地语文本的解决办法
你遇到的错误是因为默认热敏打印库仅支持ASCII或有限字符集,马拉地语属于Devanagari复杂脚本,无法被直接识别。以下是几种可行的解决方法:
方法一:切换打印机字符编码(需打印机支持)
部分热敏打印机支持Devanagari字符集,可通过切换代码页实现文本打印:
- 查阅打印机手册,确认支持的Devanagari代码页编号(常见为163)
- 在生成文本前发送代码页切换指令:
Future<void> printMarathiText() async { final profile = await CapabilityProfile.load(); final printer = NetworkPrinter(PaperSize.mm80, profile); List<int> bytes = []; final generator = Generator(PaperSize.mm80, profile); await connectToPrinter(); // 切换到Devanagari支持的代码页 bytes += generator.setCodePage(163); bytes += generator.text('मराठी मध्ये टेक्स्ट प्रिंट करणारा प्रिंटर', styles: const PosStyles( align: PosAlign.center, height: PosTextSize.size1, width: PosTextSize.size1, ), linesAfter: 1); printer.send(bytes); // 原代码缺失的关键步骤:发送打印指令 printer.cut(); printer.disconnect(); }
方法二:将文本转为图片打印(兼容性最优)
复杂脚本语言用图片打印是最可靠的方案,步骤如下:
- 添加支持马拉地语的字体(如Noto Sans Devanagari)到项目的
fonts目录,并在pubspec.yaml中配置 - 使用文本转图片库生成图片,再打印图片:
import 'package:flutter_image_from_text/flutter_image_from_text.dart'; import 'package:flutter/material.dart'; Future<void> printMarathiText() async { final profile = await CapabilityProfile.load(); final printer = NetworkPrinter(PaperSize.mm80, profile); List<int> bytes = []; final generator = Generator(PaperSize.mm80, profile); await connectToPrinter(); // 将马拉地语文本转为适配80mm纸宽的图片 final image = await generateImageFromText( text: 'मराठी मध्ये टेक्स्ट प्रिंट करणारा प्रिंटर', textStyle: TextStyle( fontSize: 16, fontFamily: 'NotoSansDevanagari', // 对应pubspec中配置的字体名称 color: Colors.black, ), backgroundColor: Colors.white, width: 280, // 80mm纸宽约对应280像素 ); // 打印图片 bytes += generator.image(image, align: PosAlign.center); bytes += generator.lines(1); printer.send(bytes); printer.cut(); printer.disconnect(); }
注意:原代码未调用
printer.send(bytes)发送打印数据,这是必须补充的步骤。
方法三:使用支持UTF-8的打印库
如果使用的是esc_pos_printer系列库,可升级到支持UTF-8的版本(如esc_pos_printer_plus),并启用UTF-8模式:
final generator = Generator(PaperSize.mm80, profile, useUtf8: true); bytes += generator.text('मराठी मध्ये टेक्स्ट प्रिंट करणारा प्रिंटर', ...);
此方法需要打印机本身支持UTF-8打印,否则会出现乱码。
内容的提问来源于stack exchange,提问作者Mohsin Patel
相关产品推荐
相关产品推荐

