Automatización con Python en Text2 Barcode
Ejecuta lógica personalizada justo antes y después de cada impresión: ajusta impresoras, valida contenido, notifica por correo o convierte imágenes a ZPL, todo con un script de Python integrado en el servicio de impresión.
Introducción
Cada servicio de impresión de Text2 Barcode puede ejecutar un script de Python propio mediante una clase
PrintHandler con dos métodos: beforePrint() (antes de imprimir) y
afterPrint() (después de imprimir).
Por dentro, Text2 Barcode inicia un proceso de Python y establece automáticamente el puente
Py4J entre Java y tu script —
no necesitas escribir código de conexión: solo defines la clase PrintHandler y el programa se encarga del resto.
Requisitos
- Instala Python desde la web oficial: https://www.python.org/downloads/
- Instala Py4J (comunicación entre Python y Text2 Barcode):
pip install py4j
Text2 Barcode detecta automáticamente la ruta de tu ejecutable de Python (where python en Windows,
which python3 / which python en Mac y Linux). Si necesitas usar una instalación específica,
puedes indicar la ruta manualmente en la pestaña Environment del editor de Python, o definir la variable de entorno
PYTHON_EXECUTABLE_PATH con la ruta completa al ejecutable.
Activar el script en un servicio
El script de Python se configura por servicio, no de forma global:
- Abre o edita un Servicio en Text2 Barcode (Servicios > Agregar servicio o edita uno existente).
- Ve a la sección "Integra scripts de Python" y activa la casilla "Activar script".
- Da clic en "Abrir editor" para escribir tu código en la pestaña Script.
- Usa la pestaña Output para ver la salida de tu script mientras lo pruebas con ▶ Iniciar.
Estructura básica
Tu script debe definir una clase llamada exactamente PrintHandler, con los métodos
beforePrint(event, service) y afterPrint(event, service):
class PrintHandler:
"""
La clase PrintHandler gestiona eventos relacionados con el proceso de impresión.
Incluye métodos que se ejecutan antes y después de la impresión.
"""
def beforePrint(self, event, service):
"""
Esta función se ejecuta antes de que comience el proceso de impresión.
:param event: PrintEvent
:param service: PrintService
"""
pass # Aquí se agrega la lógica para el manejo previo a la impresión
def afterPrint(self, event, service):
"""
Esta función se ejecuta después de que se ha completado el proceso de impresión.
:param event: PrintEvent
:param service: PrintService
"""
pass # Aquí se agrega la lógica para el manejo después de la impresión
Este es el mismo código de ejemplo que ves al abrir el editor por primera vez para un servicio nuevo.
Clase PrintEvent
event expone la información del trabajo de impresión: contenido, impresoras y parámetros del servicio que lo generó.
content() str
Si necesitas verlo como texto, decodifica el Base64 primero (por ejemplo con base64.b64decode(...)).
printers() list[dict]
Cada impresora es un dict con al menos uid, name y connection. Los campos adicionales dependen del valor de connection:
| connection | Campos adicionales |
|---|---|
| driver |
manufacturer, driverConnection (descripción del backend de impresión del sistema operativo),
resolution (DPI, solo si el driver lo reporta), isDefault (bool),
queuedJobs (int), statusText (str), printProcessor
(str: "PRINT_RAW", "PRINT_DIRECT" o "PRINT_ALT_CUPS")
|
| network | port (int) |
| usb |
deviceAddress, busNumber, portNumber, serialNumber,
manufacturerName, productId, productName, vendorId
|
| file | charset (str) |
| unknown | sin campos adicionales |
printProcessor viaja incluido en cada impresora driver — puedes reenviar el mismo
dict de event.printers() directo a service.send() / service.sendBase64()
sin agregarle nada.
parameters() dict
parameters['type_service'].| Campo | Cuándo aparece | Descripción |
|---|---|---|
| type_service | siempre | "file-scan" o "lan-share", según el tipo de servicio que disparó la impresión. |
| directory_scanned | file-scan | Carpeta que el servicio está vigilando. |
| file_detected | file-scan | Ruta del archivo (o zip) detectado en la carpeta. |
| current_file | file-scan | Ruta del archivo que se va a imprimir (puede venir de dentro de un zip). |
| current_file_index | file-scan | Índice del archivo actual dentro del lote. |
| total_file_count | file-scan | Total de archivos detectados en este lote. |
| lan_host | lan-share | Host/IP del dispositivo que envió la petición de impresión. |
| lan_port | lan-share | Puerto del dispositivo que envió la petición. |
cancel() / isCancelled()
beforePrint, ese archivo no se imprime; si se llama dentro de afterPrint, se detiene el procesamiento posterior (por ejemplo, la acción configurada después de imprimir).cancel()).Clase PrintService
service permite ejecutar acciones durante el flujo de impresión: enviar datos, pausar el proceso o convertir imágenes a ZPL.
send(content, charset, printers)
content (texto) a las impresoras indicadas, usando el charset especificado (por ejemplo "UTF-8").class PrintHandler:
def beforePrint(self, event, service):
# Ajusta velocidad y densidad antes de imprimir
service.send("^XA^PR3^MD15^XZ", "UTF-8", event.printers())
sendBase64(contentBase64, printers)
event.content(), sin decodificarlo.pause(message)
message. Si el usuario elige "No", el trabajo se cancela.convert_img_zpl(props) str
^XA...^XZ con la imagen comprimida como gráfico).| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
| uri | str | Sí | Ruta o URI de la imagen, por ejemplo "file://C:/imagenes/logo.png". |
| w | int | No | Ancho en milímetros. Por defecto 102. |
| h | int | No | Alto en milímetros. Por defecto 0 (se calcula automáticamente según la proporción de la imagen). |
| dpi | int | No | Resolución de la impresora en DPI. Por defecto 200. |
| angle | float | No | Ángulo de rotación en grados. Por defecto 0. |
| imageFilterType | int | No | Filtro aplicado a la imagen: 0 escala de grises, 1 difuminado/dithered (por defecto), 2 binario (blanco y negro puro). |
class PrintHandler:
def beforePrint(self, event, service):
zpl = service.convert_img_zpl({
"uri": "file://C:/imagenes/logo.png",
"w": 60,
"h": 60,
"dpi": 200,
})
service.send(zpl, "UTF-8", event.printers())
Ejemplos completos
Enviar un correo después de imprimir
import smtplib
from email.mime.text import MIMEText
class PrintHandler:
def afterPrint(self, event, service):
# Construir detalles de las impresoras donde se imprimió
printer_details = ""
for printer in event.printers():
printer_details += f"Impresora: {printer['name']}\n"
printer_details += f"UID: {printer['uid']}\n"
printer_details += f"Conexión: {printer['connection']}\n\n"
# Obtener el contenido impreso (Base64)
content_b64 = event.content()
msg_details = (
"Se ha completado una impresión.\n\n"
f"Contenido (Base64):\n{content_b64}\n\n"
f"Impresoras utilizadas:\n{printer_details}"
)
msg = MIMEText(msg_details)
msg['Subject'] = 'Etiqueta impresa'
msg['From'] = 'tuemail@example.com'
msg['To'] = 'destinatario@example.com'
with smtplib.SMTP('smtp.example.com', 587) as server:
server.starttls()
server.login('tuemail@example.com', 'tupassword')
server.sendmail(msg['From'], [msg['To']], msg.as_string())
print("Correo enviado con éxito")
Solución de problemas
-
"The value for 'printProcessor' must not be null": la impresora que le pasaste a
service.send()/service.sendBase64()es undictdriverconstruido a mano (no salió deevent.printers()) y le falta la claveprintProcessor. Agrégala con uno de estos valores:"PRINT_RAW","PRINT_DIRECT"o"PRINT_ALT_CUPS". - El script no imprime nada / se queda esperando: revisa la pestaña Output del editor — cualquier excepción de Python se muestra ahí en rojo.
-
No encuentra el ejecutable de Python: define la ruta manualmente en la pestaña
Environment del editor, o crea la variable de entorno
PYTHON_EXECUTABLE_PATH.
¿Tienes dudas o algo no funciona como esperas? Contáctanos y con gusto te ayudamos.