web-dev-qa-db-fra.com

Convertir HTML + CSS en PDF avec PHP?

J'ai un document HTML (pas XHTML) qui rend bien dans Firefox 3 et IE 7. Il utilise un code CSS assez basique pour le styler et un bon rendu en HTML.

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

  • DOMPDF : il y avait d’énormes problèmes avec les tables. J'ai factorisé mes grandes tables imbriquées et cela m'a aidé (avant qu'il ne consomme que 128 M de mémoire puis qu'il soit en train de mourir - c'est ma limite de mémoire dans php.ini), mais cela crée un fouillis complet de tableaux et ne semble pas obtenir images. Les tableaux n'étaient que des éléments de base avec certains styles de bordure pour ajouter des lignes à différents points;
  • HTML2PDF et HTML2PS : J'ai eu plus de chance avec ça. Certaines images (toutes les images sont des URL Google Chart) ont été rendues et la mise en forme du tableau était bien meilleure, mais il semblait y avoir un problème de complexité que je n'avais pas encore compris et qui continuait de mourir avec des erreurs inconnues, node_type (). Je ne sais pas où aller d'ici; et
  • Htmldoc : cela semble fonctionner correctement avec le langage HTML de base, mais ne prend pratiquement pas en charge le CSS, vous devez donc tout faire en HTML (je ne savais pas que c'était toujours 2001 à Htmldoc-land ... ) 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 fonctionne idéalement à la demande via PHP sur le serveur Web.

Qu'est-ce qui me manque ou comment puis-je résoudre ce problème?

1560
cletus

Important: Notez que cette réponse a été écrite 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 cela qu'ils étaient à l'époque.

Voici quelques services en ligne que vous pouvez utiliser:


Jetez un oeil à PrinceXML .

C'est certainement le meilleur convertisseur HTML/CSS pour PDF, bien que ce ne soit pas gratuit (mais, votre programmation risque de ne pas être gratuite non plus, donc si vous économisez 10 heures de travail, vous êtes chez vous gratuitement (étant donné que vous devez également prendre en compte le fait que les solutions alternatives nécessitent de configurer un serveur dédié avec le logiciel approprié)

Ah oui, est-ce que j'ai déjà mentionné qu'il s'agit de la première (et probablement de la seule) solution HTML2PDF qui fonctionne à plein ACID2 ?

échantillons PrinceXML

536
SchizoDuckie

Regardez 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 n'irais plus dans cette voie.
Mais utiliserait plutôt http://pdfkit.org/ .
Le dépouillant probablement de toutes ses dépendances nodejs pour s'exécuter dans le navigateur.

660
Mic

Après quelques recherches et un tiraillement général, la solution semble être HTML2PDF . DOMPDF a fait un travail épouvantable avec des tableaux, des bordures et même une mise en page moyennement complexe et htmldoc semble raisonnablement robuste mais est presque complètement ignorant des CSS et je ne veux pas y aller. Retour à la mise en page HTML sans CSS uniquement pour ce programme.

HTML2PDF semblait le plus prometteur, mais je continuais à avoir cette erreur étrange concernant les arguments de référence nuls pour node_type. J'ai finalement trouvé la solution à cela. Fondamentalement, PHP 5.1.x a bien fonctionné avec le remplacement de 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. Pourquoi cela a été introduit, je ne sais pas. La valeur par défaut a été choisie comme 100 000. Pourquoi une valeur aussi faible? Encore une fois, aucune idée.

Un n bogue a été soulevé contre PHP 5.2.1 pour cela , qui est toujours ouvert près de deux ans plus tard .

Ce qui est horrible à ce sujet, c’est que lorsque la limite est dépassée, le remplacement vient de échouer en silence . Au moins, si une erreur avait été générée et consignée, vous auriez une idée de ce qui est arrivé, du pourquoi et de ce qu'il faut changer pour la réparer. Mais non.

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

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

Maintenant, le lecteur astucieux a peut-être remarqué que mon fichier HTML est inférieur à 100 Ko. La seule raison pour laquelle je peux deviner pourquoi je rencontre ce problème est que html2pdf effectue une conversion en xhtml dans le cadre du processus. Peut-être cela m'a-t-il pris (bien que près de 50% de gonflement semble étrange). Quel que soit le cas, ce qui précède a fonctionné.

Maintenant, html2pdf est une ressource. Mon fichier 70k prend environ 5 minutes et au moins 500 à 600 M de RAM pour créer un fichier PDF de 35 pages. Malheureusement, le téléchargement en temps réel n’est pas assez rapide (de loin) et l’utilisation de la mémoire place le rapport d’utilisation de la mémoire dans l’ordre de 1000-pour-1 (600 M de RAM pour un fichier de 70 Ko), ce qui est: tout à fait ridicule.

Malheureusement, c'est le meilleur que j'ai trouvé.

148
cletus

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

En attendant, mPDF 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 oeil à cette page: https://mpdf.github.io/ .

Des tâches très basiques autour du HTML au format PDF peuvent être effectuées avec cette bibliothèque, mais des tâches plus complexes prendront un certain temps à lire et à "comprendre" la documentation.

122
Karthick

1) utilisez MPDF !

a) extraire dans yourfolder

