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 6B` — **QR 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)
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.