У меня есть принтер Epson TM-T88VI, и я использую Microsoft.PointOfService.PosPrinter в C# для печати.
Я пытаюсь печатать QR-коды с помощью команд ES C POS.
Все работает нормально до печати данных QR-кода с 125+ байтами.
Это моя функция:
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) Сначала я пытаюсь для создания QR-кода с длиной строки содержимого 124: data
равно "AASDFASDFASDFADSFADSFASDFADSFADSFADSFADSFADSFADSFADSFADSFADSFKLJADSJKLFADSJKLFADSJKLFDJKLFDSJKLFADSJLFDSJLKFDJLSKFDJKLSFADXX"
Этот QR-код напечатан правильно (pL равно 127, pH равно 0), pL кодируется как "\ u007f" :
"\u001d(k\u007f\01P0AASDFASDFASDFADSFADSFASDFADSFADSFADSFADSFADSFADSFADSFADSFADSFKLJADSJKLFADSJKLFADSJKLFDJKLFDSJKLFADSJLFDSJLKFDJLSKFDJKLSFADXX"
Значение rere[3]:
127, значение rere[4]
= 0
2) Затем я пытаюсь сгенерировать QR-код с длиной строки 125: data
равен "AASDFASDFASDFADSFADSFASDFADSFADSFADSFADSFADSFADSFADSFADSFADSFKLJADSJKLFADSJKLFADSJKLFDJKLFDSJKLFADSJLFDSJLKFDJLSKFDJKLSFADXXT"
Этот QR-код не печатается (pL = 128, pH = 0), pL кодируется как "?" значение байта 63:
"\u001d(k?\01P0AASDFASDFASDFADSFADSFASDFADSFADSFADSFADSFADSFADSFADSFADSFADSFKLJADSJKLFADSJKLFADSJKLFDJKLFDSJKLFADSJLFDSJLKFDJLSKFDJKLSFADXXT"
значение rere[3]:
63, значение rere[4]
= 0
Я хочу получить два штрих-кода друг за другом, но я только получить один и часть второго содержимого QR-кодов в виде простого текста. Как вы можете видеть здесь: На рисунке показан QR-код 1) и текстовая часть 2)
Первые 63 символа стираются, а символы 64+ печатаются как обычный текст. Хорошо, это потому, что значение байта равно 63 вместо 128. Но почему QR-код не напечатан с 63 символами?
Это потому, что значение 128 байта закодировано как строковый символ "?". Но как я могу напечатать свой QR-код с помощью Microsoft.PointOfService.PosPrinter.PrintNormal, если я не могу сохранить строки со значениями байтов> 127?
Есть ли альтернативный вызов функции в классе PosPrinter, который принимает простой байт массивы? Я еще не нашел.
Есть ли другое решение, кроме PosPrinter.PrintBarcode?
Что бы вы предложили?
РЕДАКТИРОВАТЬ: Решение I использовал массив байтов, а затем преобразовал каждый байт (через символ) в строку. Эта строка использует простые байтовые значения вместо кодирования. Затем я использую escape-последовательность "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)