Question Convertir HTML + CSS en PDF avec PHP? [fermé]


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

Je suis maintenant après une façon 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 de consommer jusqu'à 128M de mémoire puis de mourir - c'est ma limite de mémoire dans php.ini) mais ça fait un désordre complet de tables et ça ne semble pas arriver images. Les tables étaient juste des trucs de base avec des styles de bordure pour ajouter des lignes à différents points;
  • HTML2PDF et HTML2PS: En fait, j'avais plus de chance avec ça. Il a rendu certaines des images (toutes les images sont des URL Google Maps) et le formatage de la table était bien meilleur mais il semblait avoir un problème de complexité que je n'ai pas encore compris et qui continue de mourir avec des erreurs node_type () inconnues. Je ne sais pas où aller d'ici; et
  • Htmldoc: cela semble fonctionner correctement sur le HTML de base mais n'a quasiment aucun support pour le CSS, donc vous devez tout faire en HTML (je ne me rendais pas compte que c'était encore en 2001 dans Htmldoc-land ...) donc c'est inutile pour moi.

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

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


1395


origine


Réponses:


Important: S'il vous plaît noter que cette réponse a été écrite en 2009 et il pourrait ne pas être la solution la plus rentable aujourd'hui en 2018. Alternatives en ligne comme PDFShift sont mieux aujourd'hui à ce qu'ils ne l'étaient à l'époque.


Jettes un coup d'oeil à PrinceXML.

C'est certainement le meilleur convertisseur HTML / CSS en PDF, bien qu'il ne soit pas gratuit (Mais bon, votre programmation n'est peut-être pas gratuite non plus, donc si vous économisez 10 heures de travail, vous êtes libre à la maison (puisque vous devez aussi tenez compte du fait que les solutions alternatives exigeront que vous installiez un serveur dédié avec le bon logiciel)

Ah oui, ai-je mentionné que c'est la première (et probablement la seule) solution HTML2PDF qui complète ACID2 ?

Échantillons PrinceXML


442



Jettes un coup d'oeil à 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 suivrais plus cette route.
Mais utiliserait http://pdfkit.org/ au lieu.
Il est probablement dépouillé de toutes ses dépendances nodejs, pour s'exécuter dans le navigateur.


627



Après une enquête et un coup de poing général, la solution semble être HTML2PDF. DOMPDF fait un travail terrible avec des tableaux, des frontières et même une mise en page modérément complexe et htmldoc semble raisonnablement robuste mais est presque complètement ignorant CSS et je ne veux pas revenir à la mise en page HTML sans CSS juste pour ce programme.

HTML2PDF a semblé le plus prometteur mais j'ai gardé cette erreur bizarre au sujet des arguments de référence null à node_type. J'ai finalement trouvé la solution à cela. Fondamentalement, PHP 5.1.x fonctionnait bien avec les remplacements de regex (preg_replace_ *) sur les 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 chaîne pour laquelle la correspondance est faite. Pourquoi cela a été introduit, je ne sais pas. La valeur par défaut a été choisie comme 100 000. Pourquoi une si faible valeur? Encore une fois, aucune idée.

UNE bug a été soulevé contre PHP 5.2.1 pour cette, qui est toujours ouvert presque deux ans plus tard.

Ce qui est horrifiant à ce sujet est que lorsque la limite est dépassée, le remplacer juste échoue silencieusement. Au moins, si une erreur avait été soulevée et enregistrée, vous auriez une indication de ce qui s'est passé, pourquoi et quoi changer pour le réparer. Mais non.

J'ai donc un fichier HTML 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 c'est OK
  • memory_limit = 1024M; # Oui, un gigaoctet; et
  • max_execution_time = 600; # Oui, 10 minutes.

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

Maintenant, html2pdf est un porc 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. Pas assez rapide (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 de l'ordre de 1000 à 1 (600M de RAM pour un fichier de 70k), ce qui est totalement ridicule.

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


141



Pourquoi n'essaies-tu pas mPDF version 2.0? Je l'ai utilisé pour créer un document PDF. Ça fonctionne bien.

Pendant ce temps, mPDF est à la version 5.7 et il est activement maintenu, contrairement à HTML2PS / HTML2PDF

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

Des tâches très élémentaires autour de html en pdf, peuvent être faites avec cette bibliothèque, mais des tâches plus complexes prendront du temps à lire et à "comprendre" la documentation.


115



1) utilisation MPDF !

a) extraire yourfolder

b) créer file.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) ouvert file.php depuis votre navigateur






2) Utilisation pdfToHtml !

1) extrait pdftohtml.exe dans votre dossier racine:

2) dans ce dossier, dans anyfile.php fichier, mettre ce code (en supposant, il y a une source example.pdf aussi):

<?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, comme le PDF source avait ..)


60



Check-out TCPDF. Il a quelques fonctionnalités HTML au format PDF qui pourraient suffire à ce dont vous avez besoin. C'est aussi gratuit!


51



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


29



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 de bloc pour positionner tout, gardé strictement CSS 2.1 et il a joué bien veru.


25



Bonnes nouvelles! Snappy!!

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

Prendre plaisir! ^ _ ^


24



Eh bien, si vous voulez trouver une bibliothèque de convertisseur XHTML + CSS en PDF parfaite, oubliez-le. 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 un certain succès avec DOMPDF. La chose est que vous devez modifier votre code HTML + CSS pour aller avec la façon dont la bibliothèque est censée fonctionner. A part ça, j'ai de très bons résultats.

Voir ci-dessous:

HTML d'origine

Conversion de HTML en PDF


22