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:
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:
- 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
- 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/)
- 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.
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.