script Convertir HTML+CSS en PDF avec PHP?




php to pdf github (24)

Ok, je me tape la tête contre un mur de briques avec celui-ci.

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 au format 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 : J'ai vraiment eu 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 Htmldoc sur HTML de base mais n'a presque aucun support pour CSS, donc vous devez tout faire en HTML (je n'avais pas réalisé 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.

Je ne peux vraiment pas croire que je suis coincé. Est-ce que je manque quelque chose?


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

Tous les navigateurs font de leur mieux pour montrer quelque chose à l'écran, peu importe la qualité de l'entrée. Et bien sûr, ils ne font pas la même chose. Si vous voulez le même rendu que FireFox, vous pouvez utiliser son moteur de rendu. Il y a des générateurs de pdf pour cela. C'est énormément de travail, cependant.


J'ai essayé beaucoup de bibliothèques différentes pour PHP. Toutes les listes j'ai essayé. À mon avis, la bibliothèque TCPDF est la meilleure performance / facilité d'utilisation. Il est très simple à installer et à utiliser, ainsi que de bonnes performances en petite application moyenne. Si vous avez besoin de hautes performances et de très gros documents PDF, utilisez le module Zend_PDF , mais préparez-vous à coder fort!


Jetez un oeil à wkhtmltopdf . Il est open source, basé sur webkit et gratuit.

Nous avons écrit un petit tutoriel here .

EDIT (2017):

Si c'était pour construire quelque chose aujourd'hui, je ne suivrais plus cette route.
Mais utiliserait http://pdfkit.org/ place.
Il est probablement dépouillé de toutes ses dépendances nodejs, pour s'exécuter dans le navigateur.


En termes de coût, l'utilisation d'un service web (API) peut dans de nombreux cas être l'approche la plus sensée. De plus, en externalisant ce processus, vous déchargez votre propre infrastructure / backend et, à condition d'utiliser un service fiable, vous vous assurez de la compatibilité avec les standards Web, la disponibilité, les délais de traitement courts et la livraison rapide du contenu.

J'ai fait quelques recherches sur la plupart des services web actuellement sur le marché, veuillez trouver ci-dessous les API que je pense méritent d'être mentionnées sur ce sujet, dans un ordre basé sur le rapport prix / valeur. Tous offrent 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é:

Ayant le moteur de haute qualité PrinceXML comme colonne vertébrale, DocRaptor offre clairement la meilleure qualité PDF, en renvoyant des documents PDF hautement polis et bien convertis. Cependant, le service d' API pdflayer 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 rentable ici est pdflayer.com, offrant un plan d'abonnement entièrement gratuit pour 100 PDF mensuels et des abonnements premium allant de 9,99 $ à 119,99 $. Le prix pour 10 000 documents PDF mensuels est de 39,99 $.

docraptor.com - Offrant une période d'essai gratuite de 7 jours. Les abonnements Premium vont de 15 à 2250 USD. Le prix pour 10 000 documents PDF mensuels est ~ 300,00 $.

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

Je les ai tous les trois utilisés et ce texte est supposé aider quelqu'un à décider sans avoir à payer pour tous. Ce texte n'a pas été écrit pour endosser un produit et je n'ai aucune affiliation avec aucun des produits.


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

CutyCapt

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


Après une enquête et un tirage général, la solution semble être HTML2PDF . DOMPDF fait un travail terrible avec des tables, des bordures 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 retourner à 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.

Un bug a été soulevé contre PHP 5.2.1 pour cela , 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 remplacement échoue tout simplement 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é.


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

Par exemple, un client voulait un système de gestion de contenu (CMS) pour pouvoir mettre à jour la liste des morceaux qu'il a joués dans son club. Ce n'était pas un problème, mais il voulait aussi que les utilisateurs puissent télécharger un fichier .pdf de la liste de lecture, et donc ce fichier PDF téléchargeable a dû être mis à jour par les cms aussi. Merci à mpdf, avec quelques boucles simples et des variables intercalées je pourrais faire exactement cela. Quelque chose que je pensais me prendre des semaines m'a littéralement pris des minutes.

Télécharger la page

Super article qui m'a aidé à démarrer.


API Web

S'il y a des gens qui cherchent toujours ce genre de choses, il y a un site gratuit qui vous permet de convertir le code html et les pages en pdf. Il y a aussi une (très petite) API qui vous permet d'obtenir un fichier pdf depuis l'URL.

Vérifiez-le ici


1) utilisez MPDF !

a) extraire dans votre yourfolder

