Как печатать квитанции с помощью TSPL и JavaScript

Как печатать квитанции с помощью TSPL и JavaScript

20 декабря 2022 г.

Если вы хотите узнать больше о печати этикеток с помощью команд TSPL, вы можете прочитать мои предыдущие статьи:

* Как печатать этикетки с помощью TSPL и JavaScript * Как печатать изображения с помощью TSPL и JavaScript

Но мы также можем печатать квитанции, используя те же команды TSPL, и использовать тот же принтер в качестве принтера чеков и этикеток. Некоторые из наших клиентов из «Alto's POS & Inventory» спросили нас, могут ли они использовать свой принтер этикеток в качестве принтера чеков. Итак, мы реализовали эту функцию, и я хотел поделиться тем, что следует учитывать при переключении между этими двумя режимами.

Высота чека

Мы используем рулоны этикеток для печати этикеток и непрерывные рулоны бумаги для квитанций.

Label Roll | Paper Roll

Сначала мы можем установить размер и распечатать несколько этикеток. Это не будет проблемой, потому что все этикетки на рулоне этикеток имеют одинаковый размер. Но при печати чеков ситуация иная, потому что каждый чек может иметь разную высоту.

Как правило, квитанционные принтеры используют язык, такие как ESC/POS. Одним из различий между TSPL и ESC/POS является необходимость установить размер квитанции во время печати. Поэтому, когда мы создаем квитанцию ​​с такими командами, как text , штрих -код и bitmap Нам нужно вычислить высоту квитанции в соответствии с элементами что у нас есть.

Мы вручную указываем высоту элементов, таких как штрих-код и растровое изображение, поэтому мы уже знаем их высоту, но мы должны рассчитать высоту текста в соответствии с используемым шрифтом. Давайте посмотрим, как выглядит текстовая команда:

ТЕКСТ x,y,"шрифт",поворот,x-умножение,y-умножение,[выравнивание,] "контент"

Каждый «шрифт» имеет разный размер:

<цитата>

1: точечный шрифт 8 x 12 с фиксированным шагом

2: точечный шрифт 12 x 20 с фиксированным шагом

3: точечный шрифт 16 x 24 с фиксированным шагом

4: точечный шрифт 24 x 32 с фиксированным шагом

5: шрифт с фиксированным шагом 32 x 48 точек

6: шрифт OCR-B с фиксированным шагом 14 x 19 точек

7: шрифт OCR-B с фиксированным шагом 21 x 27 точек

8: шрифт OCR-A с фиксированным шагом 14 x 25 точек

Итак, если квитанция содержит один текст, подобный этому:

ТЕКСТ 10,10,"2",0,1,1,"ШРИФТ 2"

Тогда высота чека должна быть:

y + [высота шрифта]*[умножение на y]

10 + 20*1 = 30 точек

Сбросьте настройки принтера

Как правило, принтер принимает размер в начале и будет использовать этот размер для всех этикеток, пока мы не сбросим принтер вручную. Другими словами, если мы напечатаем квитанцию ​​высотой 100, а затем попытаемся напечатать новую квитанцию ​​высотой 50, она продолжит печать с высотой 100.

Чтобы предотвратить это, мы можем перезагрузить принтер командой <ESC>!R, и он будет использовать наш новый размер:

<ESC>!R
SIZE 48 mm,25 mm
CLS
TEXT 10,10,"4",0,1,1,"HackerNoon"
BARCODE 10,60,"128",90,1,0,2,2,"altospos.com"
PRINT 1
END

Печать с помощью JavaScript (Node.js)

Я создал простой пример, который печатает две квитанции разной высоты. Высота первой квитанции составляет около 90 точек (включая отступы), а для принтера с разрешением 203 DPI она будет составлять около 11 мм (подробнее). А высота второго чека 21 мм. Если не перезагрузить принтер (<ESC>!R), то второй тоже будет иметь высоту 11 мм и оставшаяся часть не будет напечатана.

const usb = require('usb');

(async function() {
  await print([
    '<ESC>!R',
    'SIZE 80 mm,11 mm',
    'CLS',
    'TEXT 10,10,"4",0,1,1,"HackerNoon"',
    'TEXT 10,47,"1",0,1,1,"Top Stories"',
    'TEXT 10,64,"1",0,1,1,"Programming"',
    'PRINT 1',
    'END',
  ]);

  await print([
    '<ESC>!R',
    'SIZE 80 mm,21 mm',
    'CLS',
    `TEXT 10,10,"4",0,1,1,"Alto's POS & Inventory"`,
    'TEXT 10,50,"2",0,1,1,"Restaurants & Cafes"',
    'TEXT 10,75,"2",0,1,1,"Retail Stores"',
    'TEXT 10,100,"2",0,1,1,"Services"',
    'TEXT 10,125,"1",0,1,1,"https://altospos.com"',
    'PRINT 1',
    'END',
  ]);
})();

function print(cmds) {
  return new Promise(resolve => {
    // you can get all available devices with usb.getDeviceList()
    let device = usb.findByIds(/*vid*/8137, /*pid*/8214);
    device.open();
    const interface = device.interfaces[0];
    interface.claim();
    const outEndpoint = interface.endpoints.find(e => e.direction === 'out');
    outEndpoint.transferType = 2;
    outEndpoint.transfer(Buffer.from(cmds.join('rn')), (err) => {
      device.close();
      resolve();
    });
  });
}

Я использовал пакет 'usb' для подключения и отправки команд (в Windows вам может понадобиться чтобы установить драйвер, чтобы узнать больше, посетите страницу пакета).

Не было войны! ✋🏽


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE