Ruby 是否通过ESC/POS热敏打印机打印二维码?
我正在打印一些QR码(来自Ruby脚本),将ESC/POS命令写入Epson TM-T20热敏打印机 顺便说一句,我正在编写一个简单的ESC/POS命令打印机“驱动程序”。 我使用的打印机是Epson TM-T20(USB接口) 我正在Windows 7主机上使用serialport gem进行一些测试 关于为打印格式化文本和线性条形码编写ESC/POS命令,一切都很好,但我在理解打印QR代码的命令协议时遇到问题,使用爱普生提供的唯一可用文档(据我所知),请参阅: 现在,关于QRCodes命令的部分对我来说相当模糊,我无法解释请求的字节序列;相反,我发现尼古拉斯的例子非常有用: 通过破解那个有用的字节码示例,我能够成功打印二维码,请参见:Ruby 是否通过ESC/POS热敏打印机打印二维码?,ruby,printing,barcode,qr-code,zebra-printers,Ruby,Printing,Barcode,Qr Code,Zebra Printers,我正在打印一些QR码(来自Ruby脚本),将ESC/POS命令写入Epson TM-T20热敏打印机 顺便说一句,我正在编写一个简单的ESC/POS命令打印机“驱动程序”。 我使用的打印机是Epson TM-T20(USB接口) 我正在Windows 7主机上使用serialport gem进行一些测试 关于为打印格式化文本和线性条形码编写ESC/POS命令,一切都很好,但我在理解打印QR代码的命令协议时遇到问题,使用爱普生提供的唯一可用文档(据我所知),请参阅: 现在,关于QRCodes命令的
我 然而,总的来说,我对ESC/POS消息格式感到困惑,尤其是在我将在二维码中插入一条长文本消息(>400个字符)的情况下。。。打印机似乎拒绝(不打印)使用此代码的包含超过400个字符的QR代码:
def test_qrcode (printer, text, print_also_text=false, qr_size=6.chr)
s = text.size + 3
lsb = (s % 256).chr
msb = (s / 256).chr
# https://code.google.com/p/python-escpos/wiki/Usage
escpos = ""
escpos << "\x1D\x28\x6B\x03\x00\x31\x43#{qr_size}"
escpos << "\x1D\x28\x6B\x03\x00\x31\x45\x33"
escpos << "\x1D\x28\x6B#{lsb}#{msb}\x31\x50\x30"
escpos << text #
escpos << "\x1D\x28\x6B\x03\x00\x31\x51\x30"
# writing byte streams directly to the serial port
printer.write escpos
end
def test\u qrcode(打印机、文本、打印也\u text=false、qr\u size=6.chr)
s=text.size+3
lsb=(s%256).chr
msb=(s/256).chr
# https://code.google.com/p/python-escpos/wiki/Usage
escpos=“”
escpos我不熟悉ESC/POS,但我确实有一些二维码的经验
如果您在二维码中输入的字符数达到上限,可能是二维码设计中固有的四个因素造成的:
您可以控制纠错数据的数量。更多的错误纠正意味着更大的二维码,但更可靠的扫描
二维码必须是方形的,所以您可能会遇到打印机固件的“最大宽度”和“最小二维码像素大小”限制
二维码在中定义,每个版本代表一系列尺寸(版本越高,二维码越大)。您的打印机固件可能不支持高于某个数字的版本
QR码支持四种不同的编码,每种编码都有不同的数据限制(数字、字母数字、二进制和汉字)
这意味着您应该:
检查您正在进行的错误更正量。(从大到小,级别分别为H
、Q
、M
和L
)。您可能会发现,较低级别的错误更正仍然可以提供足够的可靠性,同时允许您压缩更多数据
检查规格,看看你是否可以要求更小的二维码像素,以便更宽的二维码可以放在纸上
检查打印机支持的最高二维码版本
检查您正在使用的数据编码
如果您达到了400个字符左右的限制,最大版本应该在数字的8-13
范围内,字母数字的11-17
范围内,二进制的13-21
范围内,具体取决于所使用的纠错级别。(参见前面链接的I)我找到的有关ESC/POS命令集的最完整文档如下:
最近,我在POS客户端添加了二维码功能。
我发现打印出来非常有用,特别是对于调试打印的序列
我的例子是用Java编写的,但您可以理解:
public void print_qr_code(String qrdata)
{
int store_len = qrdata.length() + 3;
byte store_pL = (byte) (store_len % 256);
byte store_pH = (byte) (store_len / 256);
// QR Code: Select the model
// Hex 1D 28 6B 04 00 31 41 n1(x32) n2(x00) - size of model
// set n1 [49 x31, model 1] [50 x32, model 2] [51 x33, micro qr code]
// https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=140
byte[] modelQR = {(byte)0x1d, (byte)0x28, (byte)0x6b, (byte)0x04, (byte)0x00, (byte)0x31, (byte)0x41, (byte)0x32, (byte)0x00};
// QR Code: Set the size of module
// Hex 1D 28 6B 03 00 31 43 n
// n depends on the printer
// https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=141
byte[] sizeQR = {(byte)0x1d, (byte)0x28, (byte)0x6b, (byte)0x03, (byte)0x00, (byte)0x31, (byte)0x43, (byte)0x03};
// Hex 1D 28 6B 03 00 31 45 n
// Set n for error correction [48 x30 -> 7%] [49 x31-> 15%] [50 x32 -> 25%] [51 x33 -> 30%]
// https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=142
byte[] errorQR = {(byte)0x1d, (byte)0x28, (byte)0x6b, (byte)0x03, (byte)0x00, (byte)0x31, (byte)0x45, (byte)0x31};
// QR Code: Store the data in the symbol storage area
// Hex 1D 28 6B pL pH 31 50 30 d1...dk
// https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=143
// 1D 28 6B pL pH cn(49->x31) fn(80->x50) m(48->x30) d1…dk
byte[] storeQR = {(byte)0x1d, (byte)0x28, (byte)0x6b, store_pL, store_pH, (byte)0x31, (byte)0x50, (byte)0x30};
// QR Code: Print the symbol data in the symbol storage area
// Hex 1D 28 6B 03 00 31 51 m
// https://reference.epson-biz.com/modules/ref_escpos/index.php?content_id=144
byte[] printQR = {(byte)0x1d, (byte)0x28, (byte)0x6b, (byte)0x03, (byte)0x00, (byte)0x31, (byte)0x51, (byte)0x30};
// flush() runs the print job and clears out the print buffer
flush();
// write() simply appends the data to the buffer
write(modelQR);
write(sizeQR);
write(errorQR);
write(storeQR);
write(qrdata.getBytes());
write(printQR);
flush();
}
这是在ESC/POS中:
GS "(k" 4 0 49 65 50 0
GS "(k" 3 0 49 67 5
GS "(k" 3 0 49 69 48
GS "(k" 28 0 49 80 48 "https://stackoverflow.com/"
GS "(k" 3 0 49 81 48
我用Python创建这个库是为了与TM-T20通信。您可以使用“打印图像”命令打印二维码。我想代码可以很容易地翻译成Ruby。我知道!我已经在六月份重播给你了,这里::-)链接现在被修复了@这不是打印二维码,而是打印一些奇怪的字母,然后是字符串格式的url。有什么原因吗?@Kerroker当我使用错误的编码时,请检查您是否正在强制转换到另一种编码类型(例如UTF),并正确使用没有填充的代码页437。您正在使用的打印机驱动程序也可能自动执行此编码转换。@Tobia有多个QR命令,请查看此页的第一个命令。其余的在左侧的文档菜单中@LeoColman奇怪的字母是ESC/P代码,字符串是。。。好的,要呈现的字符串。这意味着特定打印机不支持GS(k
QR码打印。