Я боролся с этим некоторое время.
Я пытаюсь печатать с помощью команд 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
Очевидно, я довольно новичок в этом, и я отчаянно надеюсь, что мне не хватает чего-то очевидного.