¿Chrome no te deja imprimir etiquetas en tu térmica? Hay fix
Imprimir etiquetas en Chrome con una impresora térmica en orientación landscape no es posible de forma nativa y confiable desde el diálogo de impresión del navegador. Chrome envía un documento rasterizado al spooler del sistema operativo, y las impresoras térmicas trabajan con tamaños de etiqueta fijos y lenguajes de comando propios (ZPL, EPL, ESC/POS) que ignoran el hint de orientación CSS. Para lograrlo sin intervención del usuario, necesitás herramientas intermedias como QZ Tray, JSPrintManager o Zebra Browser Print que envían comandos raw directamente a la impresora.
En 30 segundos
- El diálogo de impresión de Chrome no permite forzar orientación landscape de forma confiable en impresoras térmicas: la directiva CSS
@page { size: landscape }funciona como sugerencia, no como orden, y el driver térmico suele ignorarla. - La causa raíz es que las impresoras térmicas (Zebra, DYMO, Brother QL) no usan el modelo de página del SO: trabajan con tamaños de etiqueta fijos y esperan comandos raw en ZPL, EPL o ESC/POS.
- Solución rápida: forzar el diálogo del sistema con Ctrl+Shift+P, donde sí podés seleccionar orientación y tamaño de papel del driver térmico.
- Solución profesional: usar QZ Tray (open source), JSPrintManager (comercial) o Zebra Browser Print (solo Zebra) para enviar trabajos de impresión raw desde JavaScript sin pasar por el diálogo de Chrome.
- La API
chrome.printingsolo funciona en ChromeOS: no sirve para Chrome en Windows, Mac ni Linux.
Chrome es un navegador web desarrollado por Google, lanzado en 2008, basado en el motor de renderizado Blink y el proyecto de código abierto Chromium. Permite navegar sitios web, ejecutar aplicaciones web y gestionar extensiones en múltiples plataformas.
El problema: Chrome y la orientación landscape en impresoras térmicas
El escenario es más común de lo que parece. Tenés una aplicación web — un sistema de logística, un punto de venta, un WMS — que necesita imprimir etiquetas de envío de 4×6 pulgadas (10×15 cm) en orientación horizontal. Llamás a window.print() y esperás que la etiqueta salga en landscape. Pero no. La impresora térmica escupe la etiqueta en vertical, cortada o con márgenes absurdos.
El problema está en cómo Chrome maneja la impresión. Cuando ejecutás window.print(), Chrome abre su propio diálogo de impresión (el “print preview”) que ofrece opciones limitadas: copias, páginas, color/blanco y negro, y poco más. No expone control granular de orientación ni de tamaño de papel personalizado. Podés marcar “Landscape” en las opciones, pero eso configura la orientación del documento, no del trabajo de impresión que recibe la impresora.
Para impresoras láser o inkjet, esa distinción no importa demasiado: el driver del SO rota la imagen. Pero las térmicas operan con una lógica completamente distinta, y ahí es donde todo se rompe.
Qué dice la especificación CSS: @page size landscape y sus límites reales
La primera respuesta que aparece en cualquier foro es “usá CSS @page“. Según la documentación de MDN sobre @page, la regla @page { size: landscape } permite sugerir orientación al navegador dentro de una hoja de estilos para impresión. El código típico es:
@media print { @page { size: 4in 6in landscape; margin: 0; } }
En Chromium (Chrome, Edge, Brave), esto funciona como un hint: el navegador intenta rotar el layout del documento. Firefox y Safari tienen soporte parcial o nulo de esta propiedad — en Firefox, page-orientation existe como spec pero su comportamiento real varía entre versiones. El tema es que, incluso en Chrome, este hint no es un override del driver de impresión. Si el driver de la impresora térmica tiene configurado un tamaño de etiqueta de 4×6 en portrait, el hint CSS se ignora silenciosamente.
También podés inyectar el estilo dinámicamente con JavaScript antes de llamar a window.print():
const style = document.createElement('style'); style.textContent = '@media print { @page { size: landscape; } }'; document.head.appendChild(style); window.print();
Pero el resultado es el mismo. El CSS controla el layout del documento en el viewport de impresión, no la orientación física del papel en la impresora. Para una láser HP, eso basta. Para una Zebra ZD420 o una DYMO LabelWriter, no. Si te interesa, podés leer más sobre nuestra guía para integrar APIs en proyectos.
Por qué las impresoras térmicas ignoran la orientación del navegador
Una impresora láser o inkjet recibe del spooler de Windows un documento EMF o XPS que incluye metadatos de orientación. El driver interpreta esos metadatos y rota la imagen antes de rasterizarla. El flujo es: navegador → spooler → driver → impresora.
Las impresoras térmicas funcionan diferente. Modelos como la Zebra GK420, la Brother QL-800 o la DYMO LabelWriter trabajan con tamaños de etiqueta fijos definidos en el firmware o en la configuración del driver. Muchas esperan recibir comandos en lenguajes propietarios: ZPL (Zebra Programming Language) para impresoras Zebra, EPL para modelos más antiguos, o ESC/POS para impresoras de tickets y etiquetas térmicas genéricas. Cuando Chrome envía un trabajo rasterizado al spooler, la impresora térmica recibe una imagen bitmap que intenta encajar en el tamaño de etiqueta configurado. Si la imagen viene en landscape pero la etiqueta está definida como portrait (que es el default en casi todos los drivers térmicos), la impresora no rota: recorta, escala mal o directamente imprime basura.
El problema de fondo es que Chrome no tiene forma de comunicarle al driver térmico “rotar 90 grados antes de imprimir”. Eso requiere acceso a las propiedades específicas del driver (DEVMODE en Windows), y el diálogo de impresión de Chrome no las expone.
Solución parcial: usar el diálogo del sistema operativo
Antes de instalar software adicional, hay una solución rápida que funciona para uso interno o bajo volumen. En Windows, podés forzar la apertura del diálogo de impresión del sistema operativo en lugar del de Chrome con el atajo Ctrl+Shift+P. Ese diálogo sí expone todas las propiedades del driver, incluyendo orientación, tamaño de papel personalizado y configuraciones específicas de la impresora térmica.
Si necesitás que Chrome siempre abra el diálogo del sistema, podés iniciar el navegador con el flag --disable-print-preview. Esto elimina el preview propio de Chrome y delega todo al SO.
La limitación obvia: esto requiere intervención manual del usuario en cada impresión. No es automatizable, no es silencioso, y si tu aplicación web necesita imprimir 200 etiquetas de envío por turno, es inviable. Pero para un equipo interno que imprime 10-20 etiquetas por día y puede tolerar dos clicks extra, es la solución más simple y sin dependencias.
Alternativas profesionales para imprimir etiquetas Chrome impresora térmica
Cuando necesitás impresión silenciosa, sin diálogos y con control total de orientación, formato y lenguaje de comandos, tenés tres herramientas principales. Cada una cubre un caso de uso distinto.
QZ Tray: open source y multi-impresora
QZ Tray es una aplicación de escritorio open source que actúa como puente entre el navegador y la impresora. Se comunica con la página web vía WebSocket seguro (wss://), lo que permite enviar trabajos de impresión directamente desde JavaScript sin pasar por el diálogo de Chrome. Soporta impresión raw (ZPL, EPL, ESC/POS, CPCL) y también impresión rasterizada con control total de orientación y tamaño.
Es gratuito y el código está en GitHub, aunque los binarios precompilados con firma de código requieren una licencia de USD 5/mes por usuario. Es compatible con Windows, Mac y Linux, y funciona con cualquier navegador. Para una pyme de logística que usa impresoras de distintas marcas, QZ Tray suele ser la mejor opción costo-beneficio.
JSPrintManager: solución comercial cross-browser
JSPrintManager de Neodynamic es una herramienta comercial que funciona de manera similar a QZ Tray, pero con soporte técnico dedicado y una API más pulida. Ofrece impresión raw y de documentos (PDF, imágenes), detección automática de impresoras instaladas, y configuración de orientación y tamaño desde JavaScript. La licencia arranca en USD 299 por servidor para uso comercial.
Tiene una ventaja concreta sobre QZ Tray: la documentación es más completa y hay ejemplos listos para impresoras térmicas específicas (Zebra, DYMO, Brother, Honeywell). Si tu equipo de desarrollo no quiere lidiar con la configuración manual de WebSockets y certificados, JSPrintManager ahorra tiempo. Si te interesa, podés leer más sobre vulnerabilidades recientes en GitHub Actions.
Zebra Browser Print: solo para impresoras Zebra
Si tu operación usa exclusivamente impresoras Zebra, Zebra Browser Print es la opción nativa. Es un agente de escritorio gratuito que expone una API REST local. Desde JavaScript, hacés requests HTTP a localhost para descubrir impresoras, consultar su estado y enviar comandos ZPL directamente. La orientación landscape se controla con el comando ZPL ^POI (Print Orientation Inverted), que rota el contenido 180 grados, o con ^FW R para rotar campos individuales 90 grados.
La desventaja: solo funciona con impresoras Zebra. Si mañana sumás una Brother o una DYMO a la operación, necesitás otra solución para esas.
| Característica | QZ Tray | JSPrintManager | Zebra Browser Print |
|---|---|---|---|
| Precio | Open source (USD 5/mes binarios firmados) | Desde USD 299/servidor | Gratuito |
| Marcas soportadas | Todas (Zebra, DYMO, Brother, genéricas) | Todas | Solo Zebra |
| Lenguajes raw | ZPL, EPL, ESC/POS, CPCL | ZPL, EPL, ESC/POS | ZPL |
| Comunicación | WebSocket (wss://) | WebSocket | REST API (HTTP localhost) |
| SO soportados | Windows, Mac, Linux | Windows, Mac, Linux | Windows, Mac |
| Impresión silenciosa | Sí | Sí | Sí |
| Control de orientación | Sí (raw + raster) | Sí (raw + raster) | Sí (vía ZPL) |
| Requiere instalación local | Sí | Sí | Sí |

Implementación práctica: imprimir etiquetas landscape con QZ Tray
Un ejemplo concreto. Supongamos que tenés una tienda online montada en WooCommerce y necesitás imprimir etiquetas de envío de 4×6 pulgadas en landscape en una Zebra GC420t. Con QZ Tray instalado en la PC del operador, el código JavaScript sería:
qz.websocket.connect().then(() => { var config = qz.configs.create("Zebra GC420t", { size: { width: 6, height: 4 }, units: "in", orientation: "landscape" }); var data = ['^XA', '^FO50,30^A0N,40,40^FDPedido #14582^FS', '^FO50,80^A0N,30,30^FDJuan Pérez - CABA^FS', '^FO50,120^A0N,30,30^FDAv. Corrientes 1234, Piso 5^FS', '^FO50,180^BY3^BCN,100,Y,N,N^FD0001458200123^FS', '^XZ']; return qz.print(config, data); });
Ese snippet hace tres cosas: conecta al servicio QZ Tray vía WebSocket, configura la impresora con tamaño 6×4 (ancho por alto, es decir landscape), y envía un template ZPL con el nombre del destinatario, la dirección y un código de barras. El ^XA abre el formato y ^XZ lo cierra. Los comandos ^FO posicionan cada campo en coordenadas X,Y dentro de la etiqueta.
Otro caso real: una empresa de logística que opera desde Buenos Aires usa esta misma arquitectura para imprimir 800+ etiquetas por día en 4 impresoras Zebra ZD420 y 2 Brother QL-1110NWB. Con QZ Tray centralizaron la lógica de impresión en su sistema web (un panel en React hosteado en un VPS) y eliminaron la dependencia de software de escritorio específico de cada marca. Si necesitás montar algo así, un VPS en Donweb te resuelve el hosting del panel web con buena latencia para Latinoamérica.
La API chrome.printing: qué ofrece y por qué no alcanza
Si buscás en la documentación de Chrome, vas a encontrar la API chrome.printing. Suena prometedora: permite enviar trabajos de impresión a impresoras instaladas, consultar capacidades y gestionar trabajos desde una extensión. El problema es que solo funciona en ChromeOS. En Chrome para Windows, Mac o Linux, la API no está disponible.
Google nunca portó esta API al Chrome de escritorio, probablemente por razones de seguridad (dar acceso directo a impresoras desde una extensión web abre vectores de ataque). Así que si tu aplicación corre en PCs con Windows — que es el 90% de los entornos de logística y retail en Latinoamérica — esta API no te sirve. No la cuentes como opción.
Recomendaciones según tu caso de uso
Para uso interno con pocas impresiones
Si imprimís menos de 50 etiquetas por día y podés tolerar dos clicks extra, usá Ctrl+Shift+P para abrir el diálogo del sistema. Configurá el driver de la impresora térmica con el tamaño de etiqueta correcto y orientación landscape como default. Cero dependencias, cero software adicional.
Para apps web con usuarios finales
QZ Tray si querés mantener costos bajos y tu equipo técnico puede manejar la configuración. JSPrintManager si preferís soporte comercial y documentación más accesible. En ambos casos, vas a necesitar instalar un agente en cada PC que imprima.
Para operaciones solo con impresoras Zebra
Zebra Browser Print es la opción más directa. Es gratuito, tiene SDK JavaScript oficial y te da control total vía ZPL. La limitación es obvia: si sumás una impresora de otra marca, necesitás complementar con otra herramienta. Si te interesa, podés leer más sobre repositorios comprometidos con código malicioso.
Para impresión silenciosa masiva
Si necesitás imprimir cientos de etiquetas sin intervención del usuario, la única vía confiable es raw printing vía QZ Tray o JSPrintManager con templates en ZPL/EPL. No pases por el motor de renderizado del navegador: armá los comandos raw directamente y envialos a la impresora. Es más trabajo inicial pero elimina el 100% de los problemas de orientación, márgenes y escalado.
Errores comunes
Confiar en que @page { size: landscape } resuelve todo. Es el error más frecuente. El CSS @page controla el layout del documento en el viewport de impresión de Chrome, pero no la orientación física del trabajo de impresión. Con una láser funciona; con una térmica, no. Si probaste esto y “no anda”, no es un bug: es una limitación de diseño. La solución es enviar comandos raw o usar el diálogo del sistema.
No configurar el tamaño de etiqueta en el driver de Windows. Muchas impresoras térmicas vienen con el driver configurado en “Continuous” o un tamaño de etiqueta incorrecto. Si Chrome envía un trabajo para 4×6 pero el driver espera “Continuous 4 inch”, la impresión sale cortada. Antes de tocar una línea de código, entrá a Dispositivos e impresoras → Propiedades de la impresora → Preferencias de impresión y configurá el tamaño exacto de tu etiqueta.
Asumir que la API chrome.printing funciona en Windows. Aparece en la documentación oficial de Chrome y tiene buena pinta, pero es exclusiva de ChromeOS. Vi equipos de desarrollo que perdieron días intentando hacerla funcionar en Chrome de escritorio antes de darse cuenta. Leé la letra chica: dice “ChromeOS only” en el primer párrafo de la documentación.
Enviar HTML renderizado a la impresora cuando deberías enviar ZPL. Si tu impresora soporta ZPL o EPL, usá esos lenguajes directamente. Enviar una imagen rasterizada (que es lo que hace Chrome al imprimir HTML) es más pesado, más lento y te deja sin control de orientación. Un template ZPL pesa bytes, se imprime instantáneamente y vos controlás cada píxel.
Si necesitás más información, chequeá también Urgent Help – Has anyone found a reliable way to print lands.
Preguntas Frecuentes
¿Cómo imprimo etiquetas en landscape desde Chrome sin abrir el diálogo del sistema?
No se puede de forma nativa. Chrome no expone control de orientación para impresoras térmicas desde su diálogo de impresión. Necesitás una herramienta intermedia como QZ Tray o JSPrintManager que envíe el trabajo de impresión directamente a la impresora vía WebSocket, sin pasar por el print preview de Chrome.
¿Por qué mi impresora térmica imprime las etiquetas en vertical aunque puse landscape en CSS?
Porque la directiva CSS @page { size: landscape } solo afecta el layout del documento dentro de Chrome, no la orientación del trabajo de impresión que recibe la impresora. Las impresoras térmicas usan tamaños de etiqueta fijos definidos en el driver, y el hint CSS se ignora. Configurá la orientación directamente en las propiedades del driver en Windows o enviá comandos raw con la orientación explícita.
¿Qué alternativas hay a window.print() para imprimir etiquetas térmicas desde una app web?
Las tres principales son QZ Tray (open source, soporta ZPL/EPL/ESC-POS, se comunica vía WebSocket), JSPrintManager de Neodynamic (comercial, desde USD 299) y Zebra Browser Print (gratuito, solo impresoras Zebra, API REST local). Las tres permiten impresión silenciosa sin diálogo del navegador y con control total de orientación y tamaño.
¿Cómo envío comandos ZPL a una impresora Zebra desde el navegador?
Con Zebra Browser Print instalado, hacés requests HTTP a la API REST local (localhost) para descubrir impresoras y enviar comandos ZPL como texto plano. Con QZ Tray, conectás vía WebSocket y pasás un array de strings ZPL al método qz.print(). En ambos casos, el comando ZPL se envía raw a la impresora sin renderizado del navegador, lo que te da control total de la impresión.
Conclusión
La limitación es real y no tiene solución nativa dentro de Chrome en 2026. Google no muestra señales de exponer controles de impresión más granulares en el diálogo del navegador, y la API chrome.printing sigue siendo exclusiva de ChromeOS. Si tu aplicación web necesita imprimir etiquetas en landscape en impresoras térmicas, tenés que salir del flujo estándar de window.print().
Para la mayoría de los casos en producción, QZ Tray es la apuesta más sólida: open source, multi-marca, multi-SO, y con una comunidad activa. Si tu presupuesto lo permite y querés soporte comercial, JSPrintManager simplifica la implementación. Y si tu flota es 100% Zebra, Zebra Browser Print es la vía más directa. Lo que no conviene es seguir peleando con CSS @page esperando que funcione: no va a funcionar, y cada hora invertida en eso es una hora perdida.
Fuentes
- Chrome Printing API – Documentación oficial de Google Chrome para desarrolladores
- MDN Web Docs – @page page-orientation CSS reference
- QZ Tray – Herramienta open source para impresión directa desde el navegador
- JSPrintManager de Neodynamic – Solución comercial de impresión JavaScript
- Zebra Developer Portal – Printing from JavaScript






