1678 votes

Comment puis-je ajouter du HTML et du CSS dans un PDF

J'ai un document HTML (pas XHTML) qui s'affiche bien dans Firefox 3 et IE 7. Il utilise du CSS assez basique pour le style et s'affiche bien en HTML.

Je cherche maintenant un moyen de le convertir en PDF. J'ai essayé :

  • DOMPDF : il a eu d'énormes problèmes avec les tables. J'ai factorisé mes grandes tables imbriquées et ça a aidé (avant, ça consommait jusqu'à 128 Mo de mémoire puis plantait - c'est ma limite de mémoire dans php.ini) mais il fait un vrai gâchis des tables et ne semble pas récupérer les images. Les tables étaient juste des choses basiques avec quelques styles de bordure pour ajouter quelques lignes à divers endroits ;
  • HTML2PDF et HTML2PS : j'ai en fait eu plus de chance avec cela. Il a affiché certaines des images (toutes les images sont des URL de Google Chart) et la mise en forme du tableau était bien meilleure mais il semblait avoir un problème de complexité que je n'ai pas encore résolu et plantait avec des erreurs de type de nœud inconnu. Je ne sais pas où aller à partir de là ; et
  • Htmldoc : cela semble fonctionner correctement sur du HTML basique mais n'a presque aucun support pour le CSS donc vous devez tout faire en HTML (je n'avais pas réalisé qu'on était toujours en 2001 dans le monde de Htmldoc...) donc c'est inutile pour moi.

J'ai essayé une application Windows appelée Html2Pdf Pilot qui a en fait fait un travail assez décent mais j'ai besoin de quelque chose qui fonctionne au minimum sous Linux et idéalement fonctionne à la demande via PHP sur le serveur Web.

Qu'est-ce que j'ignore, ou comment puis-je résoudre ce problème ?

9 votes

Html2Pdf utilise en fait une instance embarquée d'IE pour rendre la page, puis convertit cela en PDF - probablement via le mécanisme d'impression d'IE.

57 votes

Puisque c'est une question de 2008, dompdf est maintenant bien plus mature. ;-)

5 votes

Dompdf prend désormais en charge CSS 2.1 et peut gérer les règles @import, @media et @screen, et chargera les feuilles de style externes. Il est également livré avec tout ce qui est nécessaire pour fonctionner, même s'il existe des choses que vous pouvez installer pour obtenir de meilleures performances que les bibliothèques par défaut. code.google.com/p/dompdf

671voto

Mic Points 13418

Jetez un œil à wkhtmltopdf. C'est open source, basé sur webkit et gratuit.

Nous avons écrit un petit tutoriel ici.

MODIFIER ( 2017 ):

Si c'était pour construire quelque chose aujourd'hui, je n'emprunterais plus cette voie.
Mais j'utiliserais http://pdfkit.org/ à la place.
En supprimant probablement toutes ses dépendances nodejs, pour le faire fonctionner dans le navigateur.

10 votes

Celle-ci fonctionne selon la meilleure hypothèse à mon avis. La conversion de Boostrap à partir d'un rendu existant au lieu d'en écrire un à partir de zéro - ce n'est pas une tâche anodine. De plus, Webkit est écrit en C++ et donc beaucoup plus rapide et moins gourmand en ressources qu'une implémentation basée sur PHP.

0 votes

C'est super. Dommage que cela nécessite l'installation des bibliothèques client X11 sur le serveur.

3 votes

Nous avons rencontré d'énormes problèmes pour essayer de rendre correctement les polices de caractères sur les serveurs CentOS. Après littéralement des semaines de bidouillage, il semble que la seule option soit de ne pas utiliser CentOS.

560voto

SchizoDuckie Points 6420

Important: Veuillez noter que cette réponse a été écrite en 2009 et qu'elle pourrait ne pas être la solution la plus rentable aujourd'hui en 2019. Les alternatives en ligne sont meilleures aujourd'hui qu'elles ne l'étaient à l'époque.

Voici quelques services en ligne que vous pouvez utiliser :


Jetez un œil à PrinceXML.

C'est certainement le meilleur convertisseur HTML/CSS en PDF là-bas, bien que ce ne soit pas gratuit (Mais bon, votre programmation n'est peut-être pas gratuite non plus, donc si cela vous fait gagner 10 heures de travail, vous êtes tranquille (car il faut aussi prendre en compte que les solutions alternatives nécessiteront de configurer un serveur dédié avec le bon logiciel))

Oh oui, ai-je mentionné que c'est la première (et probablement la seule) solution HTML2PDF qui prend en charge pleinement ACID2 ?

Exemples PrinceXML

0 votes

Il semble que vous ne pouvez télécharger que la version bureau. J'aimerais vraiment essayer la version serveur. Mais la version bureau a fait un excellent travail (équivalent à ma version html2pdf finale mais quasiment instantanée). Merci pour la recommandation.

16 votes

Ma société a écrit un service Web construit autour de Prince. Coûts initiaux nettement moins chers, et utilisables sans avoir besoin d'installer quoi que ce soit : docraptor.com

6 votes

J'ai aussi utilisé DocRaptor, super moyen d'obtenir les avantages de Prince sans avoir à payer pour la licence coûteuse. Félicitations pour ce excellent produit, Joel.

153voto

cletus Points 276888

Après quelques investigations et de nombreux cheveux tirés, la solution semble être HTML2PDF. DOMPDF a fait un travail terrible avec les tableaux, les bordures et même les mises en page modérément complexes, et htmldoc semble raisonnablement robuste mais ignore complètement le CSS et je ne veux pas revenir à la mise en page HTML sans CSS juste pour ce programme.

HTML2PDF semblait être le plus prometteur mais j'avais toujours cette erreur étrange à propos d'arguments de référence nuls pour node_type. J'ai finalement trouvé la solution à cela. En gros, PHP 5.1.x fonctionnait bien avec les remplacements regex (preg_replace_*) sur des chaînes de n'importe quelle taille. PHP 5.2.1 a introduit une directive de configuration php.ini appelée pcre.backtrack_limit. Ce que fait ce paramètre de configuration est de limiter la longueur de la chaîne pour laquelle la correspondance est effectuée. Pourquoi cela a été introduit je ne sais pas. La valeur par défaut a été choisie comme étant 100 000. Pourquoi une valeur si basse ? Encore une fois, je ne sais pas.

Un bug a été signalé contre PHP 5.2.1 pour cela, qui est maintenant clos.

Ce qui est horrifiant à ce sujet, c'est que lorsque la limite est dépassée, le remplacement échoue simplement silencieusement. Au moins, si une erreur avait été levée et enregistrée, vous auriez eu une indication de ce qui s'est passé, pourquoi et quoi changer pour le corriger. Mais non.

J'ai donc un fichier HTML de 70k à convertir en PDF. Cela nécessite les paramètres php.ini suivants :

  • pcre.backtrack_limit = 2000000; # probablement plus que nécessaire mais c'est OK
  • memory_limit = 1024M; # oui, un gigaoctet; et
  • max_execution_time = 600; # oui, 10 minutes.

Maintenant, le lecteur avisé aura peut-être remarqué que mon fichier HTML est plus petit que 100k. La seule raison que je peux imaginer pour expliquer pourquoi j'ai rencontré ce problème est que html2pdf effectue une conversion en xhtml dans le processus. Peut-être que cela m'a dépassé (bien que près de 50% de gonflement semble étrange). Quoi qu'il en soit, ce qui précède a fonctionné.

Maintenant, html2pdf est un véritable glouton en ressources. Mon fichier de 70k prend environ 5 minutes et au moins 500-600M de RAM pour créer un fichier PDF de 35 pages. Pas assez rapide (de loin) pour un téléchargement en temps réel malheureusement et l'utilisation de la mémoire place le ratio d'utilisation de la mémoire de l'ordre de 1000 pour 1 (600M de RAM pour un fichier de 70k), ce qui est totalement ridicule.

Malheureusement, c'est la meilleure solution que j'ai trouvée.

1 votes

