Hoy te mostraré cómo imprimir recibos, tickets, facturas, etcétera en una impresora térmica (también conocidas como Thermal printers, Impresoras POS) usando el lenguaje de programación Python.
De este modo podrás imprimir en impresoras térmicas desde Python usando una clase y un conector desarrollados por mí. Verás que será realmente sencillo. Gracias a esto podrás imprimir y hacer operaciones como:
- Texto normal y texto con acentos (incluyendo las letras ñ de nuestro amado español)
- Imágenes a partir de una URL o imágenes locales presentes en la computadora del usuario. Así que puedes imprimir tu logotipo
- Códigos QR
- Códigos de barras
- Abrir el cajón de dinero
- Ajustar el tamaño de la fuente, alineación, saltos de línea
- Impresión de HTML y páginas web
Básicamente podrás imprimir todo tipo de contenido en una impresora térmica desde Python.
Creando lista de operaciones ESC POS
Lo primero que debes hacer es definir la lista de operaciones que se van a hacer en la impresora térmica. Estas operaciones serán convertidas a comandos ESC POS. La lista de operaciones es un simple arreglo de Python:
operaciones = [
{
"nombre": "Iniciar",
"argumentos": [],
},
{
"nombre": "EscribirTexto",
"argumentos": ["Hola\nImpresora desde Python\n"],
},
{
"nombre": "DescargarImagenDeInternetEImprimir",
"argumentos": ["https://github.com/parzibyte.png", 380, 0, True],
},
]
Cada elemento de la lista es un diccionario que tiene la propiedad nombre de tipo cadena, indicando el nombre de la operación, así como una propiedad llamada argumentos que es un arreglo de cualquier tipo que contiene los argumentos de dicha operación.
Por ejemplo, la función para imprimir texto se llama EscribirTexto
y solo toma un argumento de tipo string que es el texto que será impreso en la impresora térmica:
{ "nombre": "EscribirTexto", "argumentos": ["Hola\nImpresora desde Python\n"], }
Vas a encontrar la lista de operaciones disponibles en la documentación oficial, así como su nombre, descripción, argumentos y ejemplos. Te recuerdo que, al ser una simple lista de Python, puedes crearla como tú prefieras y agregarle elementos usando append o definiendo la lista desde un inicio.
Cuando hayas creado la lista de operaciones puedes enviarla a la API HTTP local que convierte JSON a ESC POS. Primero arma la carga útil que contiene la lista de operaciones y el nombre de la impresora:
nombre_impresora = "Termica"
serial = ""
carga_util = {
"operaciones": operaciones,
"nombreImpresora": nombre_impresora,
"serial": serial,
}
Finalmente hay que enviar ese diccionario codificado como JSON a la API en el endpoint /imprimir. Para hacer la petición HTTP podemos usar el paquete requests (pip install requests
):
respuesta_http = requests.post("http://localhost:8000/imprimir", json=carga_util)
respuesta = respuesta_http.json()
if respuesta["ok"]:
print("Impresión exitosa")
else:
print("Error: " + respuesta["message"])
La API va a devolver un diccionario con la propiedad ok
y message
. Si la impresión ESC POS fue correcta, ok
estará en True
. En caso contrario, el mensaje de error estará en message
.
El código completo queda como se ve a continuación:
import requests
"""
Esta lista de operaciones puede ser infinita.
Puedes definirla así, o invocar a append cuantas
veces sea necesario
Lista de operaciones disponibles: https://parzibyte.me/http-esc-pos-desktop-docs/es/
"""
operaciones = [
{
"nombre": "Iniciar",
"argumentos": [],
},
{
"nombre": "EscribirTexto",
"argumentos": ["Hola\nImpresora desde Python\n"],
},
{
"nombre": "DescargarImagenDeInternetEImprimir",
"argumentos": ["https://github.com/parzibyte.png", 380, 0, True],
},
]
nombre_impresora = "Termica"
serial = ""
carga_util = {
"operaciones": operaciones,
"nombreImpresora": nombre_impresora,
"serial": serial,
}
respuesta_http = requests.post("http://localhost:8000/imprimir", json=carga_util)
respuesta = respuesta_http.json()
if respuesta["ok"]:
print("Impresión exitosa")
else:
print("Error: " + respuesta["message"])
Te lo repito: la lista de operaciones puede ser infinita y creada como tú prefieras; ya sea usando un ciclo, leyendo un archivo de texto, solicitando datos al usuario, etcétera.
Leyendo la API puedes imprimir un ticket parecido al siguiente con Python convirtiendo la lista a bytes ESC POS para POS printers:
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/
Poniendo todo junto
Con el ejemplo tienes todo lo necesario, puedes armar la lista de operaciones con todo lo que necesites. Incluso puede llevar una única operación por si quisieras abrir el cajón de dinero sin imprimir.
Por aquí te dejo más artículos sobre Python.
Con este programa puedo saber el estatus de la impresora si tiene hoja o no tiene papel?, lo digo porque el sistema que tengo implementado no puedo saber si en la impresora térmica ya no hay papel, o en tu programa tienes algún manejador de eventos?
Hola estoy intentando y al ejecutar el código no reconoce import ConectorPython, el error dice que no encuentra ese modulo. Seguí todos los pasos que indica tu post y tu código, que me estaría faltando?
Si no funciona de esa manera, pruebe copiando y pegando todo el código del conector en su archivo. También puede ser que el archivo ConectorPython.py no se encuentre en el mismo directorio que el archivo desde donde se ejecuta el código
Hola, cuales son los parametros que deben ir para poder utilizar el codigo de barras CODE39, me podrias dar un ejemplo?. Y queria consultar si es posible agregar una tabla al estilo excel con texto dentro. Saludos y gracias por el plugin.
Hola. Documentación de todos los métodos: https://gist.github.com/parzibyte/2f36655ef9d6ea8e6de73c6e09bbc735#file-documentacion-txt
Tabla, podría ajustar el siguiente algoritmo: https://parzibyte.me/blog/2023/02/28/javascript-tabular-datos-limite-longitud-separador-relleno/
Recuerde que siempre estoy a su disposición en https://parzibyte.me/#contacto
Buen día! Tengo el siguiente error y no sé como puedo solucionarlo…
Error: Error en el servidor: open \\TERMINAL312\GenericTextOnly: No se encuentra el nombre de red especificado.
Podría ayudarme por favor
La impresora debe estar compartida. Revise de nuevo el tutorial para instalarla y compartirla
Que tal, mi nombre es Alberto López, voy empezando a utilizar python y encontré tu video y código, y también me envía el siguiente mensaje:
Error. El mensaje es: Error en el servidor: error del servidor. El servidor dijo: Ya no se permiten las peticiones sin clave API. Contrata un plan en https://parzibyte.me/plugin-impresora-termica/planes/ o utiliza la versión 1, ya sea gratis o completa: https://parzibyte.me/plugin-impresora-termica-v1/
Según yo uso la versión 1, quise preguntar en la opción de contacto, e indica que todo tiene costo en dólares?, cuando publicas puede ser gratuito
Hola. Le recomiendo que lea con más atención. El post que está comentando actualmente usa el plugin versión 2.
La versión 1 está en: https://parzibyte.me/plugin-impresora-termica-v1 y claro que puede ser usada gratuitamente (solo que no funciona para Python), pero le repito, por favor lea con más atención antes de comentar
También, gracias a su comentario, he puesto un aviso en el post. Puede leerlo para ver sobre la versión 3 y final.
Gracias y saludos!
Hola, realicé la configuración siguiendo los pasos de la versión 1 para la impresión con Python y en principio todo iba bien, pero desde ayer me salta este error y no consigo imprimir nada:
“error de servidor. El mensaje es: error del servidor. El servidor dijo: Ya no se permiten las peticiones sin clave API. Contrata un plan en https://parzibyte.me/plugin-impresora-termica/planes/ o utiliza la versión 1, ya sea gratis o completa: https://parzibyte.me/plugin-impresora-termica-v1/”
Realicé la configuración con la versión gratuita y no he modificado nada. ¿Cómo puedo arreglarlo?
Saludos!
La versión 2 ya no es soportada porque ya existe la 3: https://parzibyte.me/blog/2022/09/30/plugin-impresoras-termicas-version-3/
Hola, estoy tratando de imprimir un tiket desde una base de datos pero cuando mando la ejecucion y todo solo me imprime un mensaje que dice “none” sabes a que se deba?
Hola. Gracias por sus comentarios. Si tiene alguna consulta, solicitud de creación de un programa o solicitud de cambio de software estoy para servirle en https://parzibyte.me/#contacto
Saludos!
Hola, me gustaría saber como quitar el pie de pagina que sale en el tiket, al colocar el link que aparece para quitarlo me manda a una pagina caída 🙁
Hola. Aquí los detalles: https://parzibyte.me/blog/2021/02/09/planes-plugin-impresora-termica-v2/
Hola.
Al imprimir sale un texto en la cabecera: “plugin para impresoras térmicas………..”, como quitar este texto?
Cuando se reinicia el computador se debe ejecutar nuevamente el ejecutable conector_64_bits (1).exe para que funcione la impresión. como solucionar esto?
Para quitar el texto: https://parzibyte.me/blog/2021/02/09/planes-plugin-impresora-termica-v2/
Para iniciarlo: https://parzibyte.me/blog/2019/10/14/ejecutar-programa-inicio-windows/
Bro, excelente aporte, quisiera saber como lo hiciste el plugin lo conectas mediante sockets? esta escrito en otro lenguaje? la verdead me interesa mucho como lo hiciste si pudieras compartir conmigo simplemente por donde empesaste o como lees las impresoras seria increible bro
Simplemente Excelente. Saludos.