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.
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
.
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.
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=
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”
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()
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.
El día de hoy te mostraré cómo crear un servidor HTTP (servidor web) en Android…
En este post te voy a enseñar a designar una carpeta para imprimir todos los…
En este artículo te voy a enseñar la guía para imprimir en una impresora térmica…
Hoy te voy a mostrar un ejemplo de programación para agregar un módulo de tasa…
Los usuarios del plugin para impresoras térmicas pueden contratar licencias, y en ocasiones me han…
Hoy voy a enseñarte cómo imprimir el € en una impresora térmica. Vamos a ver…
Esta web usa cookies.
Ver comentarios
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