javascript 将字符串转换为点阵打印机的十六进制控制代码

neekobn8  于 2023-11-15  发布在  Java
关注(0)|答案(2)|浏览(100)

我需要发送一个字符串到点阵打印机,它使用爱普生FX仿真,将打印一个简单的条形码。我可以通过手动键入控制代码到字符串打印。
这是一个来自手册的示例:https://files.support.epson.com/pdf/general/escp2ref.pdf#page=327

我手动将数据输入到字符串中:
第一个月
然后使用“qz托盘”模块发送。
这很好用,打印机通过正确地打印所示的代码来响应。现在我的困难是实际上给它我自己的数据并更改最后10个字符串代码,我已经尝试了许多方法来正确地编码10个字符的字符串,到目前为止没有任何工作。JavaScript中有一种方法可以做到这一点吗?

编辑:

做:
var barcode = "\x1B\x28\x42\x10\x00\x06\x02\x00\x7D\x00\x01" + "1234567890";
是我尝试的第一件事之一,结果打印机处于空闲状态,根本没有对命令做出React。事实上,我发现第一个命令1B不起作用,我必须使用String.fromCharCode(27)发送它。管理打印条形码的完整工作命令变为:
var barcode = String.fromCharCode(27) + "\x28\x42\x10\x00\x06\x02\x00\x7D\x00\x01\x41\x32\x33\x40\x41\x21\x43\x44\x5B\x5D";
它就像手册中一样打印数据。用转义的十六进制数据替换"1234567890"不知何故只会破坏它,打印机什么也不做。

EDIT2,解决方案:

事实证明,当发送数据到打印机,我无意中跳过了控制代码,负责设置条形码数据类型,在这种情况下,它将是A.没有它的打印机将闲置.工作代码:
String.fromCharCode(27) + "\x28\x42\x10\x00\x06\x02\x00\x0A\x00\x01" + "A" + "1234567890";

h7appiyu

h7appiyu1#

的十六进制值:

  • 第一个月

是下面的文本,以十六进制格式编码(或者更恰当地说,转义):
特别注意第一个字符A,根据维基百科:(感谢@托马斯在评论中)

*128A(代码集A)- ASCII字符00至95(0-9、A-Z和控制代码)、特殊字符和FNC 1-4
*128B(代码集B)- ASCII字符32到127(0-9、A-Z、a-z)、特殊字符和FNC 1-4
*128C(代码集C)- 00-99(用单个码位编码两位数)和FNC 1

  • A23@A!CD[]

您可以在JavaScript中验证这一点:

console.log("\x41\x32\x33\x40\x41\x21\x43\x44\x5B\x5D");
// prints: "A23@A!CD[]"

字符串
所以你可以把你的例子改成这样:

var barcode = "\x1B\x28\x42\x10\x00\x06\x02\x00\x7D\x00\x01" + "A123456789";


或者让它更有可读性:

var barcode = 
    "\x1B\x28\x42\x10\x00" + // Barcode command and data length
    "\x06" +                 // Barcode type k = Code 128
    "\x02" +                 // Module width m = 2 dots / 180 inch
    "\x00" +                 // Space adj value s = +0 dots / 360 inch
    "\x7D\x00" +             // Bar length v1,v2 = 125 / 180 inch
    "\x01" +                 // Control flags c
    "A123456789";            // Barcode Data


.或者使用QZ Tray的数组表示法:

var data = [
    "\x1B\x28\x42\x10\x00",  // Barcode command and data length
    "\x06",                  // Barcode type k = Code 128
    "\x02",                  // Module width m = 2 dots / 180 inch
    "\x00",                  // Space adj value s = +0 dots / 360 inch
    "\x7D\x00",              // Bar length v1,v2 = 125 / 180 inch
    "\x01",                  // Control flags c
    "A123456789"             // Barcode Data
];

qz.print(config, data);

**编辑:**感谢@托马斯在评论中提到应该保留A

我相信数据是使用Epson ESC/P2条形码格式进行格式化的,在此定义,第C-195页:https://files.support.epson.com/pdf/general/escp2ref.pdf

ctehm74n

ctehm74n2#

在某些BarCode TrueTypeFonts中,1234567890的每个字体编码的正确条形码128 C可以是69 0c 22 38 4e 5a 55 6ai"8NZUj。数字对将是“12”= x 0 c。
一个问题是,有其他TTF编码方法具有不同的移位,因此我们可能需要D2 2C 42 58 6E 7A 75 D3来获得相同的输出。
然而,这些软件TTF可能无法在打印机编码爱普生使用自己的不同的固件编码系统!
在Epson ESC Codes中,C(compact)连字功能可能不用于输入,因此所有范围的C字符都被用作普通数字。
因此,12不是使用TTF编码为0 C,而是在Epson ESC/POS中简单地“12”= x3132。因此,128 C可能成为学术输入,它也可能是128 A或128 B。
因此,对于Epson ESC/Pos,最简单的范围是使用数据字符集B范围,因为它包括所有的上限,下限和数字。
根据示例,以1B 28 42 10 00 06 02 00 7D 00开始,然后01 42
随后是人类数据31323334353637383930 x1c 0d1x,通过https://zxing.org/w/decode?u=https%3A%2F%2Fi.stack.imgur.com%2FYb7Ih.png验证

Raw text    
1234567890
Raw bytes   
68 11 12 13 14 15 16 17   18 19 10 21 6a

字符串
要测试压缩版本是否在C变体中使用,请尝试:
根据示例,以1B 28 42 10 00 06 02 00 7D 00开始,然后01 43
随后是人类数据31323334353637383930

,通过https://zxing.org/w/decode?u=https://i.stack.imgur.com/lYBBP.png验证

Raw text    
1234567890
Raw bytes   
69 0c 22 38 4e 5a 55 6a

相关问题