b) créez file.php dans votre 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 le fichier file.php depuis votre navigateur




2) Utilisez pdfToHtml !

1) extraire pdftohtml.exe dans votre dossier racine:

2) à l'intérieur de ce dossier, dans le fichier anyfile.php , mettez ce code (en supposant, il y a aussi une source example.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, comme le PDF source avait ..)


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


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


Bonnes nouvelles! Snappy !!

Snappy est une bibliothèque PHP5 open source très simple , 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 l' excellent wkhtmltopdf basé sur wkhtmltopdf

Prendre plaisir! ^ _ ^


J'utilise fpdf pour produire des fichiers pdf en utilisant php. Cela fonctionne bien pour moi jusqu'à maintenant pour produire des sorties simples.


Si vous avez accès à la ligne de commande, il est possible d'utiliser PhantomJS pour créer le PDF partir d'une URL (distante ou locale).

Cela fonctionne très bien et c'est une solution gratuite.

Jetez un oeil à cet github.com/ariya/phantomjs/blob/master/examples/rasterize.js script fait pour ce problème exact.


Le HTML2PDF et HTML2PS qui a été initialement mentionné dans le post d'ouverture parlait d'un paquet 2009 avec ce lien maintenant brisé

Mais il y a un meilleur HTML2PDF

Il est basé sur TCPDF bien qu'il soit partiellement en français.

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


Essayez de saisir la dernière version de dompdf en nocturne - j'utilisais une version plus ancienne qui était un piège de ressources terrible et qui m'a pris une éternité pour rendre mon pdf. Après avoir attrapé une nuit d' here .

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


Est-ce que la conversion HTML en PDF doit vraiment se produire côté serveur en utilisant PHP?

Je viens de rencontrer jsPDF , une solution côté client utilisant HTML5 / JavaScript. Le code sous licence MIT est également sur GitHub .


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

Flying Saucer prend du XML ou du XHTML et y applique des feuilles de style compatibles CSS 2.1, afin de les rendre au format PDF

Il est utilisable depuis PHP via system() ou un appel similaire. Bien qu'il nécessite XML bien formé de l' input .


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


J'ai développé une API publique pour construire des fichiers PDF à partir de pages Web. Il a une belle classe de client PHP qui le rend très 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 sur localhost (machine de dev) aussi.

Actuellement, le service a des points de terminaison dans 4 régions d'Azur: US Est, US Ouest, EU Nord, Asie du Sud-Est.

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

C'est fiable parce que tous les points de terminaison sont équilibrés.

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

https://rotativahq.com


Pourquoi n'essayez-vous 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.


TCPDF fonctionne très bien, pas de dépendances, est gratuit et constamment corrigé. Il a une vitesse raisonnable si le contenu HTML / CSS fourni est bien formaté. Je génère normalement de 50 à 300 Ko d'entrée HTML (y compris CSS) et j'obtiens une sortie PDF en 1 à 3 secondes avec 10 à 15 pages PDF.

Je recommande fortement d'utiliser la bibliothèque tidy comme HTML joli formateur avant d'envoyer quelque chose à TCPDF.


Bien qu'il existe déjà de nombreuses solutions, je recommande les deux suivantes:

  1. HTM2PDF - offre une API pour convertir HTML en PDF et dispose également d'un SDK PHP, ce qui le rend très facile à implémenter en PHP; Il offre un choix d'emplacements de serveurs en Europe, en Asie et aux États-Unis.
  2. PDFmyURL - offre une API qui fait aussi bien l'URL et le HTML au format PDF, avec à peu près les mêmes fonctionnalités que HTM2PDF, mais qui fonctionne sur un paysage à charge équilibrée et a été un peu plus longue

Ce qui différencie ces deux API de toutes les solutions mentionnées précédemment, c'est que - outre la conversion de HTML en PDF avec CSS et JavaScript - il offre également la gestion des droits PDF, le filigranage et le cryptage. C'est donc une solution tout-en-un pour ceux qui veulent démarrer.

Disclaimer: Je travaille pour Kaiomi, une entreprise qui exploite ces deux sites.


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

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

La meilleure façon de rendre une page html est, visiblement, un navigateur. Firefox 3.0 peut nativement 'imprimer' en format pdf, torisugary a développé une extension (impression en ligne de commande) pour l'utiliser. Ici vous le trouverez.

De toute façon, il y a encore beaucoup de problèmes runninr firefox tout comme un convertisseur 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 aussi ... wkhtmltopdf





pdf-generation