b) créez fichier.php dans yourfolder et insérez ce code:

<?php
include('../mpdf.php');
$mpdf=new mPDF();
$mpdf->WriteHTML('<p style="color:red;">Hallo World<br/>Fisrt sentencee</p>');
$mpdf->Output();   exit;
 ?>

c) ouvrez file.php à partir de votre navigateur




2) Utilisez pdfToHtml !

1) extrayez pdftohtml.exe dans votre dossier racine:

2) dans ce dossier, dans le fichier anyfile.php , insérez ce code (en supposant qu'il existe également un exemple source.pdf):

<?php
$source="example.pdf";
$output_fold="FinalFolder";

    if (!file_exists($output_fold)) { mkdir($output_fold, 0777, true);}
$result= passthru("pdftohtml $source $output_fold/new_filename",$log);
//var_dump($result); var_dump($log);
?>

3) entrez FinalFolder et il y aura les fichiers convertis (autant de pages que la source PDF avait ..)

68
T.Todua

Commander TCPDF . Il contient des fonctionnalités HTML à PDF qui pourraient suffire à vos besoins. C'est aussi gratuit!

55
Darryl Hein

Je suggère DocRaptor (qui utilise PrinceXML comme "moteur")

30
Oren

Juste pour cogner le fil, j'ai essayé DOMPDF et cela a fonctionné parfaitement. J'ai utilisé DIV et d'autres éléments de niveau bloc pour tout positionner. Je l'ai gardé strictement sous CSS 2.1 et tout s'est très bien passé.

29
Filip Dupanović

Cela a déjà été mentionné, mais je voudrais juste confirmer que mpdf est le convertisseur de HTML à pdf le plus simple, le plus puissant et le plus gratuit qui soit. Le ciel est vraiment la limite. Vous pouvez même générer des pdf de données dynamiques générées par l'utilisateur.

Par exemple, un client souhaitait un système CMS afin de pouvoir mettre à jour la liste de pistes de la musique qu'il diffusait dans son club. Ce n'était pas un problème, mais il souhaitait également que les utilisateurs puissent télécharger un fichier .pdf de la liste de lecture. Ce fichier PDF téléchargeable devait donc également être mis à jour par le cms. Grâce à mpdf, avec quelques boucles simples et des variables intercalées, je pouvais faire exactement cela. Quelque chose que je pensais me prendre des semaines me prenait littéralement des minutes.

Génial article qui m'a aidé à démarrer.

28
Starkers

Bonnes nouvelles! Snappy !!

Snappy est une très facile librairie PHP5 open source, permettant la génération de vignettes, d'instantanés ou de PDF à partir d'une URL ou d'une page HTML. Et ... il utilise le excellent ​​basé sur le webkit wkhtmltopdf

Prendre plaisir! ^ _ ^

28
Paulo Coghi

Eh bien, si vous voulez trouver une bibliothèque de conversion XHTML + CSS parfaite pour PDF, oubliez-la. C'est loin d'être possible. Parce que c'est comme trouver un navigateur parfait (moteur de rendu XHTML + CSS). En avons-nous un? IE ou FF?

J'ai eu du succès avec DOMPDF. Le fait est que vous devez modifier votre code HTML + CSS en fonction de la manière dont la bibliothèque est censée fonctionner. En dehors de cela, j'ai de très bons résultats.

Voir ci-dessous:

HTML original

Conversion de HTML en PDF

25
datasn.io

Le HTML2PDF et HTML2PS qui était mentionné à l'origine dans le message d'ouverture parlait d'un paquet 2009 avec ceci lien

Mais il y a un meilleur HTML2PDF

Il est basé sur TCPDF bien qu’il soit en partie en français.

Vous pouvez avoir des en-têtes ou des pieds de page qui se répètent sur les pages et qui ont des numéros de page et le nombre total de pages. Voir ses exemples . Je l'utilise depuis plus de trois ans et le recommande.

24
Luke Wenke

Il existe un tutoriel sur la devzone de Zend sur la génération de pdf à partir de php ( partie 1 , partie 2 ) sans aucune bibliothèque externe. Je n'ai jamais implémenté ce type de solution, mais comme tout est php, vous pourriez trouver plus flexible pour l'implémentation et le débogage.

20
yoavf

