1678 votes

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

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

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

  • DOMPDF Il avait de gros problèmes avec les tableaux. J'ai supprimé mes grandes tables imbriquées et cela a aidé (avant, il consommait jusqu'à 128M de mémoire puis mourait - c'est ma limite de mémoire dans php.ini) mais il fait un désordre complet des tables et ne semble pas obtenir les images. Les tables étaient juste des trucs basiques avec quelques styles de bordure pour ajouter des lignes à différents endroits ;
  • HTML2PDF et HTML2PS : J'ai en fait eu plus de chance avec ceci. Il a rendu certaines des images (toutes les images sont des URL de Google Chart) et le formatage des tableaux était bien meilleur, mais il semblait avoir un problème de complexité que je n'ai pas encore résolu et il continuait à mourir avec des erreurs de type de nœud inconnu(). Je ne sais pas trop où aller à partir de là
  • Htmldoc Il semble que cela fonctionne bien avec le HTML de base, mais il n'y a pratiquement aucun support pour les CSS, ce qui fait que vous devez tout faire en HTML (je n'avais pas réalisé que c'était encore 2001 au pays du Htmldoc...), ce qui me rend inutile.

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

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

9 votes

Html2Pdf utilise en fait une instance intégrée d'IE pour rendre la page, puis la convertit en PDF - probablement par le biais du mécanisme d'impression d'IE.

57 votes

puisque c'est une question de 2008, dompdf est beaucoup plus mature maintenant ;-)

5 votes

dompdf prend désormais en charge la norme CSS 2.1 et peut traiter les éléments suivants @import , @media et @screen et chargera des feuilles de style externes. Il est également fourni avec tout ce qui est nécessaire à son fonctionnement, bien que vous puissiez installer certaines choses pour obtenir de meilleures performances que les librairies par défaut. code.google.com/p/dompdf

671voto

Mic Points 13418

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

Nous avons écrit un petit tutoriel ici .

EDIT( 2017 ) :

Si c'était pour construire quelque chose aujourd'hui, je ne choisirais plus cette voie.
Mais utiliserait http://pdfkit.org/ à la place.
Probablement en le dépouillant de toutes ses dépendances nodejs, pour le faire fonctionner dans le navigateur.

10 votes

Celui-ci fonctionne sur la meilleure prémisse IMO. La conversion de Boostrap à partir d'un moteur de rendu existant au lieu d'en écrire un à partir de zéro - ce n'est pas une tâche triviale. De plus, Webkit est écrit en C++ et donc beaucoup plus rapide et beaucoup moins gourmand en ressources qu'une implémentation basée sur PHP.

0 votes

C'est génial. Dommage qu'il faille installer les librairies du client X11 sur le serveur.

3 votes

Nous avons eu d'énormes difficultés à obtenir un rendu correct des polices sur les serveurs CentOS. Après des semaines d'efforts, 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é rédigée en 2009 et qu'elle n'est peut-être pas la solution la plus rentable aujourd'hui en 2019. Les alternatives en ligne sont meilleures aujourd'hui qu'à l'époque.

Voici quelques services en ligne que vous pouvez utiliser :


Jetez un coup d'œil à PrinceXML .

Il s'agit sans aucun doute du meilleur convertisseur HTML/CSS en PDF, même s'il n'est pas gratuit (mais bon, votre programmation n'est peut-être pas gratuite non plus, donc s'il vous permet d'économiser 10 heures de travail, vous êtes libre (car vous devez également tenir compte du fait que les solutions alternatives vous obligeront à installer un serveur dédié avec le bon logiciel).

Ah oui, ai-je mentionné qu'il s'agit de la première (et probablement de la seule) solution HTML2PDF qui permet d'effectuer un traitement complet de l'image. ACID2 ?

Échantillons PrinceXML

0 votes

Eh bien, il semble que vous ne pouvez télécharger que la version de bureau. J'aimerais vraiment essayer la version serveur. Mais la version de bureau a fait un travail superbe (égal à ma version finale html2pdf mais pratiquement instantané). Merci pour la recommandation.

16 votes

Ma société a écrit un service web construit autour de Prince. Les coûts initiaux sont nettement moins élevés et le service est utilisable sans qu'il soit nécessaire d'installer quoi que ce soit : docraptor.com.

6 votes

J'ai aussi utilisé DocRaptor. C'est un moyen génial de bénéficier des avantages de Prince sans avoir à payer la licence coûteuse. Félicitations pour cet excellent produit, Joel.

153voto

cletus Points 276888

Après quelques recherches et un certain nombre d'essais, la solution semble être la suivante HTML2PDF . DOMPDF a fait un travail terrible avec les tableaux, les bordures et même une mise en page modérément complexe et htmldoc semble raisonnablement robuste mais est presque complètement ignorant des CSS et je ne veux pas revenir à la mise en page HTML sans CSS juste pour ce programme.

