WeasyPrint¶
WeasyPrint es un paquete Python que permite generar ficheros PDF. Pensado especialmente para entornos de desarrollo, convierte ficheros HTML en formato PDF.
Instalación¶
macOS
En determinadas versiones de macOS es necesario instalar ciertos paquetes de sistema para que weasyprint funcione correctamente:
Si el problema persiste, es posible que haya que realizar algunos ajustes de enlaces simbólicos:
sudo ln -s /opt/homebrew/opt/glib/lib/libgobject-2.0.0.dylib /usr/local/lib/gobject-2.0
sudo ln -s /opt/homebrew/opt/pango/lib/libpango-1.0.dylib /usr/local/lib/pango-1.0
sudo ln -s /opt/homebrew/opt/harfbuzz/lib/libharfbuzz.dylib /usr/local/lib/harfbuzz
sudo ln -s /opt/homebrew/opt/fontconfig/lib/libfontconfig.1.dylib /usr/local/lib/fontconfig-1
sudo ln -s /opt/homebrew/opt/pango/lib/libpangoft2-1.0.dylib /usr/local/lib/pangoft2-1.0
Modo de uso¶
Aunque existen otros casos de uso, aquí cubriremos el más habitual. Partiendo de un fichero HTML lo convertiremos a PDF.
Para ello vamos a hacer uso de la clase HTML
que proporciona WeasyPrint:
- Importamos la clase
HTML
. -
- También es posible usar
HTML
con parámetro posicional. En ese caso WeasyPrint tratará de averiguar si se trata de un nombre de fichero, de una URL absoluta o de unfile object
. - Usamos el método
write_pdf()
para generar el PDF de salida, indicando su ruta.
- También es posible usar
URL base¶
Si queremos usar rutas relativas dentro del fichero HTML y no son relativas a la carpeta «actual» de trabajo, hay que especificarlo utilizando el parámetro base_url
que pasaremos al constructor de la clase HTML
.
Su uso depende del tipo de aplicación que estemos desarrolando:
base_url = f'file://{absolute_path_to_assets}/'#(1)!
HTML('input.html', base_url=base_url).write_pdf('output.pdf')
- Fundamental acabar la ruta con barra
/
base_url = f'http://{absolute_path_to_assets}/'#(1)!
HTML('input.html', base_url=base_url).write_pdf('output.pdf')
- Fundamental acabar la ruta con barra
/
Django
En Django podemos utilizar la función request.build_absolute_uri()
para este cometido.