Essayez de récupérer la dernière version nocturne de dompdf - J'utilisais une version plus ancienne qui était une ressource épouvantable et qui prenait une éternité pour rendre mon pdf. Après avoir attrapé une nuit de ici .

Il n'a fallu que quelques secondes pour générer le PDF - ET il était aussi bien rendu qu'avec PrinceXML / Docraptor . On dirait qu'ils ont sérieusement optimisé le code dompdf depuis la dernière fois que je l'ai utilisé!

15
Arni J

La mention ci-dessus de Darryl Hein de TCPDF est probablement une excellente idée. Le code de Nicola Asuni est plutôt pratique et puissant. Si vous envisagez de fusionner PDF fichiers avec vos fichiers générés PDF, le seul problème est qu'il ne possède pas ces fonctionnalités. Vous devrez créer le PDF, puis le fusionner à l'aide de PDFTK de Sid Steward (www.pdflabs.com/tools/pdftk-the-pdf-toolkit/).

15
Arachnid

En termes de coût, l’utilisation d’un service Web (API) peut dans de nombreux cas être l’approche la plus judicieuse. De plus, en externalisant ce processus, vous déchargez votre propre infrastructure/back-end et, si vous utilisez un service réputé, vous assurez la compatibilité avec les normes Web, la disponibilité, les délais de traitement courts et la livraison rapide du contenu.

J'ai effectué des recherches sur la plupart des services Web actuellement sur le marché. Veuillez trouver ci-dessous les API que je pense mériter de mentionner sur ce fil, dans un ordre basé sur le rapport prix/valeur. Tous proposent des classes et des packages PHP pré-composés.

  1. pdflayer.com - Coût: $ - Qualité:
  2. docraptor.com - Coût: $$$ - Qualité:
  3. pdfcrowd.com - Coût: $$ - Qualité:

Qualité:

Avoir le moteur de haute qualité PrinceXML comme colonne vertébrale, DocRaptor offre clairement la meilleure qualité PDF, en renvoyant des documents très polis et bien convertis PDF . Cependant, le service pdflayer API est assez proche ici. Pdfcrowd ne marque pas nécessairement avec la qualité, mais avec la vitesse de traitement.

Coût:

pdflayer.com - Comme indiqué ci-dessus, l'option la plus économique ici est pdflayer.com, qui propose un plan d'abonnement entièrement gratuit pour 100 PDF et prime mensuels abonnements compris entre 9,99 $ et 119,99 $. Le prix pour 10 000 documents mensuels PDF est de 39,99 $.

docraptor.com - Offre d'une période d'essai gratuit de 7 jours. Les plans d'abonnement Premium vont de 15 à 2250 USD. Le prix pour 10 000 documents mensuels PDF est d'environ 300,00 $.

pdfcrowd.com - Offrir 100 PDF une fois gratuitement. Les plans d’abonnement Premium varient de 9 à 89 dollars. Le prix pour 10 000 documents mensuels PDF est d'environ 49,00 $.

Je les ai utilisées toutes les trois et ce texte est censé aider tout le monde à prendre une décision sans avoir à les payer toutes. Ce texte n'a pas été écrit pour approuver un seul produit et je n'ai aucune affiliation avec aucun des produits.

13
Frank

Si vous avez accès à la ligne de commande, il est possible d’utiliser PhantomJS pour créer le PDF à partir d’un URL (distant ou local). ).

Cela fonctionne vraiment bien et est une solution gratuite.

Jetez un oeil à ce exemple le script est fait pour ce problème exact.

12
chjortlund

Cette question est déjà ancienne, mais je n'ai vu personne mentionner CutyCapt alors je le ferai :)

CutyCapt

CutyCapt est un petit utilitaire de ligne de commande multiplate-forme permettant de capturer le rendu d'une page Web par WebKit dans une variété de formats vectoriels et bitmap, notamment SVG, PDF, PS, PNG, JPEG, TIFF, GIF. et BMP

11
Koen.

Je recommande TCPDF ou DOMPDF, dans cet ordre.

10
criss_ae

Je ne pense pas qu'une classe php sera la meilleure pour rendre une page xHtml avec css.

Que se passe-t-il quand une nouvelle règle CSS sort? (bientôt css 3.0 ...)

Le meilleur moyen de rendre une page html est, bien entendu, un navigateur. Firefox 3.0 pouvant "imprimer" nativement au format pdf, torisugary a développé une extension (impression en ligne de commande) pour l'utiliser. Ici vous le trouverez.

Quoi qu’il en soit, il reste encore de nombreux problèmes à exécuter firefox en tant que convertisseur de pdf ...

