web-dev-qa-db-ja.com

ESC / POSサーマルプリンターでQRコードを印刷する

Epson TM-T20サーマルプリンターにESC/POSコマンドを書き込む(Rubyスクリプトからの)QRコードを印刷しています。

ところで、私は簡単なESC/POSコマンドプリンター「ドライバー」を書いています。 Epson TM-T20(USBインターフェイス)を使用しているプリンターシリアルポートgemを使用して、Windows 7ホストからいくつかのテストを行っています。

印刷形式のテキストと線形バーコードのESC/POSコマンドの記述についてはすべて問題ありませんが、QRコードを印刷するコマンドプロトコルを理解するのに問題があります。 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コードを正常に印刷できます。以下を参照してください。
I https://Twitter.com/solyarisoftware/status/464740233008132096

それにもかかわらず、一般的には、ESC/POSメッセージ形式で混乱しています。特に、QRコード内に長いテキストメッセージ(> 400文字)を挿入する場合は...プリンターが拒否(印刷しない)しているようですこのコードを使用した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

誰かがQRCode(2次元コードのESC/POSコマンド)を印刷するために、ESC/POSコマンド(=バイトコードシーケンス)に関する明確なESC/POSドキュメントを提案できますか?

11
Giorgio Robino

私がESC/POSコマンドセットについて見つけた最も完全なドキュメントはこれです: http://content.epson.de/fileadmin/content/files/RSD/downloads/escpos.pdf

最近、QRコード機能をPOSクライアントに追加しました。この コードページ437リファレンス を印刷しておくと、特に印刷されたシーケンスをデバッグするときに非常に便利です。

私の例は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についてはよく知りませんが、QRコードについてはある程度の経験があります。

QRコードに入力できる文字数の上限に達している場合、QRコードの設計に固有の4つの原因が原因である可能性があります。

  1. エラー訂正データの量を制御できます。エラー訂正が多いほど、QRコードは大きくなりますが、スキャンの信頼性は高くなります。

  2. QRコードは正方形である必要があるため、プリンターファームウェアの「最大幅」および「最小QRコードピクセルサイズ」の制限にぶつかる可能性があります。

  3. QRコードは "versions" で定義され、各バージョンはサイズの範囲を表します(バージョンが高いほど、QRコードは大きくなります)。プリンタのファームウェアは、特定の番号を超えるバージョンをサポートしていない場合があります。

  4. QRコードは、それぞれに異なるデータ制限(数値、英数字、バイナリ、および漢字)を持つ4つの異なるエンコーディングをサポートします。

つまり、次のことを行う必要があります。

  1. 挿入するエラー修正の量を確認してください。(レベルはHQM、およびLです)。より低いレベルのエラー訂正でも、より多くのデータを圧縮できる一方で、十分な信頼性が得られることに気付くでしょう。

  2. より広いコードが用紙に収まるように、小さいQRコードピクセルを要求できるかどうか、仕様を確認してください。

  3. お使いのプリンターでサポートされている最も高いQRコードバージョンを確認します。

  4. 使用しているデータエンコーディングを確認します。

400文字前後の制限に達している場合、最大バージョンは、数値の8-13範囲、英数字の11-17、およびバイナリの13-21のどこかにあるはずです。使用されるエラー訂正。 (参照 参照テーブル 以前にリンク)

1
ssokolow

これは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
0
PaulW