Framework Angular

Conectar Angular con impresora térmica – Imprimir tickets

El día de hoy vamos a ver cómo imprimir tickets, recibos o facturas en una impresora térmica desde Angular usando el lenguaje de programación TypeScript y el lenguaje ESC POS para la impresora.

Impresora térmica con Angular y TypeScript – Ticket impreso

Básicamente vamos a ver cómo comunicar Angular con una thermal printer, pos printer o impresora POS (Epson, Xprinter, etcétera) e imprimir texto, darle formato, imprimir códigos QR, códigos de barras, imágenes, acentos y varias cosas que permitirán crear tickets desde Angular.

Vamos a usar un plugin gratuito y un conector en TypeScript que acabo de crear. Por cierto, el plugin también nos permitirá cortar el papel, abrir el cajón de dinero, definir caracteres personalizados e imprimir en red.

Nota: esto funciona en Windows, Linux, Raspberry Pi y con otro plugin podría incluso funcionar en Android con impresoras Bluetooth.

Imprimir ticket en impresora térmica desde Angular

Interfaz web con Angular para imprimir recibo en POS printer

Necesitamos crear una lista de operaciones que serán realizadas en la impresora térmica. Podemos usar un simple arreglo de TypeScript (que al final es un array de JS):

    // Lista de operaciones disponibles: https://parzibyte.me/http-esc-pos-desktop-docs/es/
    const operaciones = [
      {
        nombre: "Iniciar",
        argumentos: [],
      },
      {
        nombre: "EstablecerAlineacion",
        argumentos: [1],
      },

      {
        nombre: "EscribirTexto",
        argumentos: ["Hola Angular desde parzibyte.me"],
      },
      {
        nombre: "Feed",
        argumentos: [1],
      },
      {
        nombre: "EscribirTexto",
        argumentos: [this.mensaje],
      },
      {
        nombre: "Feed",
        argumentos: [1],
      },
      {
        nombre: "DescargarImagenDeInternetEImprimir",
        argumentos: ["https://github.com/parzibyte.png", 380, 0, true],
      },
    ];

El ticket será impreso en la impresora térmica haciendo cada operación indicada en el arreglo. No es obligatorio que definas todas las operaciones en el arreglo, ya que también puedes usar operaciones.push para agregar una operación.

Eres libre de ver la documentación para ver todas las operaciones disponibles. Después de definir la lista de operaciones debemos definir la carga útil donde indicamos el nombre de la impresora, y enviamos esa carga útil al servidor local usando fetch.

La función completa para imprimir en una impresora térmica desde Angular queda así:

async probarImpresion() {
  if (!this.impresoraSeleccionada) {
    return alert("Seleccione una impresora");
  }

  if (!this.mensaje) {
    return alert("Escribe un mensaje");
  }
  // Lista de operaciones disponibles: https://parzibyte.me/http-esc-pos-desktop-docs/es/
  const operaciones = [
    {
      nombre: "Iniciar",
      argumentos: [],
    },
    {
      nombre: "EstablecerAlineacion",
      argumentos: [1],
    },

    {
      nombre: "EscribirTexto",
      argumentos: ["Hola Angular desde parzibyte.me"],
    },
    {
      nombre: "Feed",
      argumentos: [1],
    },
    {
      nombre: "EscribirTexto",
      argumentos: [this.mensaje],
    },
    {
      nombre: "Feed",
      argumentos: [1],
    },
    {
      nombre: "DescargarImagenDeInternetEImprimir",
      argumentos: ["https://github.com/parzibyte.png", 380, 0, true],
    },
  ];

  // https://parzibyte.me/http-esc-pos-desktop-docs/es/api/imprimir.html
  const cargaUtil = {
    nombreImpresora: this.impresoraSeleccionada,
    serial: "",
    operaciones: operaciones,
  };


  const respuestaHttp = await fetch("http://localhost:8000/imprimir", {
    method: "POST",
    body: JSON.stringify(cargaUtil),
  })

  const respuesta = await respuestaHttp.json();
  if (respuesta.ok) {
    console.log("Impreso correctamente");
  } else {
    console.error("Petición realizada pero error en el plugin: " + respuesta.message);
  }
}

Cuando ese código se ejecute, se imprimirá un recibo parecido al de la imagen del post. Toma en cuenta que estoy pasando el this.mensaje en la lista de operaciones, así como el this.impresoraSeleccionada en la carga útil. Esos valores podrían venir de cualquier otro lugar.

Lista de impresoras

Para proporcionar al usuario una lista de impresoras disponibles se hace una petición al plugin:

async ngOnInit() {
  // https://parzibyte.me/http-esc-pos-desktop-docs/es/api/obtener-impresoras.html
  const respuestaHttp = await fetch("http://localhost:8000/impresoras");
  const impresoras = await respuestaHttp.json();
  this.impresoras = impresoras;
}

Vídeo de ayuda

He grabado un vídeo para explicar el funcionamiento del plugin para imprimir en impresora térmica con Angular. Es un complemento de este post:

Configurar impresora y descargar servidor HTTP a ESC POS

Para que el código funcione necesitas el servidor local de la API ESC POS ejecutándose y que tu impresora esté compartida. Por favor, sigue los pasos que aparecen en la página previamente enlazada, ya que ahí está la API unificada.

La documentación completa está en: https://parzibyte.me/http-esc-pos-desktop-docs/es/

En resumen

  1. Configura tu impresora y compártela
  2. Descarga el plugin y asegúrate de que se está ejecutando en segundo plano
  3. Crea la lista de operaciones y envíala al plugin que convertirá el JSON a ESC POS

Próximos pasos

Ahora que has conectado una impresora térmica con tus apps de Angular puedes hacer más como imprimir códigos de barras, imágenes, códigos QR, imprimir texto con tildes y varias cosas con una impresora térmica sin importar el sistema operativo.

Recomiendo visitar el área de pruebas en donde se usa JavaScript, mismo que es compatible con TypeScript.

También recuerda que puedes crear tu propio conector en cualquier otro lenguaje de programación revisando la documentación de la API, y que, aunque todavía no escribo el post para Angular, existe un plugin para impresoras térmicas en Android con Bluetooth.

El código completo del ejemplo te lo dejo en GitHub. Eres libre de explorarlo: https://github.com/parzibyte/thermal-printer-angular/

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.