Generar un PDF a partir de un HTML en Django

- Andrés Cruz

In english
Generar un PDF a partir de un HTML en Django

Vamos a instalar el paquete de weasyprint.

El cual, en el caso de Windows debes de instalar el siguiente programa:

https://github.com/tschoonj/GTK-for-Windows-Runtime-Environment-Installer/releases

Y en MacOS:

$ brew install python pango libffi

En la web oficial:

https://doc.courtbouillon.org/weasyprint/stable/

Tienes el detalle de los programas que debes de instalar para poder emplear este paquete desde Python.

Una vez instaladas las dependencias, ya puedes instalar el paquete como una dependencia más:

$ pip install weasyprint

Su uso es muy sencillo, basta con usar la función de HTML(), indicando la URL a la cual quieres convertir en HTML y donde lo quieres escribir mediante la función de write_pdf(), en este ejemplo, la URL de Google es la cual vamos a convertir a PDF:

pdfs\views.py

from weasyprint import HTML

def generate_pdf(request):
    filename="documents/archivo.pdf"
    HTML("https://www.google.com.ve/").write_pdf(filename)
    return render(request, 'csv.html')

Y tendremos:

Generar un PDF a partir de una URL
Generar un PDF a partir de una URL

Este paquete permite usar otras opciones como por ejemplo indicar el tamaño de la página:

from weasyprint import HTML, CSS
***
HTML(string='''
<h1>The title</h1>
<p>Content goes here
''').write_pdf(filename)
CSS(string='@page { size: A3; margin: 1cm }')

O definir CSS:

HTML('http://weasyprint.org/').write_pdf('/tmp/weasyprint-website.pdf',
    stylesheets=[CSS(string='body { font-family: serif !important }')])

Todo esto y más lo puedes ver en la documentación oficial; usar esta opción es particularmente útil si el documento PDF que quieres generar es sencillo y puede ser representado mediante un documento HTML; pero, muchas veces esto no es así y necesitas una solución pixel a pixel como veremos a continuación.

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz en Udemy

Acepto recibir anuncios de interes sobre este Blog.