Pour le moment, je pense que wkhtmltopdf est le meilleur (c'est celui utilisé par le navigateur Safari), rapide, rapide, génial. Oui, opensource également ... donnez-lui un coup d'oeil

9
Strae

Vous pourriez peut-être essayer d’utiliser Tidy avant de remettre le fichier au convertisseur. Si l'un des moteurs de rendu étouffe un problème HTML (comme une balise non fermée), cela pourrait aider.

9
PhiLho

J'ai développé une API publique pour construire PDF fichiers à partir de pages Web. Il a une belle classe de clients PHP qui le rend super facile à utiliser. Il utilise wkhtmltopdf pour rendre le PDF dans le nuage.

Pas besoin de quelque chose de spécial dans le HTML. Pas besoin d'URL absolues dans les liens images/css/js. Fonctionne aussi sur localhost (dev machine).

Actuellement, le service a des points d'extrémité dans 4 régions Azure: Est des États-Unis, Ouest des États-Unis, Nord de l'UE et Asie du Sud-Est.

C'est rapide, car il utilise un protocole propriétaire pour envoyer le contenu de la page Web à l'API afin de le convertir au format PDF.

C'est fiable car tous les ordinateurs d'extrémité sont équilibrés en charge.

Compte gratuit disponible pour des tests ou une faible utilisation. Détails sur le site web:

https://rotativahq.com

9
Giorgio Bozio

Bien que de nombreuses solutions soient déjà proposées, je recommande les deux suivantes:

  1. HTM2PDF - offre une API pour convertir HTML en PDF et dispose également d'un SDK PHP, ce qui facilite grandement son implémentation en PHP; Il offre un choix d'emplacements de serveurs en Europe, en Asie et aux États-Unis.
  2. PDFmyURL - propose une API qui gère également les URL et HTML vers PDF, avec à peu près les mêmes fonctionnalités que HTM2PDF, mais qui fonctionne sur un paysage équilibré en charge et qui existe depuis un peu plus longtemps.

La différence entre ces deux API et toutes les solutions mentionnées précédemment est que, outre la conversion de HTML en PDF avec CSS et JavaScript, il offre également PDF la gestion des droits, le tatouage et le cryptage. . C'est donc une solution tout-en-un pour ceux qui veulent se mettre au travail.

Disclaimer: Je travaille pour Kaiomi, une société qui exploite ces deux sites.

7
user1914292

Un bon rendu ne veut rien dire. Est-ce que ça valide?

Tous les navigateurs font de leur mieux pour afficher quelque chose à l'écran, quelle que soit la qualité de la saisie. Et bien sûr, ils ne font pas la même chose. Si vous souhaitez obtenir le même rendu que FireFox, vous pouvez utiliser son moteur de rendu. Il existe des générateurs pdf pour cela. C'est beaucoup de travail, cependant.

7
Stephan Eggermont

TCPDF fonctionne bien, pas de dépendances, il est gratuit et corrige constamment. Il a une vitesse raisonnable si le contenu HTML/CSS fourni est bien formulé. Je génère normalement de 50 à 300 Ko d’entrée HTML (CSS comprise) et j’ai la sortie PDF dans un délai de 1 à 3 secondes avec 10 à 15 PDF pages.

Je recommande fortement d'utiliser la bibliothèque tidy comme formatage HTML avant d'envoyer quoi que ce soit à TCPDF.

5
lubosdz

La conversion HTML en PDF _ a-t-elle vraiment besoin de se produire côté serveur à l'aide de PHP?

Je viens de tomber sur jsPDF , une solution côté client utilisant HTML5/JavaScript. La licence MIT le code est sur GitHub , aussi.

5
Oliver Schafeld

J'ai essayé beaucoup de bibliothèques différentes pour PHP. Tous les énumérés, j'ai essayé. À mon avis TCPDF la bibliothèque est le meilleur compromis performance/convivialité. C’est très simple à installer et à utiliser, ainsi que de bonnes performances dans les applications de taille moyenne. Si vous avez besoin de hautes performances et d'un très grand document PDF, utilisez le module Zend_PDF , mais préparez-vous à coder de manière rigoureuse!

4
trullallero

API Web

S'il y a des gens qui recherchent toujours ce genre de choses, il existe un site Web gratuit qui vous permet de convertir le code HTML et les pages en pdf. Il existe également une (très petite) API qui vous permet d’obtenir un fichier pdf à partir de l’URL.

Vérifiez ici

3
Superdrac

pas PHP, mais une bibliothèque Java , qui fait la chose:

Flying Saucer utilise XML ou XHTML et lui applique des feuilles de style conformes à CSS 2.1 afin de permettre le rendu au format PDF.

Il est utilisable à partir de PHP via system() ou un appel similaire. Bien que cela nécessite XML la bonne forme de la input.

2
Ivan Kurmanov