Comunidad de diseño web y desarrollo en internet online

Crear PDF en Django y Virtualenv

He estado luchando con la generación de un PDF de calidad en Django, utilizaba la librería Xhtml2pdf y Pisa, pero tuve muchos problemas de renderizado, al ser él mismo quien renderiza el CSS y el HTML, a veces no lo hace de manera correcta. Así que me tocó buscar una librería que pudiera hacer ese trabajo, y me encontré con wkhtmltopdf, una excelente propuesta. La trabajé en el servidor de desarrollo y funcionó perfecto, pero cuando pasé mi proyecto a mi servidor de deployment, regresaron los problemas y adiós tranquilidad por un día!!!. Les dejo aquí todo el procedimiento que me tocó hacer, para que ustedes no sufran lo que yo sufrí !

Instalar la librería Wkhtmltopdf


Primero instalaremos la librería wkhtmltopdf que hace renderizado con qt webkit, así que también necesitamos algunas dependencias... comenzamos con la instalación:

Código :

apt-get build-dep libqt4-gui libqt4-network libqt4-webkit 
apt-get install openssl build-essential xorg git-core git-doc libssl-dev wkhtmltopdf 


Sobre su virtualenv, deben instalar una librería wrapper de wkhtmltopdf para Django, el cual podemos hacer con PIP.

Código :

$pip install django-wkhtmltopdf 
O descargarlo desde github e instalarlo y hacer la instalación manual como allí lo dicen. Luego se hace la integración a Django, en las INSTALED_APPS. En la misma pagina de Github os dirán como integrarlo a su proyectos.

De aquí en adelante, os funcionará perfecto en el desarrollo, pero vaya dolor de cabeza causará cuando lo pasen al servidor de deploy, donde deben hacer lo mismo.

El primer error es un bug que fue resuelto en el Github del creador del wrapper de Django para Wkhtmltopdf, con agregar unas líneas de código en el archivo utils.py de django-wkhtmltopdf. Aquí pueden modificar directamente el instalado (como me toco a mí), o si descargaste e instalaste de Github, antes de instalarlo en el servidor, deberías ver si ya tiene el parche. Es el siguiente:

utils.py:

Código :

(ln 86) - return check_output(args, stderr=sys.stderr, env=env) 
(ln 87)+ try: 
(ln 88)+ return check_output(args, stderr=sys.stderr, env=env) 
(ln 89)+ except AttributeError: 
(ln 90)+ return check_output(args, env=env) 


(agregar las líneas con +, eliminar las que encuentren con -, sin colocar las líneas, son meramente para guiarlos)

Si no encuentran los archivos de django-wkhtmltopdf donde se encuentran deberían estar aquí...

Código :

$HOME/.virtualenvs/tu_virtualenv/lib/python2.7/site-packages/wkhtmltopdf/ 


Listo, con esto ya no da error cuando se hace deploy, en este caso lo hacía con apache. si bien en un servidor no se mantiene un xserver dentro de un servidor, ni tener un Desktop Enviroment, ya que eso significa gasto de memoria innecesaria. Para poder renderizar el pdf es necesario tener un servidor corriendo, por lo cual en el servidor hay que hacer estos cambios.

Instalar Xorg para poder renderizar el Pdf


Vamos a instalar xorg, pero no haremos configuración para que inicie automáticamente, por el contrario lo que haremos es instalar un servidor "virtual" para xorg.

Código :

sudo apt-get install xorg xbfv 

Al terminar de instalar, debemos hacer un cambio, primero modificaremos el nombre del ejecutable de wkhtmltopd. (si no encuentran donde esta el ejecutable pueden averiguarlo con whereis).

Código :

sudo mv /usr/bin/wkhtmltopdf /usr/bin/wkhtmltopdf.unwrapped 


Luego crear un script con este contenido con el nombre del ejecutable inicial wkhtmltopdf.

Código :

#!/bin/sh 
xvfb-run -a -s "-screen 0 640x480x16" wkhtmltopdf.unwrapped $* 


Este archivo lo movemos hacia donde se encontraba el ejecutable:

Código :

sudo cp wkhtmltopdf /usr/bin/ 


Ya está listo!!!. El servidor debe crear un servidor "virtual" de Xorg mientras se ejecuta nuestra librería, y genera el pdf. Espero les sirva muchísimo.

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate