【问题标题】:printing QR codes through an ESC/POS thermal printer?通过 ESC/POS 热敏打印机打印二维码?
【发布时间】:2014-06-27 23:11:28
【问题描述】:

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

顺便说一句,我正在编写一个简单的 ESC/POS 命令打印机“驱动程序”。 我正在使用的打印机 Epson TM-T20(USB 接口) 我正在使用串行端口 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

破解那个有用的字节码示例,我能够成功打印二维码,请参阅:
https://twitter.com/solyarisoftware/status/464740233008132096

不过,总的来说,我对 ESC/POS 消息格式感到困惑,尤其是在我将在 QR 码中插入长文本消息(> 400 个字符)的情况下......似乎打印机拒绝(不要print) 包含 400 多个字符的二维码使用此代码:

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 命令)?

【问题讨论】:

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


【解决方案1】:

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

如果您在 QR 码中可以输入的字符数达到上限,则 QR 码设计中固有的四个因素可能会导致该上限:

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

  2. QR 码必须是方形的,因此您可能会遇到打印机固件的“最大宽度”和“最小 QR 码像素大小”限制。

  3. 二维码在"versions" 中定义,每个版本代表一个尺寸范围(版本越高,二维码越大)。您的打印机固件可能不支持高于特定数量的版本。

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

这意味着你应该:

  1. 检查您进行了多少纠错。(从最高到最低,级别为HQML)。您可能会发现,较低级别的纠错仍然可以为您提供足够的可靠性,同时允许您压缩更多数据。

  2. 检查规范,看看您是否可以要求更小的 QR 码像素,以便更宽的代码适合纸张。

  3. 检查您的打印机支持的最高二维码版本。

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

如果您达到了 400 个字符左右的限制,则最大版本应该在 8-13 范围内(数字)、11-17(字母数字)和 13-21(二进制),具体取决于所使用的纠错级别. (见我之前链接的reference table

【讨论】:

    【解决方案2】:

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

    最近,我在 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();
    }
    

    【讨论】:

    • 链接已修复!
    • @JosueIbarra 这不是打印二维码,而是打印一些奇怪的字母,然后是字符串格式的 url。有什么原因吗?
    • @Kerroker 我发现当我使用了错误的编码时,请检查您是否没有转换为另一种编码类型(例如 UTF)并正确使用没有填充的代码页 437。您使用的打印机驱动程序也有可能自动进行此编码转换。
    • @Tobia 有多个 QR 命令,请查看此页面的第一个。其余的在左侧的文档菜单中。 reference.epson-biz.com/modules/ref_escpos/…
    • @LeoColman 奇怪的字母是 ESC/P 代码,而字符串是……嗯,就是要渲染的字符串。这意味着特定打印机不支持GS ( k二维码打印。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-15
      • 2014-02-18
      • 2021-04-14
      • 2022-12-28
      • 1970-01-01
      • 2020-12-12
      • 1970-01-01
      相关资源
      最近更新 更多