[RESOLVIDO] Imprimir via Node.js em uma impressora térmica

Fala galera, estou com um desafio para resolver em node.js electron ou react. Preciso de uma aplicação que envie código ESC/POS para uma impressora térmica, conectada via USB.
Analisei muitas alternativas disponíveis na npm mas nenhuma satisfez minha necessidade.
Atualmente estou com esse código:

const escpos = require("escpos");
// install escpos-usb adapter module manually
escpos.USB = require("escpos-usb");
// Select the adapter based on your printer type
const device = new escpos.USB();
// const device  = new escpos.Network('localhost');
// const device  = new escpos.Serial('/dev/usb/lp0');

const options = { encoding: "GB18030" /* default */ };
// encoding is optional

const printer = new escpos.Printer(device, options);

device.open(function (error) {
  printer
    .font("a")
    .align("ct")
    .style("bu")
    .size(1, 1)
    .text("The quick brown fox jumps over the lazy dog")
    .text("敏捷的棕色狐狸跳过懒狗")
    .barcode("1234567", "EAN8")
    .table(["One", "Two", "Three"])
    .tableCustom(
      [
        { text: "Left", align: "LEFT", width: 0.33, style: "B" },
        { text: "Center", align: "CENTER", width: 0.33 },
        { text: "Right", align: "RIGHT", width: 0.33 },
      ],
      { encoding: "cp857", size: [1, 1] } // Optional
    )
    .qrimage("https://github.com/song940/node-escpos", function (err) {
      this.cut();
      this.close();
    });
});

Mas retorna o seguinte erro:

[nodemon] starting `node src/index.js`
/home/projetos/pessoal/back-web-printer/node_modules/escpos-usb/index.js:50
    throw new Error('Can not find printer');
    ^

