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.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

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.

2 comentarios en “Python – Imprimir PDF”

Dejar un comentario