python

Python – Imprimir PDF

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

3 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

3 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

3 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

3 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

4 días hace

Esta web usa cookies.