@cletus pouvez-vous me dire s'il vous plaît à propos de la version stable de HTML2PDF. L'exemple de lien ci-dessus est obsolète

0 votes

Pour la dernière version, consultez github.com/spipu/html2pdf

1 votes

La terrible faute de frappe devient encore plus terrible : le ratio d'utilisation de la mémoire est de l'ordre de 10 000 pour 1 lol

128voto

Karthick Points 281

Pourquoi ne pas essayer mPDF version 2.0 ? Je l'ai utilisé pour créer un document PDF. Cela fonctionne bien.

Entre-temps, mPDF est à la version 5.7 et est activement maintenu, contrairement à HTML2PS/HTML2PDF

Mais gardez à l'esprit que la documentation peut vraiment être difficile à manipuler. Par exemple, jetez un œil à cette page : https://mpdf.github.io/.

Des tâches très basiques de conversion d'HTML en PDF peuvent être effectuées avec cette bibliothèque, mais des tâches plus complexes nécessiteront un certain temps de lecture et de "compréhension" de la documentation.

1 votes

J'ai essayé plusieurs des options suggérées ici. Jusqu'à présent, celle-ci a été téléchargée et a fonctionné directement sans aucun problème et la documentation est vraiment incroyable comparée au reste. Les instructions d'utilisation sont clairement écrites.

0 votes

MPDF me donne bien du fil à retordre lorsque j'envoie des balises html avec un arrière-plan d'image ou des balises depuis la base de données: Erreur mPDF: Erreur IMAGE (http://www.example.com/folder/image.jpg): Erreur d'analyse du fichier image - type d'image non reconnu, et non pris en charge par GD imagecreate

0 votes

Version 6.0 fonctionne exactement comme prévu : incluez-le (ou dans un framework, chargez-le), instanciez, remplissez avec vos éléments, affichez-le d'une manière ou d'une autre... C'est tout !

36voto

Somnath Muluk Points 10173

Si votre intention est de créer un PDF à partir de PHP, pdflib vous aidera.

Sinon, si vous souhaitez convertir une page HTML en PDF via PHP, vous rencontrerez quelques problèmes ici.

Les options que je connais sont :

DOMPDF : classe PHP qui enveloppe le HTML et construit le PDF. Fonctionne bien, personnalisable (si vous connaissez le PHP), basé sur pdflib, si je me souviens bien il accepte même un peu de CSS. Mauvaise nouvelle : lent lorsque le HTML est grand ou très complexe.

HTML2PS : même chose que DOMPDF, mais celui-ci convertit d'abord en .ps (ghostscript), puis, dans le format dont vous avez besoin (pdf, jpg, png). Pour moi, c'est un peu mieux que dompdf, mais a le même problème de vitesse. Il a un meilleur support pour CSS.

Ces deux sont des classes PHP, mais si vous pouvez installer un logiciel sur le serveur, et y accéder via passthru() ou system(), regardez aussi ceux-ci :

wkhtmltopdf : basé sur webkit (l'enveloppe de safari), est vraiment rapide et puissant.. semble être le meilleur (pour l'instant) pour convertir des pages HTML en PDF en temps réel, ne prenant que 2 secondes pour un document XHTML de 3 pages avec CSS2. C'est un projet récent, de toute façon, la page google.code est souvent mise à jour.

htmldoc : celui-ci est un tank, il plante souvent. Le projet semble être mort en 2007, mais de toute façon si vous n'avez pas besoin de compatibilité CSS cela peut fonctionner pour vous.

tcpdf - il s'agit d'une version améliorée et maintenue de fpdf. Caractéristiques principales de tpdf et il a également un meilleur temps d'exécution avec une excellente sortie. Pour un tutoriel détaillé sur l'utilisation des deux classes de génération de PDF les plus populaires : TCPDF et FPDF, veuillez suivre ce lien

Voir également ces articles.

  1. Converting HTML in PHP File to PDF File
  2. Best pdf generator in PHP , mpdf or fpdf?
  3. Export a html into PDF in PHP?
  4. Writing HTML with PHP variables to PDF file?
  5. How to convert html into pdf with php?
  6. Tool for exporting html as pdf

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X