El día de hoy veremos cómo imprimir un PDF de manera automática y directa usando Python, ya sea desde la línea de comandos o con una aplicación como Flask, Django o similares.
De este modo vamos a ser capaces de enviar un PDF a una impresora con Python, todo esto de manera silenciosa y sin pedir confirmación del usuario.
Módulo requests
Como vamos a hacer una petición HTTP a un servidor local para imprimir el PDF, necesitamos algo para hacerlo. Puedes usar cualquier librería pero en mi caso voy a usar requests que instalé con pip install requests
.
Imprimir PDF local con Python
Para imprimir un PDF que existe en la computadora del usuario usando Python podemos usar el siguiente código:
def imprimir_pdf_local():
rutaPdf = "C:\\Users\\parzibyte\\Desktop\\delgado.pdf"
parametros = {
"nombrePdf": rutaPdf,
"impresora": impresora,
"grados": grados,
"serial": serial,
}
respuesta = requests.get(ruta_servidor, parametros)
codigo_respuesta = respuesta.status_code
contenido_respuesta = respuesta.json()
print(
f"Código de respuesta {codigo_respuesta}. Contenido: {contenido_respuesta}")
Si te fijas solo hay que definir la ubicación o ruta absoluta del PDF (escapando la barra invertida en Windows) y después simplemente pasamos ese parámetro como nombrePdf
.
También podemos indicar la impresora en la cual se va a imprimir (he probado con térmicas, virtuales y de tinta) así como un parámetro opcional que es el serial y los grados para rotar el PDF antes de que sea impreso.
Al final se hará una petición muy parecida a la siguiente URL:
http://localhost:8080/?nombrePdf=C%3A%5CUsers%5Cparzibyte%5CDesktop%5Cdelgado.pdf&impresora=Microsoft+Print+to+PDF&grados=0&serial=
Como nosotros estamos usando el módulo requests de Python podemos pasar los parámetros para imprimir el PDF de una manera más elegante y limpia.
Python: imprimir PDF remoto
Se puede imprimir un PDF de internet o accesible a través de internet usando este mismo plugin y el código Python; solo hay que modificar los parámetros y la URL a la que se hace la petición.
El código para imprimir un PDF a partir de su URL (que puede ser incluso localhost) queda así:
def imprimir_pdf_remoto():
urlPdf = "https://parzibyte.github.io/plugin-silent-pdf-print-examples/delgado.pdf"
parametros = {
"urlPdf": urlPdf,
"impresora": impresora,
"grados": grados,
"serial": serial,
}
respuesta = requests.get(ruta_servidor+"/url", parametros)
codigo_respuesta = respuesta.status_code
contenido_respuesta = respuesta.json()
print(
f"Código de respuesta {codigo_respuesta}. Contenido: {contenido_respuesta}")
Lo único que cambia es que ahora hacemos la petición a /url
y pasamos urlPdf
en lugar del nombre del PDF.
Por cierto, el PDF que vamos a imprimir es el siguiente (recuerda que es compatible con cualquier PDF siempre y cuando el mismo sea válido): https://parzibyte.github.io/plugin-silent-pdf-print-examples/delgado.pdf
Y la URL de petición queda algo así:
http://localhost:8080/url?urlPdf=https%3A%2F%2Fparzibyte.github.io%2Fplugin-silent-pdf-print-examples%2Fdelgado.pdf&impresora=Microsoft+Print+to+PDF&grados=0&serial=
Descargando plugin y PDFtoPrinter
Para que esto funcione debemos descargarnos 2 herramientas gratuitas: el plugin PDF y PDFtoPrinter (una vez que abras ese enlace haz clic en download it here). Las mismas deben estar en la misma ubicación y solo debes ejecutar el plugin.
Es decir, debes tener a PDFtoPrinter.exe
y plugin_pdf_prod_ARQUITECTURA.exe
en la misma carpeta, y después de eso ejecutar plugin_pdf_prod_ARQUITECTURA.exe
.
Comprueba que se está ejecutando en el administrador de tareas dentro de “Detalles”
Poniendo todo junto
El código completo que imprime un PDF local y uno remoto con Python queda así:
import requests
serial = ""
grados = "0" # Múltiplo de 90 pero como cadena
impresora = "Microsoft Print to PDF"
ruta_servidor = "http://localhost:8080"
def imprimir_pdf_remoto():
urlPdf = "https://parzibyte.github.io/plugin-silent-pdf-print-examples/delgado.pdf"
parametros = {
"urlPdf": urlPdf,
"impresora": impresora,
"grados": grados,
"serial": serial,
}
respuesta = requests.get(ruta_servidor+"/url", parametros)
codigo_respuesta = respuesta.status_code
contenido_respuesta = respuesta.json()
print(
f"Código de respuesta {codigo_respuesta}. Contenido: {contenido_respuesta}")
def imprimir_pdf_local():
rutaPdf = "C:\\Users\\parzibyte\\Desktop\\delgado.pdf"
parametros = {
"nombrePdf": rutaPdf,
"impresora": impresora,
"grados": grados,
"serial": serial,
}
respuesta = requests.get(ruta_servidor, parametros)
codigo_respuesta = respuesta.status_code
contenido_respuesta = respuesta.json()
print(
f"Código de respuesta {codigo_respuesta}. Contenido: {contenido_respuesta}")
imprimir_pdf_local()
imprimir_pdf_remoto()
Siguientes pasos
Te mostré el código más importante, pero si quieres verlo completo junto con el import y la definición de las variables puedes revisar el repositorio de GitHub.
El plugin que te acabo de mostrar va a permitirte imprimir un PDF desde Python en cualquier lugar. Puedes imprimir un PDF con Flask, Django, Tkinter, etcétera (aunque si usas el navegador para tu app y no es en local, puede que quieras revisar el ejemplo con JS)
Por cierto, te invito a revisar la presentación y documentación del plugin, así como el post de cómo enviar comandos ESC POS con Python.
Hola buen día, tengo una consulta, es posible enviar a una impresora en red?
Hola. Por el momento esa característica no está implementada en el plugin, pero es totalmente posible agregarla. Usted puede esperar a que el plugin sea actualizado con esa característica, o puede solicitarla en https://parzibyte.me/#contacto