Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Как правильно печатать на термальном (чековом) принтере

#c_sharp


Имею принтер Epson TM-T58. Печатаю на ESC/POS. Поставил дровишки с сайта производителя.
Попробовал распечатать как через обычный принтак - кракозябры, кодировка или шрифт
не нравится, это и так понятно. Может кто подкинуть готовый примерчик на C# который
бы смог подключиться к COM1 и отправить команды для печати, к примеру, слова - "Привет"?
Осилил на яве это дело, а вот на C# так и не смог. Мне достаточно наброска даже для
другой модели. Какую библиотеку использовать в принципе тоже не важно. 
    


Ответы

Ответ 1



Собственно, спустя некоторое кол-во времени, я таки разобрался, как отсылать команды. Оставлю тут небольшой пример: SerialPort serialPort; serialPort = new SerialPort("COM1"); serialPort.Encoding = Encoding.GetEncoding("CP866"); serialPort.Open(); const string ESC = "\u001B"; ///ESC command (1B) const string Init = ESC + "\u0040"; ///Init printer commands - ESC @ (1B 40) const string CommandSize = ESC + "\u0021"; ///Set size chars - ESC ! (1B 21) const string CommandDoubleSize = CommandSize + "\u0030"; ///Double charsize - ESC ! 0 (1B 21 30) const string CommandDefaultSize = CommandSize + "\u0000"; ///Default style - ESC ! null (1B 21 00) if(serialPort.IsOpen) { serialPort.Write(Init); serialPort.Write("Привет!"); serialPort.Write(CommandDoubleSize + "Привет!" + CommandDefaultSize); } serialPort.Close(); К принтаку обычно документация идет, какие команды принтер кушает, а для тех кто в танке, отправляем просто HEX вариант этой команды, в примере показал, как изменить шрифт на моем принтере, в частности, сделать его большим. А у тех, у кого ошибка из серии "Доступ к порту 'COM1' закрыт." - удалите весь софт от принтера, даже дрова, пусть вообще не будет определен в системе.

Ответ 2



Я такое сделал с помощью записи RTF и даже при помощи Google Chrome'а. Вот пример напрямую из репозитория, код RichTextBoxPrintctrl доступен там же: PrintDocument Document = new PrintDocument(); RichTextBoxPrintCtrl Control = new RichTextBoxPrintCtrl(); try { Control.LoadFile(FinalReceiptFilename); Document.PrintPage += _printDocument_PrintPage; Document.PrinterSettings.PrinterName = "VPK 80"; Document.DefaultPageSettings.Landscape = false; Document.DefaultPageSettings.Margins.Left = Document.DefaultPageSettings.Margins.Right = 0; Document.DefaultPageSettings.Margins.Top = 10; Document.PrinterSettings.MaximumPage = 1; Document.PrinterSettings.MinimumPage = 1; foreach (System.Drawing.Printing.PaperSize PaperSize in Document.PrinterSettings.PaperSizes) { if (PaperSize.PaperName == ReceiptSize) { Document.DefaultPageSettings.PaperSize = PaperSize; break; } } Document.Print(); return true; } catch (Exception e) { Terminal.Log4NET.Error("Ошибка печати чека: " + e.Message + ", детали: " + e.StackTrace); } Для печати также можно использовать Google Chrome - там лучше всего получается использовать стили для Print View и печать через обычный механизм этого браузера. Для этого был создан файл print.css и подключался на странице где будут печататься чеки - стили в нем были исключительно для чека в скрывали все остальное.

Комментариев нет:

Отправить комментарий