Распечатать QR-код "GS (k "с более чем 124 байтами через" PrintNormal "? - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть принтер 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-кодов в виде простого текста. Как вы можете видеть здесь: result На рисунке показан 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)

1 Ответ

1 голос
/ 08 апреля 2020

Есть много осложнений, связанных с этим.


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

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

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


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

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

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

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

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

...