Spin0us.net github

HTML2PDF

Convertir du HTML en PDF "correctement"

par spin0us le 04 février 2021

Il existe pléthore de solutions en ligne pour convertir des documents HTML en PDF. Malgré tout, le résultat est souvent aléatoire, surtout si vous utilisez des éléments CSS non supportés.

Après moultes tentatives pas très probantes, j'ai finalement trouvé mon bonheur avec une solution assez simple à mettre en oeuvre. L'idée est d'utiliser la fonctionnalité de Chrome (save to PDF) afin de garantir le même rendu quelque soit le visiteur (et son navigateur).

Comment faire ?

Il faut commencer par installer une version de Chromium assez récente pour qu'elle supporte les dernières spécifications CSS, etc.

Chromium 83.0.4103.116 built on Debian 10.4, running on Debian 10.7

Et c'est tout !

Et oui, vous avez bien lu, c'est tout ce qu'il y a faire niveau installation/configuration. C'est déjà fonctionnel. Maintenant, la commande magique qui va bien :

chromium --headless --no-sandbox --disable-gpu --print-to-pdf=/tmp/test.pdf "https://..."
  • --headless permet de lancer chromium sans interface
  • --no-sandbox si vous l'exécutez en tant que root
  • --disable-gpu parce qu'on en a pas besoin
  • --print-to-pdf précise l'emplacement du fichier pdf qui va être créé
  • le dernier paramètre correspond à l'URL de la page HTML que vous souhaitez convertir en PDF. Ça peut être une page sur internet ou une page en local si vous utilisez http://localhost

Dans mon cas, j'ai également créé une bout de script PHP pour me permettre d'utiliser cette fonctionnalité sur l'ensemble de mes projets.

if ( isset($_GET['url']) )
{
    $url = base64_decode($_GET['url']);
    $tmp = tempnam("/tmp", "PDF-");
    $cmd = 'chromium --headless --no-sandbox --disable-gpu --print-to-pdf='.$tmp.' "'.$url.'"';
    exec($cmd);
    header("Content-type:application/pdf");
    header("Content-Disposition:inline;filename=file-".date("YmdHis").".pdf");
    readfile($tmp);
    unlink($tmp);
}

Voilà, c'est fini. À vous d'adapter cette solution à votre utilisation (ou pas, c'est vous qui voyez! Y'en a qui ont essayé. Ils ont eu des problèmes !)