ESC POS打印机原生命令实现最终版

4,775 阅读3分钟

打印机研究进入第三天,进入深水区。

目前已解决的问题和掌握的知识:

一、打印命令和BIN/HEX的格式 二、打印机的分类和接口方式

但是还有问题没有解决:

一. 简单的命令可以比如初始化打印是ESC @,写起来比较简单。如果是复杂的图片呢?图片该怎么办?原始的问题非常不容易看懂。如图。 二维码也一样,看起来很复杂的样子。

www.epson-biz.com/modules/ref…

图片的问题是:需要把原始的图片钻换成点阵图片,bitmap。这个需要算法支持的。

二维码的问题是:格式调节比较麻烦,而且有的打印机不支持!!

解决方案:QR Code也是用图片打印解决,即生成图片然后打印。

所以问题变成了:如何打印图片?

如果按照原生的格式进行调节,非常麻烦。有没有一种方法,直接简单的写命令,让程序转化成二进制呢?有,如图!

这个编码程序也有图片支持,因此可行!这个编码返回的是Unit8Array,类似 [34,45,68]需要把这个编码转换成hex,而且格式是:

这里需要解决3个问题:

  1. Unit8Array变成 \xlb\x40这样的
  2. 转换当中因为需要escape \这个符号,因此需要正则表达式转换,即把两个\变成一个\,如图。

3. 转换成功后需要再次把hex \xlb\x40转换成真正的ASCII和浏览器能parse的数据,然后发给打印机。

转换代码如下:


hex2cmds(hexStr){
   return  hexStr.replace(/\\x([0-9A-F]{2})/gi, function() {
      // console.log(arguments);
      return String.fromCharCode(parseInt(arguments[1], 16));
    });
  
  },
  
  buffer2hex(buffer) { // buffer is an ArrayBuffer
    return Array.prototype.map.call(new Uint8Array(buffer), x => ("\\x"+ ('00' + x.toString(16)).slice(-2)) ).join('');
  },

图片问题解决了,二维码问题就好说了!!直接打印图片二维码。现在问题是:怎么确定图片二维码打印大小呢?也就是说如果我设置100个px的图片,打印是多大呢?这里就涉及到物理世界中pixel的大小了。

不同打印机的DPI不同,如果是203 dot per inch, 则每个点大小是0.125mm,所以如果是100px的图片,则大小是12.5mm,一般小票面宽是58mm,这样就知道大概多大了。而且测试了一下,如果二维码太小,扫码不出来。需要大一些,比如100px的图片。

二、中文字符怎么解决?这里跟打印机设置有关,需要向打印机写入codepage编码,不然无法打印中文,所以需要用如下命令,怎么样?比写原生的简单吧:

三、服务器端打印怎么办?因为打印主要发生在客户端,服务器端打印没有什么太大用处,而且有点问题。比如图片需要用canvas渲染,而且中文编码有点问题。因此主要还是用在浏览器端打印比较好。