Печать ESC / POS игнорирует первые несколько команд. Использование NodeJS

#javascript #node.js #printing #thermal-printer #escpos

#javascript #node.js #печать #термопринтер #escpos

Вопрос:

Я некоторое время боролся с этим.

Я пытаюсь печатать с помощью команд ESC / POS непосредственно на термопринтере.

Я отправляю данные с узла, используя либо модуль node-printer, либо:

https://www.npmjs.com/package/printer

или модуль ipp

https://www.npmjs.com/package/ipp

Оба дают мне точно такое же поведение, которое заключается в том, что первые несколько команд, которые я отправляю, похоже, полностью игнорируются.

Для тестирования я использовал команды из этого руководства:

https://www.neodynamic.com/articles/How-to-print-raw-ESC-POS-commands-from-Javascript/

Так, например, в моей программе node я мог бы иметь:

         let esc = 'x1B'; //ESC byte in hex notation
        let newLine = 'x0A'; //LF byte in hex notation

        let cmds = esc   "@"; //Initializes the printer (ESC @)
        cmds  = esc   '!'   'x38'; //Emphasized   Double-height   Double-width mode selected (ESC ! (8   16   32)) 56 dec => 38 hex
        cmds  = 'BEST DEAL STORES'; //text to print
        cmds  = newLine   newLine;
        cmds  = esc   '!'   'x00'; //Character font A selected (ESC ! 0)
        cmds  = 'COOKIES                   5.00'; 
        cmds  = newLine;
        cmds  = 'MILK 65 Fl oz             3.78';
        cmds  = newLine   newLine;
        cmds  = 'SUBTOTAL                  8.78';
        cmds  = newLine;
        cmds  = 'TAX 5%                    0.44';
        cmds  = newLine;
        cmds  = 'TOTAL                     9.22';
        cmds  = newLine;
        cmds  = 'CASH TEND                10.00';
        cmds  = newLine;
        cmds  = 'CASH DUE                  0.78';
        cmds  = newLine   newLine;
        cmds  = esc   '!'   'x18'; //Emphasized   Double-height mode selected (ESC ! (16   8)) 24 dec => 18 hex
        cmds  = '# ITEMS SOLD 2';
        cmds  = esc   '!'   'x00'; //Character font A selected (ESC ! 0)
        cmds  = newLine   newLine;
        cmds  = '11/03/13  19:53:17';
  

Затем отправьте эти команды непосредственно на принтер. Использование node-printer (взято прямо из их примера print_raw):

 let printer = require("printer");
this.printer.printDirect({data: cmds
    , type: 'RAW' // type: RAW, TEXT, PDF, JPEG, .. depends on platform
    , success:function(jobID: any){
        console.log("sent to printer with ID: " jobID);
     }
    , error:function(err: any){console.log(err);}
});
  

Или используя ipp:

 const ipp = require('ipp');
const uri = "ipp://localhost/printers/myPrinter";

let msg = {
       "operation-attributes-tag": {
       "requesting-user-name": "William",
       "job-name": "My Test Job",
       "document-format": "text/plain"
    },
    data: new Buffer(cmds)
};

const rawPrinter = ipp.Printer(uri);
rawPrinter.execute("Print-Job", msg, function(err: any, res: any){
    console.log(res);
});
  

При использовании обоих этих методов по какой-то причине печать начинается только с «жидких унций» (товар молока в поддельной квитанции). Любые команды до этого (включая выравнивание или выбор шрифта) полностью игнорируются.

Теперь, если я добавлю кучу команд перед этим, используя что-то вроде

 let stupid = 40;
while (stupid > 0) {
    cmds  = esc;
    stupid--;
}
  

Затем я распечатываю всю квитанцию. Но это кажется рееееееееееееее действительно хакерским и почти наверняка вернется, чтобы преследовать меня. Есть ли какое-то другое сообщение, которое мне нужно отправить на принтер, чтобы он прочитал команды с самого начала? Может быть, мне нужно отформатировать команды лучшим способом?

Я запускаю это на Ubuntu, и принтер представляет собой термопринтер Bixolon 350III, команды которого можно найти здесь:

http://www.bixolon.com/upload/download/unified command manual_rev_1_01.pdf

Очевидно, что я довольно новичок в этом, и я отчаянно надеюсь, что я упускаю что-то очевидное.

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

1. Найдено какое-либо решение или подсказка по этому поводу?

2. Привет, Fryser, извините за поздний ответ. В моем конкретном случае я просто использовал пакет npm escpos . npmjs.com/package/escpos . Эта проблема исчезла при простом использовании их пакета. Я заглянул в их код из любопытства, и хотя я никогда не возвращался, чтобы исправить свой собственный код, они делают что-то с BufferArrays, что может быть тем, что имеет значение. Итак, если вы еще не решили эту проблему, я бы рекомендовал посмотреть, как они это делают в этом пакете, или просто использовать пакет самостоятельно.

3. Я надеюсь, что эта библиотека поможет npmjs.com/package/@tillpos/xml-escpos-helper при написании или организации команды ESCPOS для оформления чеков (независимо от платформы). Эта статья тоже может помочь medium.com/till-engineering /… .