通过ESC / POS热敏打印机打印QR码?

时间:2014-05-10 06:05:57

标签: ruby printing barcode qr-code zebra-printers

我正在打印一些QR码(来自Ruby脚本),将ESC / POS命令写入Epson TM-T20热敏打印机。

顺便说一下,我正在编写一个简单的ESC / POS命令打印机“驱动程序”。 打印机我用的是Epson TM-T20(USB接口) 我正在使用serialport gem从Windows 7主机进行一些测试。

所有关于为打印格式文本和线性条形码编写ESC / POS命令都很好,但是我在使用Epson提供的唯一可用文档(据我所知)打印QR CODES时遇到问题,请参阅:http://www.novopos.ch/client/EPSON/TM-T20/TM-T20_eng_qr.pdf

现在,关于QRCodes命令的部分对我来说非常模糊,我无法解释所请求的字节序列;相反,我发现Nicolas在这里找到的例子很有帮助:https://code.google.com/p/python-escpos/wiki/Usage

黑客那个有用的字节码示例,我能够成功地打印QR码,请参阅:
https://twitter.com/solyarisoftware/status/464740233008132096

尽管如此,一般来说,我对ESC / POS消息格式感到困惑,特别是如果我在QR码中插入一条长文本消息(> 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

是否有人可以建议关于ESC / POS命令(=字节码序列)的CLEAR ESC / POS DOCUMENTATION来打印QRCodes(二维码ESC / POS命令)?

3 个答案:

答案 0 :(得分:10)

我在ESC / POS命令集中找到的最完整的文档是这样的: http://content.epson.de/fileadmin/content/files/RSD/downloads/escpos.pdf

最近,我将QR码功能添加到POS客户端。 我发现打印出这个Code page 437 reference非常有用,特别是对于调试打印的序列。

我的例子是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();
}

答案 1 :(得分:1)

我不熟悉ESC / POS,但我确实对QR码有一些经验。

如果您对可以放入QR码的字符数量达到上限,则QR码设计中可能存在四种固有的因素:

  1. 您可以控制纠错数据的数量。更多纠错意味着更大的QR码,但更可靠的扫描。

  2. 二维码必须是方形的,这样您才可能碰到打印机固件的最大宽度&#34;和&#34;最小QR码像素大小&#34;限制。

  3. QR码在"versions"中定义,每个版本代表一系列尺寸(版本越高,QR码越大)。您的打印机固件可能不支持超过一定数量的版本。

  4. QR码支持四种不同的编码,每种编码都有不同的数据限制(数字,字母数字,二进制和汉字)。

  5. 这意味着你应该:

    1. 检查您输入的纠错程度。(从大多数情况到最低级别,级别为HQM和{{1 }})。您可能会发现较低级别的错误纠正仍然可以提供足够的可靠性,同时允许您挤出更多数据。

    2. 检查规格,看看是否可以要求更小的QR码像素,以便在纸张上放置更宽的代码。

    3. 检查打印机支持的最高QR码版本是什么。

    4. 检查您正在使用的数据编码。

    5. 如果您达到约400个字符的限制,则最高版本应该在数字的L范围内,字母数字为8-13,二进制为11-17,取决于使用的纠错级别。 (参见我之前链接的reference table

答案 2 :(得分:0)

这是在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