WkHtmlToPdf va vous permettre de créer un PDF depuis une page HTML via son moteur web kit intégré. Grâce à ce moteur web kit vous pourrez utiliser de nombreuses règles css et javascript. Objectif : avoir un rendu PDF identique à ce que vous avez sur un navigateur.
Installation de la librairie
Pour l’installation de cette librairie, rendez-vous sur wkhtmltopdf.org.
Prenons la version correspondant à notre système d’exploitation, dans mon cas, Ubuntu Trusty 64 bits. Ci-edssous la ligne de commande pour le téléchargement de la librairie après avoir copier le lien :
Ensuite pour l’installer nous tapons :
Nous remarquons qu'à l’installation, nous avons un erreur, certaines dépendances (polices, fonts….) dont la librairie a besoin pour le bon fonctionnement ne sont pas installées.
Nous allons donc taper cette commande pour installer les dépendances manquantes :
Enfin nous pouvons relancer la commande :
Si en tapant wkhtmltopdf nous avons "commande introuvable", il est nécessaire de relancer notre terminal.
Utilisation de la librairie
Prenons un exemple tout simple en générant la page d’accueil de google :
Vous l’aurez compris on tape wkhtmltopdf LIEN_SOURCE DESTINATION_PDF
Il s’agit d’un exemple assez simple de génération pour un lien vers un site web.
Génération via un fichier php
Nous allons d’abord créer notre page avec le rendu voulu.
Imaginons que votre contenu se trouve dans le fichier rendu.php avec votre code php et éventuellement le css qui l'accompagne.
La commande suivante va installer une librairie qui utilise donc wktmltopdf et qui va faire le lien entre php et la commande.
Créons ensuite un fichier index.php qui va se charger de générer notre rendu en pdf avec le contenu suivant :
Génération directe via la commande
Voici la commande qui va générer notre pdf :
Génération d’une page nécessitant une authentification
Imaginons que nous souhaitons générer une page d’un site avec authentification. Bien évidemment en lançant la commande wkhtmltopdf, celle-ci n’a bien entendu pas accès à la session utilisateur et n’aura donc pas accès aux pages du site.
Afin de palier à ce problème d’authentification, voici l’astuce qui va rendre cette génération possible :
Nous allons d’abord générer et stocker dans un dossier le contenu au format html avec par exemple la fonction file_put_contents puis indiquer à wkhtmltopdf de générer le rendu en lui indiquant le chemin où se trouve le fichier html.
On peut ensuite supprimer le fichier html après avoir générer le pdf.
Quelques options utiles
--header-center : positionne au centre notre header (logo).
--footer-right : texte aligné à droite à chaque pied de page, comme par exemple la date de génération.
--margin-bottom : espace à chaque bas de page.
--javascript-delay : en cas d’utilisation de javascript, temps en millisecondes avant le rendu pdf afin de laisser le temps au javascript de s’executer.
Je vous invite à aller voir la documentation officielle pour plus d’informations et plus de possibilités grâce aux différentes options.
Vous l’aurez compris, wkhtmltopdf est une librairie très puissante et très poussée qui permet d’avoir le même rendu en pdf que celui du navigateur grâce à son moteur web kit avec une simplicité de code.
Vous allez vite l’adopter pour vos futurs projets.
Je l’ai utilisé pour un site intranet, ça fonctionne pas mal quand on arrive à éviter certains trucs bizarres. Par exemple certains morceaux du CSS qui ne doivent être spécifiés que pour @media(print) sinon ça foire…
Et quand comme dans mon cas on a une page qui se construit entièrement avec du JS qui en plus met des timers pour recalculer le layout en fonction de la largeur de la page (qui comme par hasard est de 0 ou un truc du genre suivant comment on calcule…), il faut bien fouiller toutes les options (on peut imposer un nombre de secondes avant de faire l’impression, ou alors attendre une valeur sur la status-bar…) pour ne pas aller trop vite.
Super merci beaucoup, c’est toujours galère de générer des PDF propre et votre solution est parfaite ! Votre tutoriel est super clair en plus 🙂
Bonjour et merci pour ce tutos très utile !
Par contre une petite erreur de frappe, ce n’est pas :
composer require mikehaerl/phpwkhtmltopdf
Mais
composer require mikehaertl/phpwkhtmltopdf
Il manque un « t » 😉