Générer des PDF en PHP ce n'est jamais une chose facile. Soit on utilise une librairie comme TCPDF qui nous demandera de placer soigneusement chaque bloc, soit on utilise une librairie intermédiaire comme HTML2PDF qui permet de générer un PDF à partir d'un code HTML simplifié. Dans les 2 cas, il est difficile d'obtenir un résultat qui soit pleinement satisfaisant. C'est là que WKHTMLtoPDF intervient.
WKHTMLtoPDF est un outil en ligne de commande qui permet de générer un document PDF à partir d'une page HTML en utilisant le moteur de rendu QT Webkit.
Installation de WKHTMLtoPDF
Pour commencer à travailler avec cet outil, il va falloir commencer par l'installer. Malheureusement, j'ai rencontré des problèmes avec la version disponible sur le gestionnaire de paquet, on va donc installer la version précompilée disponible sur le site.
wget http://download.gna.org/wkhtmltopdf/0.12/0.12.2.1/wkhtmltox-0.12.2.1_linux-wheezy-amd64.deb
dpkg -i wkhtmltox-0.12.2.1_linux-wheezy-amd64.deb
# Si il vous manque des dépendances
apt-get -f install
Et voila, vous pouvez maintenant relancer le terminal (ou utiliser la commande source
) et la commande wkhtmltopdf doit maintenant être disponible. Vous pouvez l'essayer en générant un PDF de la page d'acceuil de google par exemple.
wkhtmltopdf http://google.com google.pdf
Et pour communiquer en PHP ?
Maintenant que la commande est disponible sur notre serveur, on souhaite l'utiliser depuis PHP. Il est tout à fait possible de faire des shell_exec()
mais il existe déjà des librairies qui propose une approche plus objet du problème.
composer require mikehaertl/phpwkhtmltopdf
Une fois cette librairie chargée dans notre application on va pouvoir l'initialiser.
$PDF = new \mikehaertl\wkhtmlto\Pdf($content);
$PDF->send();
Le constructeur peut prendre plusieurs paramètres :
- Une chaine de caractère représentant le contenu HTML à convertir ou l'URL/Chemin de la page HTML
- Un tableau d'options, qui seront passées à wkhtmltopdf
Dans notre cas on lui passe simplement le contenu HTML vu que l'on ne souhaite pas lui passer d'options. Ensuite, pour générer le PDF plusieurs solutions s'offrent à nous :
send()
rend le PDF sur le navigateur de l'utilisateursend('filename')
force le téléchargement du PDF en donnant un certain nom au fichiersaveAs('filename')
permet de générer le PDF et de le sauvegarder sur le serveur
Il existe tout un tas de méthodes plus ou moins utiles suivant les cas donc n'hésitez pas à jeter un oeil sur la page GitHub de mikehaertl/phpwkhtmltopdf.
et pour le CSS et le Javascripts ?
Pour le CSS vous avez 2 options :
- Dans votre code HTML, vous pouvez mettre le chemin vers votre fichier CSS grâce à la balise
<link>
, dans ce cas le chemin devra être le chemin absolu vers le fichier - Utiliser l'option
--user-style-sheet
pour indiquer à la commande ou trouver le css correspondant à notre contenu HTML. Attention cependant le CSS chargé de cette manière semble avoir un comportement étrange
Pour le JavaScript c'est un peu plus complexe, car le JavaScript met un petit temps pour s'éxécuter, il faudra donc demander à wkhtmltopdf d'attendre pour générer le PDF à partir de notre rendu. On utilisera pour ça l'option --JavaScript-delay
qui permettra d'indiquer un délai d'attente en millisecondes.