Печать ESC / POS игнорирует первые несколько команд. Использование nodeJS - PullRequest
0 голосов
/ 05 апреля 2019

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

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

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

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/

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

        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);
});

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

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

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

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

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

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

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

...