ESC/POS 二维码命令仅打印内容

ESC/POS commands for QR prints only the content

我正在尝试在自定义 VKP 打印机上打印二维码。打印机支持二维码。我向它发送 ESC/POS 命令,但打印的只是文本而不是 QR 码。以下是我在Java中的代码:

    String content = "Hello !!";
    int store_len = content.length() + 3;
    byte store_pL = (byte) (store_len % 256);
    byte store_pH = (byte) (store_len / 256);


    byte ESC = 0x1b;
    byte[] INIT = new byte[]{ESC, '@'};
    byte[] CUT = new byte[]{0x0c};
    byte[] FUNC_165 = new byte[]{Commands.GS, 0x28, 0x6b, 0x04, 0x00, 0x31, 0x41, 0x51, 0x00};
    byte[] FUNC_167 = new byte[]{Commands.GS, 0x28, 0x6b, 0x03, 0x00, 0x31, 0x43, 0x64};
    byte[] FUNC_169 = new byte[]{Commands.GS, 0x28, 0x6b, 0x03, 0x00, 0x31, 0x45, 0x48};
    byte[] FUNC_180 = new byte[]{Commands.GS, 0x28, 0x6b, store_pL, store_pH, 0x31, 0x50, 0x30};
    byte[] FUNC_181 = new byte[]{Commands.GS, 0x28, 0x6b, 0x03, 0x00, 0x31, 0x51, 0x48};
    byte[] FUNC_182 = new byte[]{Commands.GS, 0x28, 0x6b, 0x03, 0x00, 0x31, 0x52, 0x48};

    ByteArrayOutputStream writer = new ByteArrayOutputStream();

    writer.write(INIT);
    writer.write(FUNC_165);
    writer.write(FUNC_167);
    writer.write(FUNC_169);
    writer.write(FUNC_180);
    writer.write(content.getBytes());
    writer.write(FUNC_181);
    writer.write(FUNC_182);
    writer.write(CUT);
    writer.close();

输出为QHello !!

我在这里做错了什么。感谢任何帮助。

如果您在EPSON中引用这些页面,其中写入的参数数字是十进制的,而不是十六进制的。

GS ( k <Function 165>
GS ( k <Function 167>
GS ( k <Function 169>
GS ( k <Function 180>
GS ( k <Function 181>
GS ( k <Function 182>

还是自定义 VKP 打印机的正确参数?
我无法判断,因为我没有自定义 VKP 打印机的 ESC/POS 命令参考。

  • 从数值上看,我好像是在尝试打印微二维码,打印机支持吗?
  • 模块尺寸指定了一些未知值,但EPSON在1到16的范围内。默认值为3。
  • 而且由于FUNC_182是一个通知条码打印尺寸的函数,所以在打印后调用它是没有意义的。

假设打印机支持 MicroQRCode 打印,命令创建部分将如下所示:

byte[] FUNC_165 = new byte[]{Commands.GS, 0x28, 0x6b, 0x04, 0x00, 0x31, 0x41, 0x33, 0x00};
byte[] FUNC_167 = new byte[]{Commands.GS, 0x28, 0x6b, 0x03, 0x00, 0x31, 0x43, 0x03};
byte[] FUNC_169 = new byte[]{Commands.GS, 0x28, 0x6b, 0x03, 0x00, 0x31, 0x45, 0x30};
byte[] FUNC_180 = new byte[]{Commands.GS, 0x28, 0x6b, store_pL, store_pH, 0x31, 0x50, 0x30};
byte[] FUNC_181 = new byte[]{Commands.GS, 0x28, 0x6b, 0x03, 0x00, 0x31, 0x51, 0x30};
byte[] FUNC_182 = new byte[]{Commands.GS, 0x28, 0x6b, 0x03, 0x00, 0x31, 0x52, 0x30};
  • 虽然当前内容没有问题,但实际上指定数据长度为字节数组的长度,而不是字符串的长度。

所以第一部分是:

String content = "Hello !!";
byte[] content_bytes = content.getBytes(StandardCharsets.US_ASCII)
int store_len = content_bytes.length + 3;
byte store_pL = (byte) (store_len % 256);
byte store_pH = (byte) (store_len / 256);

实际的写法会是这样吗?:

writer.write(INIT);
writer.write(FUNC_165);
writer.write(FUNC_167);
writer.write(FUNC_169);
writer.write(FUNC_180);
writer.write(content_bytes);
writer.write(FUNC_181);
writer.write(CUT);
writer.close();

请尝试调整到您的Custom VKP打印机实际支持的参数范围。