Crear archivos PDF en Flask
He trabajado creando archivos PDF con la librería FPDF en PHP y CodeIgniter. Ahora me encuentro creando PDFs con Flask y la librería Pillow. Veo que es un poco más dispendioso (o flexible) hacerlo con Flask, sin embargo podemos crear archivos PDF en Flask con ayuda la librería Pillow.
Crear archivos PDF en Flask
En este caso, vamos a generar un documento PDF desde Flask (realmente Python), cuyo contenido es alimentado desde un formulario. Luego, ese documento se imprime en una impresora Zebra ZT411 (la impresora debe estar configurada en Linux).
Pasos para preparar el ambiente:
- Instalamos Flask:
pip3 install Flask - Instalamos la librería Pillow:
pip3 install Pillow
Nuestra app:
from flask import Flask, request, Response, render_template, redirect, flash, url_for, make_response from PIL import Image, ImageDraw, ImageFont import time import os app = Flask(__name__, template_folder='templates') @app.route("/") def formulario(): return render_template("formulario.html") @app.route("/imprimir", methods=["POST", "GET"]) def imprimir(): fecha = time.strftime("%Y-%m-%d") logo_img = Image.open('/ruta_hacia_nuestro_logo/Logo.jpg') Logo = logo_img.resize((110, 40)) Fuente = ImageFont.truetype('/ruta_hacia_nuestra_fuente/Saira-Regular.otf', save_all=True, resolution=100) dato1 = request.form["dato1"] dato2 = request.form["dato2"]; img = Image.new('RGB', (600, 390), color = (255, 255, 255)) d = ImageDraw.Draw(img) d.text((320,30), str(fecha), fill=(0,0,0), font=Fuente) d.text((30,140), "DATO1:", fill=(0,0,0), font=Fuente) d.text((275,140), str(dato1), fill=(0,0,0), font=Fuente) d.text((30,140), "DATO2", fill=(0,0,0), font=Fuente) d.text((275,140), str(dato2), fill=(0,0,0), font=Fuente) img.paste(Logo, (30, 5)) nombre_tiquete = '/ruta_donde_queremos_el_la_imagen/tiquete_imagen'+'.png' img.save(nombre_tiquete) tiquete_img = Image.open(nombre_tiquete) tiquete_pdf = tiquete_img.convert('RGB') tiquete_img.close() tiquete_pdf.save('/ruta_donde_queremos_el_documento_pdf/tiquete_ok.pdf', save_all=True, resolution=100) os.system("lpr -P ZT411 -o media=Custom.100x150mm -o zePrintMode=Cutter /ruta_al_documento_pdf/tiquete_ok.pdf &") return render_template("formulario.html") if __name__ == '__name__': app.run()
En resumen lo que se plasma aquí es lo siguiente. Tenemos dos endpoints, uno es el formulario y el otro recibe los datos cuando enviamos el formulario. El algoritmo plasma esos datos en una imagen PNG y luego toma esa imagen para convertirla en un documento PDF. Luego, se manda a imprimir con el comando lpr.
Puedes ver cómo integrar a Flask con Apache2
Valora este artículo

