Распечатать QR-код GS (k ‹Function 180› с более чем 124 байтами через PrintNormal?

У меня есть принтер Epson TM-T88VI, и я использую Microsoft.PointOfService.PosPrinter на C # для печати.

Я пытаюсь распечатать QR-коды с помощью команд ESC 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 is "AASDFASDFASDFADSFADSFASDFADSFADSFADSFADSFADSFADSFADSFADSFADSFKLJADSJKLFADSJKLFADSJKLFDJKLFDSJKLFADSJLFDSJLKFDJLSKFDJKLSFADXX"

Этот QR-код напечатан правильно (pL равно 127, pH равно 0), pL кодируется как "\ u007f":
"\u001d(k\u007f\01P0AASDFASDFASDFADSFADSFASDFADSFADSFADSFADSFADSFADSFADSFADSFADSFKLJADSJKLFADSJKLFADSJKLFDJKLFDSJKLFADSJLFDSJLKFDJLSKFDJKLSFADXX" Значение rere[3]: 127, значение rere[4] = 0

2) Затем я пытаюсь сгенерировать QR-код с длиной строки 125: data is "AASDFASDFASDFADSFADSFASDFADSFADSFADSFADSFADSFADSFADSFADSFADSFKLJADSJKLFADSJKLFADSJKLFDJKLFDSJKLFADSJLFDSJLKFDJLSKFDJKLSFADXXT"

Этот QR-код не печатается (pL равно 128, pH равно 0), pL кодируется как "?" который имеет байтовое значение 63:

"\u001d(k?\01P0AASDFASDFASDFADSFADSFASDFADSFADSFADSFADSFADSFADSFADSFADSFADSFKLJADSJKLFADSJKLFADSJKLFDJKLFDSJKLFADSJLFDSJLKFDJLSKFDJKLSFADXXT"

Значение rere[3]: 63, значение rere[4] = 0

Я хочу получить два штрих-кода один за другим, но я получаю только один и часть содержимого второго QR-кода в виде простого текста. Как вы можете видеть здесь:  result На картинке показан QR-код 1) и текстовая часть 2)

Первые 63 символа стираются, а символы 64+ печатаются как обычный текст. Хорошо, это потому, что значение байта 63 вместо 128. Но почему QR-код не печатается с 63 символами?

Это потому, что значение байта 128 кодируется как строковый символ «?». Но как я могу распечатать свой QR-код с помощью Microsoft.PointOfService.PosPrinter.PrintNormal, если я не могу сохранить строки со значениями байтов> 127?

Есть ли альтернативный вызов функции в классе PosPrinter, который принимает простые байтовые массивы? Я еще не нашел.

Есть ли другое решение, кроме PosPrinter.PrintBarcode?

Что ты предлагаешь?

РЕДАКТИРОВАТЬ: Решение. Я использовал массив байтов, а затем преобразовал каждый отдельный байт (через char) в строку. В этой строке вместо кодировки используются простые байтовые значения. Затем я использую 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)

person Boardwish    schedule 08.04.2020    source источник


Ответы (1)


Это связано с множеством сложностей.


Во-первых, как я ответил на предыдущий вопрос, если вы используете POS для .NET (включая OPOS / JavaPOS), не отправляйте команду управления ESC / POS принтера напрямую с помощью метода PrintNormal.

Если вы хотите распечатать QR-код, он может поддерживаться PrintBarcode методом, проверьте документ ADK EPSON, а если вы не можете найти его в документе ADK, обратитесь в службу поддержки EPSON.

Можно отправлять управляющие команды ESC / POS для принтера в соответствии со спецификацией UnifiedPOS.
Управляющая последовательность UnifiedPOS POSPrinter под названием «Путь через встроенные данные» (ESC | [*] # E) отправит указанные байты данных in # непосредственно на принтер.
Однако предполагается, что объект службы поддерживает эту функцию. Чтобы узнать о доступности поддержки, обратитесь к документации ADK или по контактам в службу поддержки.


Далее, это зависит от того, используете ли вы собственный объект службы POS для .NET или объект службы OPOS через COM-взаимодействие.

При использовании служебных объектов OPOS преобразование кодовых страниц Unicode в ANSI выполняется автоматически функцией времени выполнения OLE во время вызова метода, а коды символов, превышающие 127, могут быть изменены кодовой страницей системы. Кроме того, если в середине данных есть 0x00, он будет прерван, а остальные данные будут проигнорированы.

Это связано с тем, что параметром метода PrintNormal является строка, а не массив байтов.

Свойство ILegacyControlObject.BinaryConversion объекта службы можно изменить на Nibble или Decimal вместо значения по умолчанию None.
Однако, в зависимости от реализации COM-взаимодействия POS для .NET, может потребоваться внимание, поэтому лучше обратиться службу поддержки о том, как его использовать.

Если вы используете собственный объект службы в POS для .NET, это зависит от того, как он реализован. Опять же, обратитесь к документации ADK или обратитесь в службу поддержки для получения дополнительной информации.

person kunif    schedule 08.04.2020
comment
ESC | [*] # E - это решение. Спасибо - person Boardwish; 08.04.2020