Conversion de fichiers HTML en PDF [fermé]

128

J'ai besoin de générer automatiquement un fichier PDF à partir d'un document HTML (X) existant. Les fichiers d'entrée (rapports) utilisent une mise en page plutôt simple, basée sur des tableaux, donc la prise en charge de trucs JavaScript / CSS vraiment sophistiqués n'est probablement pas nécessaire.

Comme je suis habitué à travailler en Java, une solution qui peut facilement être utilisée dans un projet java est préférable. Cependant, il ne doit fonctionner que sur les systèmes Windows.

Une façon de le faire qui est faisable, mais qui ne produit pas une sortie de bonne qualité (du moins prête à l' emploi ) consiste à utiliser CSS2XSLFO et Apache FOP pour créer les fichiers PDF. Le problème que j'ai rencontré était que, bien que les attributs CSS soient bien convertis, la mise en page du tableau est assez foirée, avec du texte sortant de la cellule du tableau.

J'ai également jeté un coup d'œil à Jrex, une API Java permettant d'utiliser le moteur de rendu Gecko.

Existe-t-il peut-être un moyen de récupérer la page rendue à partir du moteur de rendu d'Internet Explorer et de l'envoyer automatiquement à un outil d'impression PDF? Je n'ai aucune expérience de la programmation OLE sous Windows, donc je n'ai aucune idée de ce qui est possible et de ce qui ne l'est pas.

Avez-vous une idée?

Panschk
la source
3
J'ai récemment créé un docbag de bibliothèque Java qui peut convertir du xhtml en documents pdf. La version actuelle n'est pas quelque chose d'avancé, mais si vos modèles xhtml sont simples, cette bibliothèque peut être utile.
Jakub Torbicki
Je pense que la solution consiste à utiliser les capacités des navigateurs pour effectuer la traduction. Voir stackoverflow.com/q/25574082/39998
David Hofmann
Je suis coincé avec la génération de pdf à partir d'un html qui contient des lettres cyrilliques. Tout va bien sauf les lettres cyrilliques qui sont omises. Quelqu'un qui a ce genre de problème?
Kristijan Iliev du
@krisiliev: J'ai eu des problèmes similaires, et pour autant que je me souvienne, la police utilisée était très importante. La plupart des polices ne prennent pas en charge les caractères UTF8 complets, mais les éléments suivants devraient: 'font-family: Arial Unicode MS;' (CSS). Assurez-vous également d'utiliser le bon encodage (je conseillerais de toujours utiliser UTF-8)
panschk
2
ce lien m'a aidé hmkcode.com/itext-html-to-pdf-using-java
Mateen

Réponses:

73

Le projet de rendu Flying Saucer XHTML prend en charge la sortie de XHTML au format PDF. Jetez un œil à un exemple ici .

marque
la source
20
Le vrai problème avec Flying Sauser est qu'il utilise itext pour rendre le PDF, qui est une bibliothèque sous licence AGPL v3
David Hofmann
11
La version d'itext utilisée par Flying Saucer est la 2.0.8 qui était disponible sous LGPL. Seuls les numéros de version 5 ou supérieurs sont sur la licence la plus restrictive. stackoverflow.com/questions/2692000/…
Gary
8
Je dirais que le vrai problème avec Flying Saucer est qu'il nécessite un document XML bien formé et valide. Il est facile de briser involontairement le rendu PDF en incluant quelque chose comme une esperluette dans votre HTML, ou un code javascript qui rend votre HTML rendu non XHTML strict. Bien que cela puisse être atténué avec des tests automatisés ou un processus impliquant une validation XML.
SteveT
3
@LateralFractal Autant que je sache, Flying Saucer 9.0.8 (la dernière version, je pense) utilise iText 2.1.7, qui est la dernière version iText avec une licence permissive --- LGPL. mvnrepository.com/artifact/org.xhtmlrenderer/flying-saucer-pdf/…
Jonathan Crosmer
2
@JonathanCrosmer Ouais. Il existe deux packages FlyingSaucer pour PDF, un pour iText v2 et un pour iText v5. En supposant que les deux ont des fonctionnalités égales; le risque AGPL peut être écarté.
LateralFractal
49

Avez-vous essayé WKHTMLTOPDF ?

C'est un simple utilitaire shell, une implémentation open source de WebKit. Les deux sont gratuits.

Nous avons mis en place un petit tutoriel ici

MODIFIER (2017):

Si c'était pour construire quelque chose aujourd'hui, je n'irais plus dans cette voie.
Mais utiliserait plutôt http://pdfkit.org/ .
Probablement le dépouillant de toutes ses dépendances nodejs, pour l'exécuter dans le navigateur.

Micro
la source
16
Pour une conversion html-page-pdf, c'est mieux que tout ce que j'ai vu, gratuit ou commercial.
MGOwen
Fonctionne-t-il sur un non Mac OS?
Eran Medan
1
@Eran, nous l'utilisons sous Linux. Je pense qu'il y a aussi une version Windows
Mic
1
@Mic Oui, il existe également une version Windows.
Viccari
testé sur Windows XP (version 0.9.9) et fonctionne très bien. En outre, ne nécessite pas de droits d'administrateur sur la machine pour l'installation.
Christopher Mahan
44

Découvrez iText ; c'est une boîte à outils Java PDF pure qui prend en charge la lecture de données à partir de HTML. Je l'ai utilisé récemment dans un projet lorsque je devais extraire du contenu de notre CMS et l'exporter sous forme de fichiers PDF, et tout était plutôt simple. La prise en charge des balises CSS et de style est assez limitée, mais elle rend les tableaux sans aucun problème (je n'ai jamais réussi à définir la largeur de la colonne).

