Plugin ESC POS v3

Imprimir caracteres personalizados en impresora térmica

En este post te voy a mostrar cómo imprimir caracteres especiales en un ticket impreso con una impresora térmica.

Con lo mostrado aquí vas a poder imprimir letras ñ, acentos de español, símbolo de euro y muchos otros signos que no son posibles de imprimir normalmente.

Lo que ves en la siguiente foto no son imágenes; son caracteres definidos por mí que se pueden imprimir como si fueran texto y que van a reemplazar a una letra:

Caracteres personalizados en impresora térmica – Reemplazar letra por símbolo

Nota: esto es la alternativa final en caso de que tu impresora no soporte los acentos o tildes.

Imprimiendo acentos y texto español

Las impresoras térmicas varían mucho en cuanto a los acentos y páginas de caracteres.

Algunas soportan la impresión de acentos sin configuraciones extras, otras necesitan deshabilitar el modo chino y convertir los caracteres y finalmente existen las que no soportan nada de eso.

Como sea, siempre recomiendo hacer lo siguiente en orden:

  1. Probar si puedes imprimir el carácter deseado normalmente (en la PT-210 funciona en modo Bluetooth desde Android y modo USB) invocando a EscribirTexto
  2. Deshabilitar el modo de caracteres chinos e imprimir convirtiendo el texto según una página de códigos. Recomiendo probar con todas las páginas de caracteres hasta agotarlas, y combinar todo. Esto que menciono está implementado en la función TextoSegunPaginaDeCodigos de este plugin: https://parzibyte.me/blog/2022/09/30/plugin-impresoras-termicas-version-3/)
  3. Definir un carácter personalizado como lo veremos a continuación.

Si nada funciona, recuerda que puedes enviarme un mensaje en https://parzibyte.me/#contacto para solicitar ayuda.

Definir carácter personalizado

Vamos a ver cómo definir una letra que tu impresora térmica no soporte, por ejemplo, el euro, el símbolo del centavo, el símbolo de tu moneda, la letra ñ, acentos o cualquier cosa que quepa en una cuadrícula de 12×24 en modo “pixel art”.

Nota: en este caso usaré un ejemplo con JavaScript pero podrás hacerlo con cualquier lenguaje de programación

Primero definimos el carácter como una cadena separada por saltos de línea. Por ejemplo:

const amongUsComoCadena = `000001111000
000010000100
000100011110
000100100001
011100100001
010100100001
010100100001
010100011110
010100000010
011100000010
000100111010
000100101010
000111101110
000000000000
000000000000
000000000000
111010101110
100010101000
111010101110
001010100010
111011101110
000000000000
000000000000
000000000000`;

Fíjate que la cadena no tiene tabulaciones ni espacios extra.

Lo que sigue es invocar a HabilitarCaracteresPersonalizados y luego a DefinirCaracterPersonalizado indicando el carácter que vamos a reemplazar y la matriz que lo remplaza.

Cuando hayamos hecho eso, el carácter de reemplazo aparecerá en lugar del carácter reemplazado al invocar a EscribirTexto. Veamos un ejemplo:

const cargaUtil = {
  "serial": "",
  "nombreImpresora": "Termica",
  "operaciones": [
    {
      "nombre": "Iniciar",
      "argumentos": []
    },
    {
      "nombre": "HabilitarCaracteresPersonalizados",
      "argumentos": []
    },
    {
      "nombre": "DefinirCaracterPersonalizado",
      "argumentos": [
        "_",
        "000001111000\n000010000100\n000100011110\n000100100001\n011100100001\n010100100001\n010100100001\n010100011110\n010100000010\n011100000010\n000100111010\n000100101010\n000111101110\n000000000000\n000000000000\n000000000000\n111010101110\n100010101000\n111010101110\n001010100010\n111011101110\n000000000000\n000000000000\n000000000000"
      ]
    },
    {
      "nombre": "EscribirTexto",
      "argumentos": [
        "En lugar del guion bajo _, va a aparecer el caracter definido previamente:\n_"
      ]
    },
    {
      "nombre": "Feed",
      "argumentos": [
        2
      ]
    }
  ]
};
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 ok pero error en el plugin: " + respuesta.message);
}

En este caso estoy reemplazando el guión bajo con el carácter personalizado. Eso fue un ejemplo básico, pero aquí hay otro donde en lugar del símbolo de peso $ aparece el carácter personalizado en un ticket.

El carácter será reemplazado en todas las instancias del ticket.

Ticket impreso con Python en impresora térmica usando Plugin v3

Nota: la salida que ves está hecha con Python, pero así aprovecho para demostrar que se puede imprimir el carácter personalizado y que no importa desde cuál lenguaje de programación lo hagas.

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/

Probarlo en línea

En la documentación oficial de la API del plugin HTTP local a ESC POS puedes probar el ejemplo para definir e imprimir caracteres personalizados en el área de pruebas.

Por cierto, por si te sirve, el símbolo del euro lo he definido así:

000011111100
000111111110
001111111110
001111000110
001110000010
001100000000
001000000000
001000000000
111111111000
111111111000
001000000000
001000000000
001000000000
111111111000
111111111000
001000000000
001000000000
001000000000
001100000000
001110000010
001111000110
001111111110
000111111110
000011111100

Aquí tienes un vídeo:

Sobre la compatibilidad

Recuerda que todas las impresoras tienen diferentes capacidades y algunas soportan cosas que otras no. Por ejemplo, mi Xprinter 58 permite definir e imprimir caracteres personalizados pero la PT-210 no.

Por otro lado la PT-210 permite imprimir acentos y todo tipo de caracteres sin convertirlos, pero no permite definir e imprimir caracteres personalizados.

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/

Entradas recientes

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…

3 días 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…

3 días 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…

3 días hace

Errores de Comlink y algunas soluciones

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

3 días 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…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

4 días hace

Esta web usa cookies.