HTML2PDF semblait le plus prometteur mais je continuais à avoir cette erreur bizarre à propos d'arguments de référence nuls pour node_type. J'ai finalement trouvé la solution à ce problème. En gros, PHP 5.1.x fonctionnait bien avec les remplacements regex (preg_replace_*) sur des chaînes de toutes tailles. PHP 5.2.1 a introduit une directive de configuration php.ini appelée pcre.backtrack_limit . Ce paramètre de configuration limite la longueur de la chaîne pour laquelle la correspondance est effectuée. Je ne sais pas pourquoi ce paramètre a été introduit. La valeur par défaut a été choisie comme étant 100 000. Pourquoi une valeur aussi basse ? Là encore, aucune idée.

A Un bogue a été détecté dans PHP 5.2.1 pour ce problème. qui est toujours ouvert presque deux ans plus tard .

Ce qui est horrible dans tout ça, c'est que lorsque la limite est dépassée, le remplacement se fait tout simplement échoue silencieusement . Au moins, si une erreur avait été signalée et enregistrée, vous auriez eu une idée de ce qui s'est passé, du pourquoi et de ce qu'il faut changer pour y remédier. Mais non.

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

  • pcre.backtrack_limit = 2000000 ; # probablement plus que ce dont j'ai besoin, mais c'est bon.
  • memory_limit = 1024M ; # oui, un gigaoctet ; et
  • max_execution_time = 600 ; # oui, 10 minutes .

Le lecteur avisé aura peut-être remarqué que mon fichier HTML est inférieur à 100k. La seule raison que je puisse imaginer pour expliquer ce problème est que html2pdf effectue une conversion en xhtml dans le cadre du processus. Peut-être que cela m'a dépassé (bien qu'un gonflement de près de 50% semble étrange). Quoi qu'il en soit, ce qui précède a fonctionné.

Maintenant, html2pdf est un monstre de 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. Ce n'est pas assez rapide (et de loin) pour un téléchargement en temps réel malheureusement et l'utilisation de la mémoire met le ratio d'utilisation de la mémoire dans l'ordre de 1000 pour 1 (600M de RAM pour un fichier de 70k), ce qui est tout à fait ridicule.

Malheureusement, c'est le mieux que j'ai pu trouver.

1 votes

@cletus pouvez-vous me renseigner sur la version stable de HTML2PDF. L'exemple de lien ci-dessus a une version obsolète

0 votes

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

1 votes

Une faute de frappe sinistre devient encore plus sinistre : Le ratio d'utilisation de la mémoire est de l'ordre de 10.000 pour 1 lol

128voto

Karthick Points 281

Pourquoi n'essayez-vous pas mPDF version 2.0 ? Je l'ai utilisé pour créer un document PDF. Il fonctionne bien.

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

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

Des tâches très basiques autour du html vers le pdf, peuvent être réalisées avec cette bibliothèque, mais des tâches plus complexes demanderont un peu de temps pour lire et "comprendre" la documentation.

1 votes

J'ai essayé un tas de ceux suggérés ici. Jusqu'à présent, celui-ci a été téléchargé et a fonctionné sans problème et la documentation est vraiment étonnante par rapport aux autres. Les instructions d'utilisation sont clairement écrites.

0 votes

mPDF me pose de sérieux problèmes lors de l'envoi de balises html avec fond d'image ou de balises provenant de la base de données : mPDF error: IMAGE Error (http://www.example.com/folder/image.jpg): Error parsing image file - image type not recognised, and not supported by GD imagecreate

0 votes

La version 6.0 fonctionne comme prévu : incluez-la (ou dans un framework, chargez-la), instanciez-la, remplissez-la avec votre matériel, produisez-la 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 voulez convertir une page HTML en PDF via PHP, vous trouverez un peu de mal à vous en sortir.

Donc, les options que je connais sont :

DOMPDF : Classe PHP qui enveloppe le HTML et construit le PDF. Fonctionne bien, personnalisable (si vous connaissez PHP), basée sur pdflib, si je me souviens bien elle accepte même quelques CSS. Mauvaise nouvelle : lent quand le HTML est gros ou très complexe.

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

Ces deux-là sont des classes PHP, mais si vous pouvez installer un logiciel sur le serveur, et y accéder par l'intermédiaire de passthru() ou system() regardez ça aussi :

wkhtmltopdf Il est basé sur webkit (le wrapper de safari), est très rapide et puissant. Il semble que ce soit le meilleur (actuellement) pour convertir à la volée des pages html en pdf, prenant seulement 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 se plante souvent. Le projet semble être mort en 2007, mais de toute façon, si vous n'avez pas besoin de la compatibilité CSS, cela pourrait 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 aussi un meilleur temps d'exécution avec un grand rendement. 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 aussi ces articles.

  1. Conversion d'un fichier HTML en PHP en fichier PDF
  2. Le meilleur générateur de pdf en PHP, mpdf ou fpdf ?
  3. Exporter un html en PDF en PHP ?
  4. Écrire du HTML avec des variables PHP dans un fichier PDF ?
  5. Comment convertir le html en pdf avec php ?
  6. Outil d'exportation de html en 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