web-dev-qa-db-fra.com

Comment automatiser les conversions HTML en PDF?

J'utilise htmldoc depuis un certain temps, mais j'ai rencontré des limitations assez sérieuses. J'ai besoin de la solution finale pour travailler sur une box Linux. J'appellerai cette bibliothèque/utilitaire/application à partir d'une application Perl, donc toutes les interfaces Perl seraient un bonus.

44
lennysan

PrinceXML est le meilleur que j'ai vu (il analyse le HTML régulier ainsi que XML/XHTML). Comment est-ce le mieux? Eh bien, il passe le test acid2 ce que je pensais était sacrément impressionnant

C'est cependant assez cher

9
Orion Edwards

Désolé de dénicher cet ancien article, mais il est apparu en premier dans ma recherche du meilleur outil de conversion HTML/PDF. Sous Linux wkhtmltopdf est très bon (prend en compte CSS, entre autres) et GPL.

65
Alexandre

WeasyPrint produit de jolis PDF avec du texte et des hyperliens sélectionnables.

weasyprint input.html output.pdf

Si vous utilisez wkhtmltopdf à la place, essayez les options suivantes:

wkhtmltopdf --margin-bottom 20mm --margin-top 20mm --minimum-font-size 16 ...
17
sudoman

Mise à jour 2019-05

L'ensemble du processus a heureusement été emballé dans une image docker par TheCodingMachine: https://github.com/thecodingmachine/gotenberg

Cela rend la maintenance et l'utilisation de la génération de fichiers PDF basés sur chrome dans des environnements de production vraiment fluides et sans hazzle.


Il y a un nouveau mode sans tête depuis Chrome 59. Comme toutes les autres solutions ont vraiment du mal avec les fonctionnalités CSS plus récentes (ou pas si nouvelles) comme flexbox, c'était dans mon cas la seule solution pour produire un bon PDF sortie.

Pour créer un pdf à partir d'un fichier html local, utilisez simplement la commande suivante: chrome --headless --disable-gpu --print-to-pdf file:///path/to/myfile.html.

Pour Mac OS, remplacez chrome par /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome.

Le seul inconvénient que j'ai remarqué jusqu'à présent est que (actuellement) vous ne pouvez pas passer le code HTML via stdin, mais la création d'un fichier temporaire n'est pas vraiment un problème.

Pour plus d'informations, voir https://developers.google.com/web/updates/2017/04/headless-chrome#create_a_pdf_dom

Mise à jour: Il s'avère que les gars chrome fourniront très probablement une sorte de module de noeud pour cette tâche, ce qui finirait par déprécier le mode sans tête ( https://bugs.chromium.org/p/chrome/issues/detail? id = 719921 ).

Le meilleur pari serait d'utiliser l'approche basée sur les nœuds en utilisant le module marionnettiste comme indiqué sous https://developers.google.com/web/updates/2017/04/headless-chrome#node et imprimer la page via la commande Page.printToPDF, qui permet également une configuration supplémentaire.

Bien sûr, vous pouvez également vous connecter à la prise Web de la console de débogage à partir de tout autre environnement que le nœud (c'est-à-dire le script PHP).

9
Roben

J'ai fait un peu de recherche sur Google et j'ai proposé deux options. Il y a peut-être plus, ma stratégie Google consistait à essayer "pdf en ligne de commande webkit" et "pdf en ligne de commande gecko", essentiellement à la recherche de programmes en ligne de commande qui incorporent les deux moteurs de rendu open source populaires dans les moteurs de rendu en ligne de commande. Voici ce que j'ai trouvé:

imprimante en ligne de commande Firefox - sorties en pdf et png

wkpdf - bien que ce soit pour mac, c'est probablement assez portable.

7
bmdhacks

Je ne dirai pas que c'est la "meilleure" solution mais c'est "une" solution que j'ai utilisée.

Entrée HTML -> HTML 2 PS -> PS 2 PDF -> PDF Output

3
Declan Shanaghy

Une solution alternative à laquelle on n'a pas répondu ici consiste à utiliser une API.

Leur avantage est que vous externalisez les ressources nécessaires pour le travail et disposez d'un service à jour qui implémente les fonctionnalités récentes (pas besoin de mettre à jour le code ou d'installer des corrections de bugs).

Par exemple, avec PDFShift , vous pouvez le faire avec une seule demande POST sur:

POST https://api.pdfshift.io/v2/convert/

Et en passant le "source" (soit une URL soit un code HTML brut), et vous obtiendrez un PDF en binaire. (Avertissement: je travaille chez PDFShift).

Voici un exemple de code en Python:

import requests

response = requests.post(
    'https://api.pdfshift.io/v2/convert/',
    auth=('user_api_key', ''),
    json={"source": "https://en.wikipedia.org/wiki/PDF", "landscape": False, "use_print": False}
)

response.raise_for_status()

with open('wikipedia.pdf', 'wb') as f:
    f.write(response.content)

Et votre PDF sera situé à ./wikipedia.pdf

1
Cyril N.

Vous devriez jeter un œil à http://phantomjs.org/

La conversion peut être effectuée par un petit script rasterize.js puis en émettant

phantomjs rasterize.js 'http://en.wikipedia.org/w/index.php?title=Jakarta&printable=yes' jakarta.pdf
1
MrTux

Ce serait exagéré, mais vous pouvez télécharger et installer mirth . Il s'agit d'un moteur de routage de messages, mais il a la capacité de convertir du HTML en PDF, vous pouvez donc le configurer pour récupérer un fichier HTML dans un dossier, convertir en PDF et déposer le PDF dans le même dossier ou dans un autre. Comme je l'ai dit, exagéré, un peu de courbe d'apprentissage, mais c'est gratuit, et Java pour que vous puissiez l'exécuter sur linux si vous le souhaitez. Et tout ce que votre application Perl aurait à faire est de laisser tomber le html dans un fichier.

1
Jeremy

J'ai trouvé Electroshot pour soutenir les fonctionnalités CSS modernes, en particulier la mise en page. C'était après avoir lutté avec wkhtmltopdf montrant son âge en ne supportant pas des choses comme CSS .

De la description des fonctionnalités d'Electroshot:

Electroshot utilise Electron, qui offre la version stable la plus récente de Chrome (plutôt que celle d'il y a des années); cela signifie que les pages s'affichent comme elles le feraient dans un navigateur ...

J'ai pu utiliser Bootstrap 4 pour concevoir une page, puis utiliser Electroshot pour rendre un PDF ressemblant très étroitement au HTML/CSS.

0
Micah Elliott