Почему символ «€» печатается только до инициализации принтера, а не после инициализации? - PullRequest
0 голосов
/ 08 апреля 2020

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

Используя следующую функцию, я получаю странный вывод:

    public static void printerTestFunction2(string printerName)
    {
        PosExplorer explorer = new PosExplorer();
        DeviceInfo di = explorer.GetDevice("PosPrinter", printerName);
        PosPrinter printer = (PosPrinter)explorer.CreateInstance(di);

        printer.Open();
        printer.Claim(10000);
        printer.DeviceEnabled = true;
        printer.AsyncMode = false;

        string init = System.Text.ASCIIEncoding.ASCII.GetString(new byte[] { 27, 64 });
        string totalCut = System.Text.ASCIIEncoding.ASCII.GetString(new byte[] { 27, 105 });
        string cmd = init + init + "A€A\nB€B\n" + init + "C€C\nD€D\n\n\n\n\n\n\n" + totalCut;
        printer.PrintNormal(PrinterStation.Receipt, cmd);
    }

Вывод:

A € A

B € B

CF C

DFD

enter image description here

Таким образом, символ € печатается в виде странного символа "F" (кажется, что F ниже, чем нормальные символы). Бумага обрезана правильно.

Я также проверил различные созвездия. Кажется, что знак «€» печатается только перед первой командой инициализации, которая отправляется на принтер после того, как будет напечатана хотя бы одна строка. (Я могу отправить несколько команд инициализации в начале - печатается €. Если я отправлю инициализацию после того, как будут напечатаны некоторые символы, вместо «€» появится «F»). Если я перезапущу свою программу, символ «€» снова будет напечатан правильно, но если я отправлю команду init, она снова будет напечатана как «F».

По какой причине символ «€» является только печатать перед третьей командой инициализации? Что-то не так с моим кодом или я пропустил настройку?

1 Ответ

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

Причина, по которой печатаются буквы типа F, заключается в том, что принтер находится в инициализированном состоянии, кодовая страница 437.
Посмотрите на буквы в следующем материале: 213 в десятичном виде и 0xD5 в шестнадцатеричном.

Страница 0 [PC437: США, Стандартная Европа]

Страница 19 [PC858: Евро]


Сервисный объект POS для. NET внутренне управляет настройками кодовой страницы в соответствии со значением свойства CharacterSet.

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

Если вы используете POS для. NET (включая OPOS / JavaPOS), вам не следует использовать команду инициализации (ESC @) или аналогичные команды для изменения режима или настроек.

В этом смысле, вместо того, чтобы отправлять обрезку бумаги также непосредственно команде ES C i ({27, 105}), вызовите метод CutPaper или поместите управляющую последовательность обрезки бумаги POSPrinter (ESC | P) определяется в UnifiedPOS в строке запроса на печать.

...