Error: Can not find printer
    at new USB (/home/projetos/pessoal/back-web-printer/node_modules/escpos-usb/index.js:50:11)
    at Object.<anonymous> (/home/projetos/pessoal/back-web-printer/src/index.js:5:16)
    at Module._compile (node:internal/modules/cjs/loader:1256:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1310:10)
    at Module.load (node:internal/modules/cjs/loader:1119:32)
    at Module._load (node:internal/modules/cjs/loader:960:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:23:47

Node.js v18.17.1
[nodemon] app crashed - waiting for file changes before starting...

Mesmo que a impressora esteja conectada e com o driver.
Aqui minhas dependências:

"dependencies": {
   "body-parser": "^1.20.2",
   "cors": "^2.8.5",
   "dotenv": "^8.2.0",
   "escpos": "^3.0.0-alpha.6",
   "escpos-usb": "^3.0.0-alpha.4",
   "express": "^4.18.2",
   "usb": "^2.11.0"
},
"devDependencies": {
   "nodemon": "^3.0.1"
},

Fonte: GitHub - song940/node-escpos: 🖨️ ESC/POS Printer driver for Node.js
:muscle:

1 curtida

tenta adicionar alterar esse trecho acima pra esse:

const device  = new escpos.USB(0x456,0x808);

tenta novamente e diz oq rolou

1 curtida

se vc tiver a documentação da sua impressora, pode ser que ajude tb. Esses valores acima são ref. a Vendor ID e Product ID.

Exemplo da epson:


Outra alternativa:

const escpos = require('escpos');
escpos.USB = require('escpos-usb');
const devices = escpos.USB.findPrinter();

//caso vc tenha +1 impressora, vale fazer o filtro.
devices.forEach(function(el) {
    let device = new escpos.USB(el)
    const printer = new escpos.Printer(device);
    device.open(function(){
        printer
            .font('a')
            .align('ct')
            .style('bu')
            .size(1, 1)
            .text('The quick brown fox jumps over the lazy dog')
            .cut()
            .close()
    });
})
1 curtida

Fala ai!
Cara fiz as recomendações que você me alertou mas mesmo assim sigo sem encontrar a impressora :confused:

Estou buscando algo que explique esse comportamento de comunicação com as portas USB e se por algum motivo estão bloqueadas. A documentação da impressora não ajuda quanto a isso, pois só indica que ela é compatível com ESC/POS e é só enviar os dados para a porta conectada, e que nem precisa de driver para utilizar com esse tipo de comunicação, é só enviar os dados.

faz assim:

  • entra nesse arquivo: /node_modules/escpos-usb/index.js.
  • vai até a linha 68 (função USB.findPrinter).
  • altera todo conteúdo que tá lá por esse abaixo e dps roda o programa dnv:
USB.findPrinter = function(){
  if (!usb) {
    usb = require('usb');
  }
  return usb.getDeviceList()
};

qual a marca?

1 curtida

Showw isso funcionou, agora consigo ver os devices, tem 2:

[
  {
    busNumber: 2,
    deviceAddress: 1,
    deviceDescriptor: {
      bLength: 18,
      bDescriptorType: 1,
      bcdUSB: 768,
      bDeviceClass: 9,
      bDeviceSubClass: 0,
      bDeviceProtocol: 3,
      bMaxPacketSize0: 9,
      idVendor: 7531,
      idProduct: 3,
      bcdDevice: 1301,
      iManufacturer: 3,
      iProduct: 2,
      iSerialNumber: 1,
      bNumConfigurations: 1
    }
  },
  {
    busNumber: 1,
    deviceAddress: 1,
    deviceDescriptor: {
      bLength: 18,
      bDescriptorType: 1,
      bcdUSB: 512,
      bDeviceClass: 9,
      bDeviceSubClass: 0,
      bDeviceProtocol: 1,
      bMaxPacketSize0: 64,
      idVendor: 7531,
      idProduct: 2,
      bcdDevice: 1301,
      iManufacturer: 3,
      iProduct: 2,
      iSerialNumber: 1,
      bNumConfigurations: 1
    }
  }
]

Vou testar com esses VendorId e ProductId para ver se funciona.

A marca é Knup modelo KP-IM601

Outro ponto importante para ser notado é que estou rodando o projeto no WSL e parece que o acesso às portas USB é um pouco conturbado, vou tentar rodar no Powershell.

não é nenhum… Faz um tempo q não uso windows, tenta procurar algum lugar q se chama “Impressoras”, talvez. E vê se a impressora que vc quer já tá adicionada lá

1 curtida

Finalmente consegui resolver.
O problema era realmente o driver. O Windows instala um driver padrão que não é compatível com a biblioteca que estou utilizando. Foi necessário instalar o software Zadig para fazer o replace pelo driver correto.
Meu código imprimiu corretamente e no final meu código ficou assim:

import { Printer, Image } from "@node-escpos/core";
// install escpos-usb adapter module manually
import USB from "@node-escpos/usb-adapter";
// Select the adapter based on your printer type

const device = new USB();

const imprimirPedido = () => {
  device.open(async function (err) {
    if (err) {
      // handle error
      return;
    }

    // encoding is optional
    const options = { encoding: "GB18030" /* default */ };
    let printer = new Printer(device, options);

    printer
      .font("a")
      .align("ct")
      .style("bu")
      .size(1, 1)
      .text("May the gold fill your pocket")
      .text("恭喜发财")
      .barcode(112233445566, "EAN13", { width: 50, height: 50 })
      .table(["One", "Two", "Three"])
      .tableCustom(
        [
          { text: "Left", align: "LEFT", width: 0.33, style: "B" },
          { text: "Center", align: "CENTER", width: 0.33 },
          { text: "Right", align: "RIGHT", width: 0.33 },
        ],
        { encoding: "cp857", size: [1, 1] } // Optional
      );

    // inject qrimage to printer
    printer = await printer.qrimage("https://github.com/node-escpos/driver");
    // inject image to printer
    printer.cut().close();
  });
};

imprimirPedido();

package.json

{
  "name": "back-web-printer",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "type": "module",
  "dependencies": {
    "@node-escpos/core": "^0.4.0",
    "@node-escpos/usb-adapter": "^0.3.1",
    "body-parser": "^1.20.2",
    "cors": "^2.8.5",
    "dotenv": "^8.2.0",
    "escpos": "^3.0.0-alpha.6",
    "escpos-usb": "^3.0.0-alpha.4",
    "express": "^4.18.2",
    "usb": "^1.8.8"
  },
  "devDependencies": {
    "nodemon": "^3.0.1"
  },
  "scripts": {
    "dev": "nodemon src/index.js"
  },
  "author": "",
  "license": "ISC"
}

image

Agradeço demais ao @rodriguesabner pela força :muscle::muscle:

1 curtida