I\'m printing some QR codes (from a Ruby script) writing ESC/POS commands to a Epson TM-T20 thermal printer.
BTW, I\'m writing a simple ESC/POS commands printer \"d
The most complete documentation I've found for the ESC/POS command set is this one: http://content.epson.de/fileadmin/content/files/RSD/downloads/escpos.pdf
Recently, I added the QR code feature to a POS client. I've found it very useful to have a print out of this Code page 437 reference, especially for debugging a sequence that was printed.
My example is in Java, but you can get the idea:
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();
}
I'm not familiar with ESC/POS but I do have some experience with QR codes.
If you're hitting an upper limit on the number of characters you can put in a QR code, there are four things inherent in the QR code design which might be causing it:
You can control the amount of error correction data. More error correction means a bigger QR code but a more reliable scan.
QR codes must be square so you might be bumping up against your printer firmware's "maximum width" and "minimum QR code pixel size" limits.
QR codes are defined in "versions" with each version representing a range of sizes (the higher the version, the bigger the QR code). Your printer's firmware may just not support versions above a certain number.
QR codes support four different encodings with different data limits on each (Numeric, Alphanumeric, Binary, and Kanji).
This means that you should:
Check how much error correction you're putting in. (From most to least, the levels are H
, Q
, M
, and L
). You might find that a lower level of error correction still gives you enough reliability while allowing you to squeeze in more data.
Check the spec to see if you can ask for smaller QR code pixels so a wider code will fit on the paper.
Check what the highest supported QR code version for your printer is.
Check which data encoding you're using.
If you're hitting a limit around 400 characters, the maximum version should be somewhere in the 8-13
range for numeric, 11-17
for alphanumeric, and 13-21
for binary, depending on the level of error correction used. (See the reference table I linked before)
This is in 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