Usa el paquete xhtml2pdf en Django para generar un PDF
Estoy en un proyecto personal con Django en el que necesito generar un PDF en base a unos campos que se completen en un formulario. Os voy a comentar cómo lo he echo (hay más formas eh!, estas es una de muuchas!)
Os dejo por aquí más posts relacionados con Django por si le queréis echar un vistazo :D
Situación actual
Tenemos un formulario varios campos. Lo que queremos hacer es que al guardar el formulario se ejecuten dos operaciones:
- Se guarden los campos en la base de datos en una entidad. Este punto lo he comentado aquí con los ModelForm
- Se ejecute un proceso para generar un Pdf con una tabla de campos y descargar ese fichero en el equipo del usuario
Generación del PDF
Un pdf básicamente es un fichero formateado (creo que una especie de XML) por lo que lo podemos generar de forma dinámica en "runtime". Estamos en un proyecto Django por lo que lo propio es buscar un paquete de Python que ya nos ejecute esta generación.
Después de buscar y analizar varias opciones, he decidido usar la herramienta/paquete xhtml2pdf y os voy a comentar los pasos generales para poder generar el PDF:
- Instala el paquete
- En el fichero "views.py", importa la libería y define en el submit del formulario la creación del pdf:
from xhtml2pdf import pisa
# Cuando el formulario se ejecute if request.method == "POST": # Formulario válido => generar PDF if form.is_valid(): # Generamos la vista HTML (Te la explico en el siguiente punto) pdf_html = generar_html_a_pdf(datos_formulario) # Creamos un objeto "Reponse" que lo usaremos para descargar el fichero response = HttpResponse(content_type='application/pdf') response['Content-Disposition'] = 'attachment; filename="nombre_fichero_pdf.pdf"' # Generamos el fichero PDF y lo enviamos al "Response" pdf_status = pisa.CreatePDF(pdf_html, dest=response) if pisa_status.err: return HttpResponseRedirect( reverse("ruta_destino:cuando_hay_error", kwargs={}) ) # Enviamos la "Reponse" al cliente return response
- LISTO!! :D
Función "generarl_html_a_pdf"
Esta función es opcional, la he creado para hacer el código "más bonito". Simplemente en esta función creamos el HTML con los datos a pintar en el PDF. En mi caso he creado una tabla simple con los campos del formulario.
pdf_status
La variable que devuelve la función "pisa" que es la que ejecuta la generación del PDF. Esto es muy útil para notificar al usuario si existe algún problema durante la generación del PDF. En mi caso lo que hago es enviar al usuario a otra página con una información específica del error