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](https://parzibyte.me/blog/wp-content/uploads/2022/11/Caracteres-personalizados-en-impresora-termica-Reemplazar-letra-por-simbolo.jpg)
Nota: esto es la alternativa final en caso de que tu impresora no soporte los acentos o tildes.
Imprimiendo acentos y cosas de 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 al menos en modo Bluetooth) 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 conector = new ConectorPluginV3(URLPlugin);
const respuesta = await conector
.Iniciar()
.DeshabilitarElModoDeCaracteresChinos()
.EstablecerAlineacion(ConectorPluginV3.ALINEACION_CENTRO)
.DescargarImagenDeInternetEImprimir("http://assets.stickpng.com/thumbs/587e32259686194a55adab73.png", 0, 216)
.Feed(1)
.EscribirTexto("Parzibyte's blog\n")
.EscribirTexto("Blog de un programador\n")
.TextoSegunPaginaDeCodigos(2, "cp850", "Teléfono: 123456798\n")
.EscribirTexto("Fecha y hora: " + (new Intl.DateTimeFormat("es-MX").format(new Date())))
.Feed(1)
.EstablecerAlineacion(ConectorPluginV3.ALINEACION_IZQUIERDA)
.EscribirTexto("____________________\n")
.TextoSegunPaginaDeCodigos(2, "cp850", "Venta de plugin para impresoras versión 3\n")
.EstablecerAlineacion(ConectorPluginV3.ALINEACION_DERECHA)
.EscribirTexto("$25\n")
.EscribirTexto("____________________\n")
.EscribirTexto("TOTAL: $25\n")
.EscribirTexto("____________________\n")
.EstablecerAlineacion(ConectorPluginV3.ALINEACION_CENTRO)
.HabilitarCaracteresPersonalizados()
.DefinirCaracterPersonalizado("$", amongUsComoCadena)
.EscribirTexto("En lugar del simbolo de pesos debe aparecer un among us\n")
.EscribirTexto("TOTAL: $25\n")
.EstablecerEnfatizado(true)
.EstablecerTamañoFuente(1, 1)
.TextoSegunPaginaDeCodigos(2, "cp850", "¡Gracias por su compra!\n")
.Feed(1)
.ImprimirCodigoQr("https://parzibyte.me/blog", 160, ConectorPluginV3.RECUPERACION_QR_MEJOR, ConectorPluginV3.TAMAÑO_IMAGEN_NORMAL)
.Feed(1)
.ImprimirCodigoDeBarrasCode128("parzibyte.me", 80, 192, ConectorPluginV3.TAMAÑO_IMAGEN_NORMAL)
.Feed(1)
.EstablecerTamañoFuente(1, 1)
.EscribirTexto("parzibyte.me\n")
.Feed(3)
.Corte(1)
.Pulso(48, 60, 120)
.imprimirEn(nombreImpresora);
if (respuesta === true) {
alert("Impreso correctamente");
} else {
alert("Error: " + respuesta);
}
Fíjate en la línea 22 y 23. Ahí en lugar del símbolo de pesos va a aparecer mi carácter personalizado.
Ahora en la línea 25 estoy imprimiendo el símbolo $
pero en realidad cuando se imprima el ticket aparecerá lo siguiente (revisa arriba de Gracias por su compra, junto al código QR):
![Ticket impreso con Python en impresora térmica usando Plugin v3](https://parzibyte.me/blog/wp-content/uploads/2022/09/Ticket-impreso-con-Python-en-impresora-termica-usando-Plugin-v3.jpg)
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.
Probarlo en línea
He creado un pequeño y simple playground en donde tú puedes definir el carácter para que obtengas la cadena de ceros y unos y luego puedas definir y enviar ese char personalizado.
![Imprimir carácter personalizado en impresora térmica usando plugin gratuito](https://parzibyte.me/blog/wp-content/uploads/2022/11/Imprimir-caracter-personalizado-en-impresora-termica-usando-plugin-gratuito.png)
Puedes probarlo en el siguiente enlace: https://parzibyte.github.io/ejemplos-javascript-plugin-v3/caracter_personalizado.html y ver el código fuente en: https://github.com/parzibyte/ejemplos-javascript-plugin-v3/blob/main/caracter_personalizado.html
Recuerda que antes de probarlo ya debiste haber configurado tu impresora y estar ejecutando el plugin. La guía está en:
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.