Tutoriel Vidéo PHP Générer des PDF avec WKHTMLtoPDF

Télécharger la vidéo Télécharger les sources Voir la démo

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'utilisateur
  • send('filename') force le téléchargement du PDF en donnant un certain nom au fichier
  • saveAs('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.