La création d'un PDF à partir de HTML ressemble à ceci:

Document doc = new Document(PageSize.A4);
PdfWriter.getInstance(doc, out);
doc.open();
HTMLWorker hw = new HTMLWorker(doc);
hw.parse(new StringReader(html));
doc.close();
fred-o
la source
9
C'est AGPL, semble encore pire que GPL, vous devez être open source même si vous ne faites que servir le PDF et iText est côté serveur.
Eran Medan
10
@Eran, utilisez simplement la dernière version non AGPL (com.lowagie: itext: 2.1.7 dans Maven).
Nowaker
1
HTMLWorker est obsolète dans les nouvelles versions d'IText au profit de XMLWorker; cependant le support CSS est médiocre dans les deux cas (voir demo.itextsupport.com/xmlworker/itextdoc/… ) et n'était pas adapté à mes besoins. Au contraire Flying Saucer était parfait.
Pino
Vous pouvez utiliser la version LGPL qui se trouve sur github.com/albfernandez/itext2
Vladimir Rozhkov
4

Si vous avez le financement, rien ne vaut Prince XML comme le montre cette vidéo

Ólafur Waage
la source
1
Si vous recherchez une alternative moins chère à Prince, essayez DocRaptor.com. Il utilise Prince comme moteur.
Julie
Et si vous voulez moins cher, mais avec plus d'options, essayez htm2pdf.co.uk - il utilise le webkit et les utilisateurs réels WYSIWIG
user1914292
3

Existe-t-il peut-être un moyen de récupérer la page rendue à partir du moteur de rendu d'Internet Explorer et de l'envoyer automatiquement à un outil d'impression PDF?

Voici comment ActivePDF fonctionne , ce qui signifie que vous savez ce que vous obtiendrez et qu'il a en fait un support de style raisonnable.

C'est aussi l'un des rares packages que j'ai trouvés (en regardant il y a quelques années) qui prend en charge les différentes commandes CSS de saut de page.


Malheureusement, le logiciel ActivePDF est très frustrant - puisqu'il doit lancer le navigateur IE en arrière-plan pour les conversions, il peut être assez lent, et il n'est pas particulièrement stable non plus.

Il existe actuellement une nouvelle version en version bêta qui est censée être bien meilleure, mais je n'ai pas vraiment eu l'occasion de l'essayer, donc je ne sais pas à quel point il s'agit d'une amélioration.

Peter Boughton
la source
Merci pour la réponse utile. Je ne pense pas qu'ActivePDF soit vraiment adapté à cause du prix, mais il est bon de savoir que quelque chose comme ça existe.
panschk
API HTML vers PDF de GrabzIt : grabz.it/html-to-pdf-image-api.aspx Fonctionne de la même manière qu'il rend le HTML dans un navigateur, puis crée le PDF, ce qui garantit des conversions PDF beaucoup plus précises.
user1474090
2

Vous pouvez utiliser un firefox sans tête avec une extension. C'est assez ennuyeux de courir mais cela donne de bons résultats.

Consultez cette réponse pour plus d'informations.

Rojoca
la source
Cela ne ressemble pas à une solution très évolutive si l'on a besoin de convertir des pages à la volée en pdf en parallèle. Si quelques requêtes aboutissent à une conversion en utilisant FF, votre serveur aura perdu quelques GIG de mémoire juste pour servir quelques pages converties. Cela ouvrirait votre serveur à un DOS.
mP.
Mieux mais similaire: github.com/ariya/phantomjs/wiki/Screen-Capture (selon we-love-php.blogspot.com/2012/12/ ... le pdf contient du texte réel, non rastérisé)
nafg
0

Si vous regardez la barre latérale de votre question, vous verrez de nombreuses questions connexes ...

Dans votre contexte, la méthode la plus simple pourrait être d'installer un pilote d'impression PDF comme PDFCreator et d'imprimer simplement la page sur cette sortie.

PhiLho
la source
En quoi est-ce une solution Java? Ceci est un pilote d'impression Windows.
Gris
L'OP mentionnait explicitement Windows. Et je suppose qu'il existe des pilotes similaires pour d'autres systèmes. L'OP n'a mentionné Java que comme une solution possible ...
PhiLho
0

Amyuni WebkitPDF peut être utilisé avec JNI pour une solution Windows uniquement. Il s'agit d'une bibliothèque de conversion HTML vers PDF / XAML, gratuite pour un usage commercial et non commercial.

Si les fichiers de sortie ne sont pas nécessaires immédiatement, pour une meilleure évolutivité, il peut être préférable d'avoir une file d'attente et quelques processus d'arrière-plan prenant des éléments à partir de là, les convertissant et les stockant ensuite sur la base de données ou le système de fichiers.

la clause de non-responsabilité habituelle s'applique

yms
la source