Générer du contenu pdf depuis de l’HTML avec Wkhtmltopdf

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 :

wget http://download.gna.org/wkhtmltopdf/0.12/0.12.2.1/wkhtmltox-0.12.2.1_linux-trusty-amd64.deb

Ensuite pour l’installer nous tapons :

dpkg -i wkhtmltox-0.12.2.1_linux-trusty-amd64.deb

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 :

apt-get install -f

Enfin nous pouvons relancer la commande :

wget http://download.gna.org/wkhtmltopdf/0.12/0.12.2.1/wkhtmltox-0.12.2.1_linux-trusty-amd64.deb

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 :

Wkhtmltopdf http://www.google.fr /var/www/html/pdf/google.pdf

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.

composer require mikehaerl/phpwkhtmltopdf

Créons ensuite un fichier index.php qui va se charger de générer notre rendu en pdf avec le contenu suivant :

< ?php

require ‘vendor/autoload.php’ ;

ob_start() ;

require rendu.php ;

$content = ob_get_clean() ;

$pdf = new \mikehaerl\phpwkhtmltopdf\Pdf();

$pdf->addPage($content) ;

$pdf->send(‘nomfichier.pdf’)

ou

$pdf->saveAs();

?>

Génération directe via la commande

Voici la commande qui va générer notre pdf :

$cmd = "/var/www/librairie/wkhtmltopdf LIEN DESTINATION";

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.

2 commentaires

  1. 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.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *