1

我正在使用 QZ 托盘使用 ESC/P(不是 ESC/POS)打印机 9pin [1] 进行原始打印。基本上一切正常,直到我必须设置绝对水平位置(ESC $)。

与 [2] 的问题相同,但它使用 Java,QZ 托盘使用 JavaScript 作为其示例 [3],并使用十六进制转义序列 (\xFF) [4] 声明所有命令,字符从 0 到 255 (\x00 - \xFF)。

这是有关问题的详细信息:

  1. 在 9 针 ESC/P [1] 中设置绝对水平位置

    ASCII: ESC $ nL nH
    Hex:   1B 24 nL nH  
    0 <= nH <= 127
    0 <= nL <= 255
    
  2. 如果 nL 值为 0 到 127,则将数据发送到 QZ 托盘没有问题。

    var data = [
        '\x1B' + '\x40',                    // init
    
        '\x1B' + '\x24' + '\x10' + '\x00',  // set horizontal
        '0x10' + '\x0D' + '\x0A',           // print position ok
    
        '\x1B' + '\x24' + '\x7F' + '\x00',  // set horizontal
        '0x7F' + '\x0D' + '\x0A',           // print position ok
    
        '\x1B' + '\x24' + '\x80' + '\x00',  // set horizontal
        '0x80' + '\x0D' + '\x0A',           // print position PROBLEM
    
        '\x1B' + '\x24' + '\x00' + '\x01',  // set horizontal
        '1x00' + '\x0D' + '\x0A',           // print position ok
    
    ]
    

    如果 '\x80' + '\x00' 不正确,如何使用十六进制转义序列表示字符 128?

  3. 我尝试使用 JavaScript 类型数组 Uint8Array 和 Uint16Array,没有成功打印,我认为是因为 ESC/P 协议希望它作为字符(数组)。

我曾尝试在 QZ 组和 stackoverflow 上进行搜索,但很难找到正确的关键字。

任何帮助,将不胜感激。谢谢你。

[1] https://files.support.epson.com/pdf/general/escp2ref.pdf

[2] ESC/P 设置绝对水平打印位置

[3] https://qz.io/wiki/2.0-raw-printing

[4] https://mathiasbynens.be/notes/javascript-escapes#hexadecimal

4

2 回答 2

2

为了帮助解决这个问题的人,基本上我从 qz-print 邮件列表中得到了答案,这是一个已知的错误。(但很难找到关键字,因为它与原始编码错误有关)。

最简单的解决方案(原始打印)添加编码 ISO-8859-1,因此它不会使用 UTF-8(将字符 128-255 作为 2 个字节)。

var config = qz.configs.create(printer, {encoding: 'ISO-8859-1'});

另一种解决方案是使用十六进制格式的原始打印。[1] https://qz.io/wiki/2.0-Raw-Printing#hex

这是邮件列表上的讨论:[2] https://groups.google.com/forum/#!topic/qz-print/TE0D-wsRDRg

这是之前关于该错误的讨论:[3] https://groups.google.com/forum/#!topic/qz-print/r3VGPDaYKKE

最后一个,这里是 github 问题,如果你想跟踪它,总有一天它会解决。[4] https://github.com/qzind/tray/issues/155

于 2018-01-17T22:14:36.597 回答
1

强制ISO-8859-1编码并使用原始十六进制对象表示法。

var config = qz.configs.create(printer, {encoding: 'ISO-8859-1'});

var data = [
   '...',
   '\x1B' + '\x24' + '\x80' + '\x00',  // set horizontal

   ///// RAW HEX OBJECT NOTATION /////
   { type: 'raw', format: 'hex', data: 'x80x0Dx0A' } 
   //'0x80' + '\x0D' + '\x0A',           // print position PROBLEM

   '\x1B' + '\x24' + '\x00' + '\x01',  // set horizontal
   '1x00' + '\x0D' + '\x0A',           // print position ok
   '...',
]

请注意,这与@oon-arfiandwi 提出的一般答案相同,但输入的是代码。

于 2018-09-21T06:18:41.817 回答