DEV Community

Felipe Rocha Barros
Felipe Rocha Barros

Posted on

Ressuscitei uma impressora térmica de banco que não fala ESC/POS nem imprime QR Code

Como fazer uma impressora que "imprime tudo errado e não faz QR Code" voltar a
ser útil num PDV moderno — sem trocar nada nela.


O problema

Tem uma pilha de impressoras térmicas Diebold Procomp IM453H (e primas:
IM433, IT4x2, IM1x3I, TSP143M) encostada por aí. Foram de banco — Itaú,
Bradesco, BB, Caixa — para autenticar boleto e imprimir comprovante. São
robustas, têm guilhotina, mecanismo bom. E são baratas no mercado de usados.

O problema aparece quando você liga uma dessas num PDV comum: sai tudo
embaralhado, os acentos viram lixo, e o QR Code simplesmente não aparece.

O motivo é simples: ela não fala ESC/POS. ESC/POS (Epson) virou o padrão de
fato das impressoras de cupom — quase todo PDV/ERP manda ESC/POS. A IM453H usa o
conjunto próprio da Diebold/Mecaf, os "Comandos Padrão". Cada byte é
interpretado de outro jeito:

O PDV manda (ESC/POS) A IM453H entende (Comandos Padrão)
1B 40 — reset não existe
1B 21 n — modo de impressão não existe → imprime ! + lixo
1B 61 01 — centralizar 1B 41 n = espaçamento de linha n/72" → destrói o layout
1D 28 6BQR Code o prefixo dela é 1D 30 (GS 0) → ignora, nada sai
1D 56 — corte corte é 1B 77 (ESC w) → não corta
tabela de caracteres padrão é ABICOMP, nem CP850

E o mais importante: essa família de firmware não tem comando de QR Code.
Só código de barras 1D (EAN, Code128, Code39…). O manual do firmware confirma —
QR nunca foi implementado nessa geração. (Existe uma variante mais nova, a
IM453HU-002, que tem QR nativo. Mas a maioria das unidades que rodam por aí,
principalmente as ex-banco com firmware customizado, não tem.)


Por que não usar o que já existe

Antes de sair codando, o que já havia:

  • Driver GPD/Unidrv da Diebold — rasteriza páginas GDI para o formato nativo. Funciona se o app imprime via GDI. Não serve se o app manda ESC/POS cru (que é o caso da maioria dos PDVs), e não é uma ponte.
  • SDK da Diebold (MECAFW32 / ME_LM_T230.dll) — proprietário, você tem que programar contra a API deles.
  • ACBr / ACBrPOSPrinter — projeto brasileiro open source, excelente, tem um modelo Diebold que emite os Comandos Padrão. Mas é uma biblioteca: seu app precisa ser escrito contra a API do ACBr (ou usar o ACBrMonitor com o protocolo dele). É tradução comando-a-comando, então herda as lacunas — tem relato no próprio fórum de QR não saindo na IM453HU.
  • Proxies de ESC/POS genéricos no GitHub — interceptam o stream para arquivar ou encaminhar como dados, ou renderizam para preview no navegador. Nenhum traduz ESC/POS para a linguagem nativa de outra impressora não-ESC/POS.

Ou seja: as peças existem soltas. Ninguém tinha juntado numa ponte
transparente que pega ESC/POS de qualquer app sem modificar o app, rasteriza
tudo, e imprime no Diebold
— com instalador de um clique e sem depender de
driver nem SDK da Diebold.


A ideia: rasterizar tudo

A jogada central é não brigar com a linguagem nativa comando por comando.
Em vez disso:

  1. Interpretar o cupom ESC/POS (texto, atributos, alinhamento, QR, código de barras, corte).
  2. Redesenhar o cupom inteiro como uma imagem de 576 px de largura (72 mm a 203 dpi) — texto numa fonte monoespaçada, QR gerado como bitmap, barras desenhadas.
  3. Codificar essa imagem no comando raster nativo da IM453H (ESC n <marg> <larg> <n1> <n2> + bytes, ESC US para o corte parcial).

A impressora só precisa imprimir uma imagem — e isso ela faz muito bem. Não
importa mais que ela não entenda ESC/POS, não tenha QR nativo, esteja em
ABICOMP, não tenha comando de centralizar. Tudo virou pixel.

