Printer Universal
Interconecta aplicaciones web con hardware de escritorio para imprimir
Qué incluye
Impresión térmica silenciosa desde el navegador. Con su código.
Un sistema de ventas que corre en el navegador no puede imprimir un ticket sin
que salte el diálogo de impresión de Chrome. La salida habitual es un puente de
impresión de pago, con licencia por equipo y por año.
PrinterApp es ese puente: un servicio en la bandeja de Windows que recibe un
JSON y saca el papel, sin diálogo, sin plugin y sin que el cajero toque nada.
Trae además un diseñador visual para construir ese JSON sin escribirlo a mano.
No es una demo. Pero tampoco es un producto con rodaje: va por la versión
0.8.1, no llega a 1.0, no tiene ni una prueba automatizada y no está bajo
control de versiones. Eso está medido y contado más abajo, antes de que pagues.
PARA QUIÉN ES
Si programas y vendes software
Tu cliente tiene un POS web y quiere que el ticket salga solo. Puedes pelearte
tres semanas con el diálogo de impresión de Chrome… o abrir esto el viernes.
Te llevas 5.395 líneas que no tienes que escribir, y con ellas las partes que
de verdad duelen: consultarle al driver de Windows cuánto puede imprimir de
verdad, medir el alto exacto del documento antes de mandarlo al spooler, cuatro
vías de entrada (protocolo print://, HTTP, WS y WSS con certificado propio) y
un diseñador que produce el mismo JSON que después envía tu sistema.
Todo el código y toda la documentación están en español.
Si tienes un comercio y tu sistema es web
Se instala, se queda junto al reloj de Windows y arranca sola cada mañana. El
ticket sale directo, con tu logotipo, en 58 o en 80 mm.
Pago único. Nadie te va a cobrar una renta anual por el permiso de imprimir en
tu propia impresora, y el día que quieras cambiarle algo el código es tuyo — o
de quien tú contrates.
PARA QUIÉN NO ES
Dicho aquí arriba para que no pierdas el tiempo:
- Si necesitas que el programa genere, firme o declare tus boletas y facturas
electrónicas. Esto las imprime; no las emite. - Si trabajas en Mac o Linux.
- Si imprimes en etiquetadoras TSPL o ZPL (Zebra, Godex, TSC).
- Si tu sistema de ventas es de escritorio y ya imprime bien. Esto resuelve el
caso concreto del navegador. - Si esperas un producto maduro. Éste va por la 0.8.1, sin pruebas y sin
historial de versiones, y en esta página se dice exactamente cuánto le falta.
LAS TRES REGLAS
PrinterApp no se diseñó por lista de funciones. Se diseñó sobre tres reglas, y
esas reglas explican cada decisión del código:
1 · La app nunca adivina el ancho del papel: se lo pregunta al driver.
Una térmica de 80 mm no imprime 80 mm. Medido con System.Drawing.Printing
en una 80mm Series Printer: el papel son 80 mm, el área imprimible 68,07 mm,
y hay 4 mm ciegos a la izquierda. Chromium ancla la página en el borde físico
del papel, así que todo lo que cae en esos 4 mm se pierde. Antes de dibujar nada,
la app consulta el área real de esa impresora concreta y coloca el contenido
dentro. Si el driver no contesta, usa un valor por defecto y lo escribe en el
log diciendo que es un valor por defecto.
2 · Ningún trabajo puede desaparecer en silencio.
La promesa de impresión siempre se resuelve, incluso cuando falta el dato que
haría falta para imprimir: si se quedara colgada, el renderizador se quedaría con
el ticket montado y dejaría de aceptar trabajos hasta reiniciar. Un código de
barras con un dato inválido no deja un hueco en blanco en el papel: imprime
[CÓDIGO INVÁLIDO: …]. Si el spooler falla, salta una notificación de Windows
que además mira si la impresora está apagada o sin papel. Y cerrar el servicio
desde la bandeja pide confirmación explicando que los trabajos que lleguen
mientras esté cerrado se pierden, porque no hay cola.
3 · Lo que ves en el diseñador es lo que sale en el papel.
El diseñador y la app comparten la misma especificación de geometría —anchos,
tipografías, márgenes de cada tipo de elemento— y dibujan los códigos de barras
con la misma librería y el mismo código. La vista previa no es una aproximación
bonita: es el mismo motor.
El peor fallo de un servicio de impresión no es que no imprima. Eso se ve. Es
el ticket que sale plausible pero recortado —"ARTICULO" impreso como
"RTICULO", la columna de importes comida por la derecha—, o el trabajo que tu
sistema da por impreso porque el servidor contestó200y el papel nunca
salió.
QUÉ HACE
Al montar el sistema (una vez)
- Ticket Studio, un diseñador visual que es una sola página HTML: arrastras
bloques, ves el ticket a tamaño real y te llevas el JSON copiado al
portapapeles. - Nueve tipos de bloque: texto, separador, tabla, totales, etiqueta/valor,
imagen, espacio, código de barras y QR. - Eliges impresora de 80 y de 58 mm por separado, y cuál es la predeterminada.
- Cargas tu logotipo. Se guarda una vez y aparece en la cabecera de los recibos.
- Un botón abre las propiedades de la impresora en Windows, que es donde de
verdad se configuran el corte y el cajón.
En cada venta (todo el día, solo)
- Cuatro maneras de mandarle trabajo: cuatro protocolos de URL
(print://,web+print://,printerapp://,fireprint://), HTTP,
WebSocket y WebSocket seguro, con certificado autofirmado que la app
genera e instala sola en el almacén de confianza de Windows. - Acepta el payload en texto plano, en base64, comprimido con gzip o con deflate:
lo detecta por los bytes mágicos, no por lo que le digan. - Imprime en silencio, sin diálogo y con la ventana oculta.
- Copias múltiples: las pide el propio trabajo, o la casilla "imprimir una copia".
- La moneda y el formato se configuran (
localeycurrency), y se respetan
las monedas sin decimales: en pesos chilenos no aparece un,00inventado.
Cuando algo va mal
- Un log que lo registra todo, abierto con un botón, con el alto y el ancho
medidos de cada trabajo. - Aviso en el log cuando el recibo es más largo que la página que declara el
driver —el ticket saldría partido en tramos— con la cuenta de en cuántos y
cómo arreglarlo. - Aviso cuando Windows recorta el tamaño de ventana pedido, que es la causa no
evidente de un ticket largo cortado. - Rastro de todo cierre, distinguiendo el cierre confirmado por el usuario del
apagado de Windows o de un proceso terminado desde fuera.
Lo que hereda del sistema anterior (retrocompatibilidad)
Siete rutas de documento, mantenidas para que un sistema de ventas ya montado
siga funcionando sin tocarlo: boleta y factura electrónica chilenas con timbre
PDF417 y recuadro de acuse de recibo (Ley 19.983), preventa con código de
barras, comanda de cocina, corte de caja, ticket de cambio y etiquetas de 30×20 y
52×20 mm. Reconoce ocho códigos de documento tributario y nueve medios de
pago.
QUÉ TE LLEVAS EN EL ZIP
| | |
|---|---|
| El servicio de impresión | 3 archivos Node/Electron · 1.092 líneas (main.cjs son 980) |
| La interfaz y los renderizadores | 13 archivos React · 2.463 líneas |
| El diseñador Ticket Studio | 1 página HTML · 1.479 líneas |
| El simulador de envíos | 287 líneas |
| La documentación | 2 manuales · 4.083 palabras, en español |
| Las pruebas automatizadas | ninguna |
| El historial de versiones | no hay |
5.395 líneas en total, con 6 dependencias de producción y 470 paquetes
resueltos en el lockfile. Trece canales IPC entre el proceso principal y la
interfaz.
Ponle tú el número de días que te tomaría escribirlas — y súmale los que se van
en descubrir que una térmica de 80 mm no imprime 80 mm, que no se ven en el
conteo.
La documentación no explica qué hace el código —eso ya lo lees tú—: la guía de
personalización tiene un apartado entero, Detalles que ahorran horas, con lo no
obvio y el número medido detrás de cada cosa.
TRES COSAS QUE NO ESPERAS ENCONTRAR
1 · Le pregunta al driver dónde puede imprimir de verdad.
Un canal IPC lanza PowerShell contra System.Drawing.Printing y lee el área
imprimible real de esa impresora, la cachea por impresora y ancho de papel, y
cae a un valor por defecto si no responde — anotando en el log que es un valor
por defecto. La conversión es 1 centésima de pulgada = 0,96 px CSS, y está
escrita en el código. No conozco otra app de impresión térmica que mire ahí.
2 · La prueba de carga te dice cuánto papel vas a gastar antes de gastarlo.
El diseñador genera un ticket de hasta 1.000 ítems, lo mide fuera de pantalla con
el mismo motor de la vista previa y, antes de enviarlo, te dice en un diálogo
cuántos KB pesa el envío y cuántos centímetros de rollo va a consumir —en
metros, si pasa del metro. Después decides si lo mandas. Los productos y precios
de esa prueba son deterministas, no aleatorios, para que dos ejecuciones se
puedan comparar.
3 · Se puede probar sin gastar una tira de papel.
Manda el trabajo con "printerName": "IMPRESORA_QUE_NO_EXISTE". El spooler falla
con Invalid deviceName provided, pero el log registra igual el alto y el ancho
medidos, que es exactamente lo que necesitas para diagnosticar un problema de
maquetación. Está documentado como procedimiento, no descubierto por accidente.
LO QUE NO HACE
Ésta es la sección que las otras fichas no tienen. Léela entera: si algo de aquí
es imprescindible para ti, no compres.
- No genera, no firma y no declara documentos tributarios. Dibuja el timbre
PDF417 a partir del XML (TED) que le manda tu sistema. No valida el CAF, no
firma nada y no habla con el SII. Si tu sistema le pasa un TED mal formado, lo
imprime igual. - El timbre no está certificado por nadie. Se dibuja a 60×25 mm en 80 mm y a
46×20 mm en 58 mm, siguiendo la Resolución 80. Pasar la certificación del SII
con tu impresora concreta te toca a ti. POST /printresponde200antes de imprimir. Es un "recibido", no un
"impreso": contesta en cuanto llega el cuerpo de la petición, antes de saber
siquiera si hay impresora. Tu sistema de ventas no puede confirmar por HTTP
que el papel salió; eso solo está en el log. Si tu flujo necesita esa
confirmación, hay que escribirla.- No hay cola. Si la app está cerrada, o cae, los trabajos que lleguen
mientras tanto se pierden. El diálogo de cierre lo dice con todas las letras,
pero conviene saberlo antes. - Cinco ajustes del panel de configuración no hacen nada.
cutPaper,
openDrawer,breakLines,printerLabelyfontLabelse guardan y no los
lee ningún renderizador. El corte y el cajón se delegan al driver de Windows
—por eso está el botón que abre sus propiedades—, pero los controles siguen en
la pantalla y engañan. Es lo primero que quitaría o cablearía. - Los márgenes manuales no aplican al ticket universal.
marginLefty
marginRightlos usan los documentos heredados; el motor del ticket dinámico
los ignora. Solo el desplazamientooffsetXafecta a todo. - El servidor HTTP no comprueba el token. El token se valida en WS y en WSS;
enPOST /printno. Además escucha en todas las interfaces conCORS *.
Cualquiera que alcance ese puerto en la red puede imprimir. Es una decisión
deliberada para que funcione sin fricción en una red local controlada, y la
guía trae el apartado con las tres líneas que hay que cambiar para cerrarlo —
pero de fábrica está abierto. - El diseñador necesita internet. Carga Tailwind, los iconos y la librería de
códigos de barras desde un CDN público, y uno de esos scripts apunta alatest
sin versión fija. Sin conexión, el diseñador se abre roto. La app que imprime
sí funciona sin internet; es el diseñador el que no. - La especificación de geometría está duplicada a mano. Los mismos anchos y
tipografías viven en el código de la app y en el del diseñador, con un
comentario que avisa de que hay que cambiarlos en los dos sitios. Nada verifica
que sigan iguales. Si tocas uno y olvidas el otro, la vista previa deja de
corresponderse con el papel. - Cero pruebas automatizadas. Ninguna. La verificación es manual: el
diseñador, el simulador de envíos y el log. - No está bajo control de versiones. No hay historial, ni etiquetas, ni lista
de defectos numerada que enseñarte. Lo que hay es el código de hoy, en la
0.8.1. - Solo Windows, y no de pasada. El área imprimible se consulta con
PowerShell, las propiedades de impresora se abren conrundll32, el
certificado se instala concertutily el empaquetado produce un instalador
NSIS. Portarlo a otro sistema no es cambiar una constante. - No lleva inventario, ni catálogo, ni base de datos. No guarda nada de lo
que imprime: solo unconfig.json, el logotipo y el log. Es un servicio de
impresión, y nada más.
REQUISITOS
- Windows 10 u 11, 64 bits.
- Una impresora térmica de 58 u 80 mm instalada en Windows con su driver.
- Node.js y npm si vas a compilar el instalador (
npm run buildproduce el NSIS). - Para tocar el código: cualquier editor. El proyecto es React 19 sobre Vite 8 y
Electron 42.
Sobre el área imprimible, porque es donde más gente se estrella. Casi todo el
mundo maqueta el ticket al ancho del papel y descubre en el papel que se pierden
las primeras letras de cada línea. No es la impresora: es que el driver reserva
un margen ciego y Chromium ancla la página en el borde físico. Esta app ya lo
resuelve, y el log te dice si el ancho lo dio el driver o es un valor por
defecto. Si sale (fallback), tu driver no está reportando su área imprimible y
tendrás que ajustar con el desplazamiento manual.
Sobre los recibos largos. Si el formulario de la impresora declara páginas de
tamaño fijo, un ticket de 100 ítems sale partido en varios trozos. La app lo
detecta y lo avisa en el log; el arreglo está en las propiedades del driver, no
en el código.
Sobre los puertos. El servicio ocupa el 5999 (HTTP y WS) y el 6000 (HTTPS y
WSS), configurables. Si ya tenías una versión anterior instalada, las dos pelean
por el mismo puerto y comparten la misma carpeta de configuración.
POR QUÉ CUESTA LO QUE CUESTA
Los puentes de impresión comerciales para navegador se licencian por desarrollador
o por equipo, con renovación anual, y el día que dejas de renovar tus clientes
dejan de imprimir. La alternativa es escribirlo tú, y descubrir por tu cuenta cada
uno de los detalles que hay en la guía.
Esto es pago único, con el código.
[PRECIO — completar antes de publicar.] La ficha de easyRest justifica sus
37 dólares contra el coste mensual de un TPV en la nube. Aquí el argumento
equivalente es el coste anual del puente de impresión que estarías licenciando,
multiplicado por los años que tu cliente va a usarlo. El número lo pones tú; lo
que esta página no va a hacer es inventarlo, ni citar el precio de un
competidor que no he verificado hoy.
NO HAY TESTIMONIOS, Y NO VOY A INVENTARLOS
PrinterApp se publica ahora. No tengo reseñas que enseñarte y no pienso fabricar
ninguna.
Y voy más lejos, porque este producto es el más joven de los tres que vendo y
sería fácil disimularlo. easyRest tiene diez versiones etiquetadas y cuarenta mil
palabras de documentación. face_go tiene 42 pruebas automatizadas. Esto no
tiene ni lo uno ni lo otro: va por la 0.8.1, sin pruebas, sin repositorio y con
cinco ajustes en pantalla que no hacen nada, listados arriba con su nombre.
Lo que sí puedo enseñarte: cinco mil líneas que resuelven un problema concreto y
molesto, dos manuales que explican el porqué de cada decisión con el número
medido detrás, y esta lista de limitaciones que ningún vendedor te daría antes de
cobrarte.
Un testimonio se escribe en un minuto. Averiguar que una térmica de 80 mm imprime
68,07, no.
CÓMO SE ENTREGA, Y QUÉ LICENCIA LLEVA
Un zip con el código fuente completo del servicio, la interfaz, el diseñador
Ticket Studio, el simulador de envíos y los dos manuales. Versión 0.8.1. El
instalador NSIS se genera con npm run build. Acceso de por vida a las
actualizaciones que se publiquen.
[ANTES DE PUBLICAR — limpiar el zip.] El proyecto arrastra archivos del
andamiaje de Vite y de una plantilla anterior cuya licencia no puedo verificar:
src/assets/react.svg,src/assets/vite.svg,src/assets/hero.pngy
public/icons.svg(este último ni siquiera se usa: contiene iconos de marcas de
terceros). No los escribiste tú y no deben viajar en la entrega. El logotipo y
el icono de bandeja sí son del producto y se quedan.
Lo que la licencia te deja hacer
- Instalarlo en todos los equipos de clientes que quieras. Sin límite de
instalaciones, sin pagar más y sin porcentaje. - Ponerle tu marca: nombre, logotipo, colores e icono, y venderlo como
producto tuyo. La guía trae el apartado de cómo. - Modificar el código todo lo que necesites.
Lo que no
- Redistribuir el código fuente: ni publicarlo, ni revenderlo, ni incluirlo en
otro producto que se venda como código. A tus clientes les entregas el programa
funcionando, no el fuente. - Ceder o revender la licencia.
El texto completo va dentro del zip como LICENCIA.md, en español llano.
Las licencias de terceros están revisadas una por una, con la versión resuelta
del lockfile y el archivo LICENSE leído. React, bwip-js, ws y selfsigned son
MIT; los iconos son ISC. Pero Electron no es "MIT y ya": su código propio sí,
y lo que redistribuyes junto a tu .exe es un runtime de Chromium con 761
componentes de terceros listados en un archivo de 19,4 MB, entre ellos
FFmpeg bajo LGPL 2.1. Ese archivo tiene que viajar con lo que entregues. Va
explicado en la licencia, apartado 9 — que es justo el detalle que después da
problemas y que nadie te dice antes de cobrarte.
Y una advertencia, porque este programa imprime documentos que parecen
fiscales. Un timbre PDF417 bien dibujado no convierte un papel en un documento
tributario válido: eso lo decide el sistema que lo emitió, no la impresora.
Cumplir con el SII o con quien corresponda es del comercio que usa el programa y
de quien se lo instala, nunca del autor. Se entrega tal como está, sin garantía, y
la responsabilidad máxima es el importe que pagaste. Pruébalo en tu equipo, con
tu impresora y con tus documentos reales antes de ponerlo en una caja a cobrar.