我正在使用 QZ 托盘使用 ESC/P(不是 ESC/POS)打印机 9pin [1] 进行原始打印。 基本上一切都很好,直到我必须设置绝对水平位置(ESC $)。
问题与 [2] 相同,但它使用 Java,QZ 托盘使用 JavaScript 作为示例 [3],并使用十六进制转义序列 (\xFF) [4],字符从 0 - 255 (\x00 - \xFF) 声明所有命令。
以下是有关问题的详细信息:
-
在 9 针电调/P 中设置绝对水平位置 [1]
ASCII: ESC $ nL nH Hex: 1B 24 nL nH 0 <= nH <= 127 0 <= nL <= 255
-
如果 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?
-
我尝试使用JavaScript类型数组Uint8Array和Uint16Array,没有成功打印,我认为这是因为ESC/P协议希望它作为字符(array)。
我尝试搜索QZ组和堆栈溢出,但很难找到正确的关键字。
任何帮助将不胜感激。谢谢。
[1]https://files.support.epson.com/pdf/general/escp2ref.pdf
[2]ESC/P 设置绝对水平打印位置
[3]https://qz.io/wiki/2.0 原印
[4]https://mathiasbynens.be/notes/javascript 转义#十六进制
为了帮助解决这个问题的人, 基本上我从qz打印邮件列表中得到了答案, 这是一个已知的错误。 (但是很难找到关键字,因为它是关于原始编码错误)。
最简单的解决方案(原始打印)添加编码 ISO-8859-1,因此它不会使用 UTF-8(使字符 128-255 为 2 个字节)。
var config = qz.configs.create(printer, {encoding: 'ISO-8859-1'});
另一种解决方案是使用十六进制格式的 Print Raw。 [1]https://qz.io/wiki/2.0-原始印刷#十六进制
以下是邮件列表上的讨论: [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
强制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 提出的一般答案相同,但在代码中键入。