Comment générer un pdf à partir d'une page web
Il est souvent utile de pouvoir générer un pdf à partir d'un contenu web.
Il existe de nombreuses solutions plus ou moins bonne.
Tout d'abord, il faut savoir que l'html+css et le format pdf sont quand même passablement différents. Il va donc être facile de convertir du contenu dans un format ou dans l'autre. Mais il ne va pas être simple d'avoir la même mise en page dans les deux cas.
Traditionnellement, le pdf est souvent utilisé pour faire des documents que l'on exporte d'un site web. L'exemple typique c'est la facture qui est générée après un achat sur un site de e-commerce.
Pour concevoir ce genre de document, on conçoit un canevas tout fait où il suffit de remplir les données de la marchandises achetée et les données du client.
Pour ce genre d'application on utilise traditionnellement des applications comme pdflib.
Pour faire plus léger, en php, et totalement gratuit, d'autres alternatives on été crées. Il s'agit par exemple de TCPDF.
Cette bibliothèques est utilisée dans de nombreux cms pour exporter directement un pdf à partir d'une page. Bien que le résultat ne soit pas si mal, il est toujours frustrant. Le résultat n'est pas pareil que l'original web.
Ce script est capable de comprendre une partie d'html, mais comprendre les styles css par dessus est trop compliqué.
Une nouvelle idée est apparue: créer un moteur qui interprète le html+css comme n'importe quel navigateur web et sortir l'affichage au format pdf.
C'est ce que fait l'application prince-xml.
Prince est capable de comprendre de nombreuse grammaire xml et de les transformer en pdf. Le résultat est totalement différent de ce qu'un tcpdf est capable de faire ! C'est nettement mieux.
Google utilise cette solution pour générer des pdf à partir de document google docs... Si google n'a pas mieux maison... c'est que le produit est vraiment bien !
Il reste un petit bémole à cette solution qui est probablment la meilleures, c'est que pour une utilisation serveur, il faut une license qui est passablement chère... 3000 dollars australiens.. gloups. Même si le soft vaut certainement son prix... c'est quand même hors de prix pour beaucoup.....
Voilà qu'une nouvelle réflexion s'est faite..... Quand j'imprime une page web depuis safari sur mon mac, directement je peux exporter l'impression en pdf.... on ne peut pas utiliser le soft qui fait ça ??
Et effectivement, en creuseant de ce côté il y a moyen de faire quelque chose. Les basses couche de safari, webkit, sont opensource. Il reste juste les hautes couches applicative à bidouiller, mais le plus dur est fait, comprendre le html+css qui est vraiment de plus en plus complexe.
C'est ainsi qu'est née l'application wkhtmltopdf, c'est une application opensource qui est maintenant à maturité. Elle permet très simplement de faire juste ce qu'on lui demande, manger de l'html+css pour en resortir un pdf.
Personnellement, je suis assez bluffé. Pas mal du tout. Les petits à côté sont sympa aussi. Ce que j'aime beaucoup, c'est la génération automatique de la table des matières et le fait de pouvoir ajouter directement une page de titre.
Voici la commande qui permet de générer un fichier pdf à partir d'une page web tout en ajoutant au début du document une page de table des matières qui a pour titre "Table des matières".
- wkhtmltopdf -t --toc-header-text "Table des matières" monfichier.html monfichier.pdf
Voilà, j'ai maintenant tout ce qu'il me faut pour avoir un traitement de texte complet dans un simple navigateur web.
C'est ce que j'utilise ici pour écrire ces lignes.
Un couplage de tinyMCE pour la partie écriture wysiwyg, puis j'enregistre et gère mes documents l'application web que j'ai codée, puis j'exporte les documents que j'écris à l'aide de wkhtmltopdf.
Merveilleux !
Pourquoi s'ennuyer avec M$ office... ou même openoffice... qui sont des suite bureautique de plus en plus lourdes pour ne pas faire grand chose de plus qu'il y a 15 ans dans le traitement de texte !
Merci pour cet article qui résume bien la situation 🙂
À part Prince y’a pas encore de véritable solution pour printer depuis des application web protégées (espace avec login/mdp) et ça, ça me navre un peu ^^
si tu as des pistes d’ailleurs ça peut m’intéresser 🙂