Crear Archivos PDF en Flask

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:

  1. Instalamos Flask: pip3 install Flask
  2. 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   

Integrar Flask con Apache en Linux


Valora este artículo

Crear Archivos PDF en Flask
5,0 rating based on 12.345 ratings
Overall rating: 5 out of 5 based on 1 reviews.
Nombres
Email
Titulo
Calificanos
Contenido

Interesante

★★★★★
“ Lo que buscaba, bien.”
- Diego Gongora
Comparte esto en
Publicado en Desarrollo Web.