我有一台 Epson TM-T88VI 打印机并使用 C# 中的 Microsoft.PointOfService.PosPrinter 进行打印。
我尝试通过 ESC POS 命令打印二维码。
一切正常,直到打印 125+ 字节的 QR 码数据。
这是我的功能:
private string fct180(string data)
{
byte[] barr = System.Text.ASCIIEncoding.ASCII.GetBytes(data);
int len = barr.Length + 3;
byte pH = (byte)(len / 256);
byte pL = (byte)(len - (256 * pH));
byte[] cmd = new byte[8 + barr.Length];
cmd[0] = 29;
cmd[1] = 40;
cmd[2] = 107;
cmd[3] = pL;
cmd[4] = pH;
cmd[5] = 49;
cmd[6] = 80;
cmd[7] = 48;
Array.Copy(barr, 0, cmd, 8, barr.Length);
string testing = System.Text.ASCIIEncoding.ASCII.GetString(cmd);
byte[] rere = System.Text.ASCIIEncoding.ASCII.GetBytes(testing);
string ret = System.Text.ASCIIEncoding.ASCII.GetString(cmd);
return ret;
}
我的情况:
1)起初我尝试生成内容字符串长度为124的二维码:
data
是"AASDFASDFASDFADSFADSFASDFADSFADSFADSFADSFADSFADSFADSFADSFADSFKLJADSJKLFADSJKLFADSJKLFDJKLFDSJKLFADSJLFDSJLKFDJLSKFDJKLSFADXX"
此二维码打印正确(pL 为 127,pH 为 0),pL 编码为“\u007f”:
"\u001d(k\u007f\01P0AASDFASDFASDFADSFADSFASDFADSFADSFADSFADSFADSFADSFADSFADSFADSFKLJADSJKLFADSJKLFADSJKLFDJKLFDSJKLFADSJLFDSJLKFDJLSKFDJKLSFADXX"
值为rere[3]:
127,值为rere[4]
= 0
2)然后我尝试生成一个字符串长度为125的二维码:
data
是"AASDFASDFASDFADSFADSFASDFADSFADSFADSFADSFADSFADSFADSFADSFADSFKLJADSJKLFADSJKLFADSJKLFDJKLFDSJKLFADSJLFDSJLKFDJLSKFDJKLSFADXXT"
此二维码不打印(pL 为 128,pH 为 0),pL 编码为“?” 其字节值为 63:
"\u001d(k?\01P0AASDFASDFASDFADSFADSFASDFADSFADSFADSFADSFADSFADSFADSFADSFADSFKLJADSJKLFADSJKLFADSJKLFDJKLFDSJKLFADSJLFDSJLKFDJLSKFDJKLSFADXXT"
值rere[3]:
63,值rere[4]
= 0
我想一个接一个地获取两个条形码,但我只将第二个二维码内容的一个和一部分作为纯字符串文本。如您在此处看到
的:图为1)的QR码和2)的文字部分
前 63 个字符被擦除,字符 64+ 被打印为普通文本。好的,那是因为字节值是63而不是128。但是为什么QR码没有打印63 char?
那是因为字节值 128 被编码为字符串字符“?”。但是,如果我不能保留字节值 > 127 的字符串,如何使用 Microsoft.PointOfService.PosPrinter.PrintNormal 打印我的 QR 码?
PosPrinter 类中是否有其他函数调用可以接受纯字节数组?我还没有找到一个。
除了 PosPrinter.PrintBarcode 还有其他解决方案吗?
你有什么建议?
编辑:解决方案 我使用了字节数组,然后将每个单字节(通过字符)转换为字符串。该字符串使用纯字节值而不是编码。然后我使用转义序列“ESC|[*]#E”。然后在 PrintNormal 中使用它。这会将字符串直接定向到打印机,而不会在两者之间进行处理。现在也可以处理大于 127 的字节值。
string ESC = System.Text.ASCIIEncoding.ASCII.GetString(new byte[] { 27 });
byte[] bqr = ...;
string data = "";
for (int i = 0; i < bqr.Length; ++i)
{
data += (char)bqr[i];
}
string cmd = ESC + "|*" + data.Length + "E" + data;
printer.PrintNormal(PrinterStation.Receipt, cmd)