Genera PDFs en Django con xhtml2pdf

Enviado por christian el

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:

  1. Se guarden los campos en la base de datos en una entidad. Este punto lo he comentado aquí con los ModelForm
  2. 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:

  1. Instala el paquete
  2. En el fichero "views.py", importa la libería y define en el submit del formulario la creación del pdf:
    1. from xhtml2pdf import pisa
    2. # 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
  3. 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

Dinahosting: dominios y alojamiento web
My investor

Regístrate en MyInvestory tendrás un extra de 20€ ! :D

Usa el código U048395 y te llevas un regalo en tu primera inversión :)

Usa el código 22c80f y te llevas un regalo en tu primera inversión :)