1、将要打印的内容转换为打印机对应的编码(一般是gbk),可以使用这个库来转:
https://github.com/inexorabletash/text-encoding
示例代码如下:
const encoding = require( '../../utils/encoding.js' ) let str = "你要打印的内容" let buffer = new encoding.TextEncoder( "gb2312" , { NONSTANDARD_allowLegacyEncoding: true }).encode(str).buffer wx.writeBLECharacteristicValue({ // 这里的 deviceId 需要在上面的 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取 deviceId: deviceId, // 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取 serviceId: serviceId, // 这里的 characteristicId 需要在上面的 getBLEDeviceCharacteristics 接口中获取 characteristicId: characteristicId, // 这里的value是ArrayBuffer类型 value: buffer, success: function (res) { console.log( 'writeBLECharacteristicValue success' , res) }, fail: function (err) { console.log( 'writeBLECharacteristicValue fail' , err) } }) |
2、一般来说转完了发现打印中文还会是乱码,这个很有可能是因为你的打印设备需要有对应的打印指令才可以正确打印内容,建议看下对应的编码手册,示例代码如下:
let str = "! 0 200 200 920 1\n" + "PAGE-WIDTH 576\n" + ";存根\n" + ";SPEED 0\n" + ";LINE 0 40 544 40 1\n" + "一维条码\n" + "SETMAG 0 0\n" + "SETBOLD 1" "ML 32\n" + "TEXT 24 0 0 420 \n" + " 上述时间、地点,该机动车未在停车场或道路停车\n" + "泊位内停放,根据《阳天省实施(中华人民共和国道路\n" + "交通安全法)办法》第五十二条第一款的规定,对以上\n" + "事实已作出了图像记录。此告知单及图像记录,将提供\n" + "给阳天市公安局阳天交通大队审核。\n" + "ENDML\n" + "EXT 24 0 0 612 交通警察:\n" + "TEXT 24 0 48 644 2016年8月1日\n" + "LEFT\n" + "B QR 64 708 M 2 U 4 \n" + "MA,TO: http://a.app.qq.com/o/simple.jsp?pkgname=com.zicox.easyprint\n" + "ENDQR\n" + "B QR 362 708 M 2 U 4 \n" + "MA,TO: http://a.app.qq.com/o/simple.jsp?pkgname=com.zicox.easyprint\n" + "ENDQR\n" + "TEXT 24 0 0 848 关注“阳天公安”“阳天交警”\n" + "TEXT 24 0 344 848 扫描支付宝支付\n" + "PRINT \n" |
类似上面的str,使用1中所说的转码方式,应该就可以正确打印出中文了。
3、关于Android打印:
前面的代码在ios上面应该已经可以正确打印中文了,但是试了多款Android机型,发现还是无法打印,经过实验发现,Android端对单次打印的字节数有限制(不超过20个字节),官方文档其实也提过这一点:
所以在打印的时候,由于发送指令不完整,导致不能正确打印出所需要的内容。这时候需要对打印的内容进行分包处理,下面是我的做法:
sendData(buffer) { let byteLength = buffer.byteLength if (byteLength > 0) { var that = this let deviceId = this .data.deviceId let characteristicId = this .data.characteristicId let serviceId = this .data.serviceId wx.writeBLECharacteristicValue({ // 这里的 deviceId 需要在上面的 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取 deviceId: deviceId, // 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取 serviceId: serviceId, // 这里的 characteristicId 需要在上面的 getBLEDeviceCharacteristics 接口中获取 characteristicId: characteristicId, // 这里的value是ArrayBuffer类型 value: buffer.slice(0, 20), success: function (res) { console.log( 'writeBLECharacteristicValue success' , res) if (byteLength > 20) { that.sendData(buffer.slice(20, byteLength)) } }, fail: function (err) { console.log( 'writeBLECharacteristicValue fail' , err) } }) } } |
|
每次取前20个字节,递归进行打印,就可以了。
以上就是蓝牙中文打印相关经验分享,希望对大家有帮助
这个库怎么引入项目中啊?
let buffer =
new
encoding.TextEncoder(
"gb2312"
, { NONSTANDARD_allowLegacyEncoding:
true
undefined}).encode(str).buffer
我引用encoding.js报错呀,TextEncoder未定义你好,有没有实现过打印图片的场景?如果有的话,能否提供demo参考下,谢谢
楼主使用的是tsc命令打印的,标签模式,我的小票打印机
条形码与二维码是怎样实现打印的?可以提供些资料么?目前在实现该功能中,不知道如何下手
好帖!!我想问下楼主有试过打印图片吗?打印命令里应该怎么设置
看看这个 :https://developers.weixin.qq.com/blogdetail?action=get_post_info&docid=7e85fa4514a56b7928646f96dd4bcabe&highline=%E8%93%9D%E7%89%99%E6%89%93%E5%8D%B0%E6%9C%BA
兄弟请教下二维码打印指令你怎么输入的?
我也是用的hma300,用指令打出来二维码也是打印出字符串,请问您这个问题解决了吗?应该是打印机模式的问题,不知道hma300怎么去调节打印模式的!
谢谢分享 现在还是用服务端转换
请问下 安卓HA-300..可以用么..
别试验了,蓝牙这一块安卓适配,小程序几乎不能用。
官方不重视,鸡肋的功能