O mesmo pipeline aceita PDF também (para o fluxo "gera PDF e imprime",
comum em quiosque): rasteriza a página, apara as margens, escala para 72 mm.

  PDV / ERP / legado
        │  ESC/POS  ────────┐
        │  PDF      ────────┤
        ▼                   ▼
  ┌──────────────────────────────────────────┐
  │  diebold-bridge                          │
  │  sniff  ──► %PDF ? ─► rasteriza PDF       │
  │                  senão ─► parser ESC/POS  │
  │                          └► layout 576px  │
  │  imagem 1-bit  ─►  raster nativo IM453H   │
  └──────────────────────────────────────────┘
        │
        ▼
  fila RAW "Generic / Text Only"  ─►  IM453H (USB)
Enter fullscreen mode Exit fullscreen mode

Não precisa do driver da Diebold: o "Generic / Text Only" que já vem no
Windows serve como cano RAW até a porta USB.

Como o app fala com a ponte

Três entradas, todas equivalentes:

  • Impressora do Windows DIEBOLD-BRIDGE — uma fila comum; o que chega nela vai por uma porta TCP local até o serviço.
  • Socket 127.0.0.1:9100 — ESC/POS direto (padrão JetDirect).
  • Pasta — solta um .prn ou .pdf numa pasta vigiada.

O PDV não muda nada. Ele só passa a imprimir na DIEBOLD-BRIDGE em vez da
impressora antiga.


Detalhes que valem a pena

O GPD entregou a linguagem. O arquivo .gpd do driver (texto puro) mostra
que LF, CR e FF são todos 0x00 na IM453H, o avanço é ESC > / ESC o,
e tudo é bloco raster. Isso sozinho explica por que ESC/POS sai picotado.

O manual do firmware estava "escondido". A referência completa dos Comandos
Padrão veio de um PDF de manual de firmware que a Diebold distribuía para
técnicos. O .chm do SDK não descompila no Windows 10 (hh.exe -decompile
bloqueado), mas o PDF do manual tem a tabela toda — foi de lá que saiu a
referência de comandos do repositório.

QR como raster funciona liso. Gera o QR com uma lib (segno), desenha os
módulos num bitmap, encaixa no cupom. Escaneia normalmente. O tamanho do módulo
é configurável (ou respeita o que o ESC/POS pediu).

Economia de papel. Rasterizar não precisa ser esbanjador: colapsando linhas
em branco e apertando a entrelinha, o cupom saiu ~55% mais curto que a primeira
versão, sem perder legibilidade.

Fonte embutida. Para a saída ser idêntica em qualquer máquina, a fonte
(DejaVu Sans Mono, licença redistribuível) vai dentro do executável — não
depende de fonte do Windows.

Sem dependência da Diebold. Nenhum .dll, driver ou SDK da Diebold é
instalado. Só o Generic / Text Only do Windows.


Instalação

O executável é compilado publicamente pelo GitHub Actions (Windows). Para o
usuário final:

  1. Baixa e extrai o DieboldBridge-Setup.zip da release.
  2. Liga a IM453H no USB.
  3. Duplo-clique em INSTALAR.bat → aceita o UAC.
  4. Espera "INSTALADO E RODANDO".

Ele detecta a impressora pelo VID/PID, cria as duas filas, registra um serviço
que sobe no boot, e diz qual impressora usar. Desinstalar é outro duplo-clique.


Limitações e o que falta

  • O .exe não é assinado — o SmartScreen avisa na primeira execução. O build público serve como conferência até ter um certificado.
  • Falta suporte a bobina de 58 mm (hoje assume 72 mm).
  • GS 8 L (imagens grandes) ainda não; GS v 0, GS ( L e GS * sim.
  • Para NFC-e no caminho PDF, a conformidade do DANFE é responsabilidade de quem gera o PDF — a ponte só reproduz fielmente.

Repositório

https://github.com/feliperocha7/diebold-im453h-escpos — MIT.

Tem impressora dessas parada? É pegar a release, instalar e mandar imprimir.
Contribuição e relato de outros modelos da família são bem-vindos.

Top comments (0)