Konvertieren von HTML-Dateien in PDF [geschlossen]

128

Ich muss automatisch eine PDF-Datei aus einem vorhandenen (X) HTML-Dokument generieren. Die Eingabedateien (Berichte) verwenden ein recht einfaches, tabellenbasiertes Layout, sodass die Unterstützung für wirklich ausgefallene JavaScript / CSS-Inhalte wahrscheinlich nicht erforderlich ist.

Da ich es gewohnt bin, in Java zu arbeiten, ist eine Lösung vorzuziehen, die leicht in einem Java-Projekt verwendet werden kann. Es muss jedoch nur auf Windows-Systemen funktionieren.

Eine Möglichkeit, die machbar ist, aber keine Ausgabe von guter Qualität liefert (zumindest nicht sofort einsatzbereit ), ist die Verwendung von CSS2XSLFO und Apache FOP zum Erstellen der PDF-Dateien. Das Problem, auf das ich gestoßen bin, war, dass CSS-Attribute zwar gut konvertiert werden, das Tabellenlayout jedoch ziemlich durcheinander ist und Text aus der Tabellenzelle fließt.

Ich habe mir auch Jrex angesehen, eine Java-API zur Verwendung der Gecko-Rendering-Engine.

Gibt es möglicherweise eine Möglichkeit, die gerenderte Seite aus der Rendering-Engine des Internet Explorers abzurufen und automatisch an ein PDF-Drucker-Tool zu senden? Ich habe keine Erfahrung in der OLE-Programmierung in Windows, daher habe ich keine Ahnung, was möglich ist und was nicht.

Haben sie eine Idee?

panschk
quelle
3
Ich habe kürzlich eine Java-Bibliothek docbag erstellt , die xhtml in pdf-Dokumente konvertieren kann. Die aktuelle Version ist nicht fortgeschritten, aber wenn Ihre xhtml-Vorlagen einfach sind, kann diese Bibliothek nützlich sein.
Jakub Torbicki
Ich denke, der Weg ist, die Browserfunktionen für die Übersetzung zu verwenden. Siehe stackoverflow.com/q/25574082/39998
David Hofmann
Ich bin fest entschlossen, PDF aus einem HTML-Code zu generieren, der kyrillische Buchstaben enthält. Alles ist in Ordnung, außer kyrillischen Buchstaben, die weggelassen werden. Wer hat dieses Problem?
Kristijan Iliev
@krisiliev: Ich hatte ähnliche Probleme und soweit ich mich erinnern kann, war die verwendete Schriftart sehr wichtig. Die meisten Schriftarten unterstützen keine vollständigen UTF8-Zeichen, aber die folgenden sollten: 'Schriftfamilie: Arial Unicode MS;' (CSS).
Stellen Sie
2
Dieser Link
Mateen

Antworten:

73

Das Flying Saucer XHTML-Renderer-Projekt unterstützt die Ausgabe von XHTML als PDF. Schauen Sie sich hier ein Beispiel an .

Kennzeichen
quelle
20
Das eigentliche Problem mit fliegenden Wurst ist, dass es itext verwendet, um PDF zu rendern, eine AGPL v3 lizenzierte Bibliothek
David Hofmann
11
Die von Flying Saucer verwendete Version von itext ist 2.0.8, die unter LGPL verfügbar war. Nur die Versionsnummern 5 oder höher sind in der restriktiveren Lizenz enthalten. stackoverflow.com/questions/2692000/…
Gary
8
Ich würde sagen, das eigentliche Problem mit Flying Saucer ist, dass es ein wohlgeformtes und gültiges XML-Dokument erfordert. Es ist einfach, das PDF-Rendering unabsichtlich zu unterbrechen, indem Sie so etwas wie ein kaufmännisches Und in Ihr HTML oder einen Javascript-Code einfügen, der Ihr gerendertes HTML nicht zu striktem XHTML macht. Dies kann jedoch durch automatisierte Tests oder einen Prozess, der eine XML-Validierung umfasst, verringert werden.
SteveT
3
@LateralFractal Soweit ich das beurteilen kann, verwendet Flying Saucer 9.0.8 (die neueste Version, glaube ich) iText 2.1.7, die letzte iText-Version mit einer zulässigen Lizenz --- LGPL. mvnrepository.com/artifact/org.xhtmlrenderer/flying-saucer-pdf/…
Jonathan Crosmer
2
@ JonathanCrosmer Ja. Es gibt zwei FlyingSaucer-Pakete für PDF, eines für iText v2 und eines für iText v5. Angenommen, beide haben die gleiche Funktionalität. Das AGPL-Risiko kann umgangen werden.
LateralFractal
49

Haben Sie WKHTMLTOPDF ausprobiert ?

Es ist ein einfaches Shell-Dienstprogramm, eine Open Source-Implementierung von WebKit. Beide sind kostenlos.

Wir haben ein kleines Tutorial setzen hier

EDIT (2017):

Wenn ich heute etwas bauen würde, würde ich diesen Weg nicht mehr gehen.
Würde aber verwenden stattdessen http://pdfkit.org/ verwenden.
Wahrscheinlich werden alle Knoten-Abhängigkeiten entfernt, um im Browser ausgeführt zu werden.

Mic
quelle
16
Für eine reine Konvertierung von HTML-Seite in PDF ist dies besser als alles andere, was ich gesehen habe, kostenlos oder kommerziell.
MGOwen
Funktioniert es unter einem Nicht-Mac OS?
Eran Medan
1
@Eran, wir verwenden es unter Linux. Ich denke, es gibt auch eine Windows-Version
Mic
1
@Mic Ja, es gibt auch eine Windows-Version.
Viccari
getestet unter Windows XP (Version 0.9.9) und funktioniert sehr gut. Außerdem sind für die Installation keine Administratorrechte auf dem Computer erforderlich.
Christopher Mahan
44

Schauen Sie sich iText an . Es ist ein reines Java PDF-Toolkit, das das Lesen von Daten aus HTML unterstützt. Ich habe es kürzlich in einem Projekt verwendet, als ich Inhalte aus unserem CMS abrufen und als PDF-Dateien exportieren musste, und alles war ziemlich einfach. Die Unterstützung für CSS- und Style-Tags ist ziemlich begrenzt, aber es werden Tabellen ohne Probleme gerendert (ich habe es jedoch nie geschafft, die Spaltenbreite festzulegen).

Das Erstellen einer PDF-Datei aus HTML sieht ungefähr so ​​aus:

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
quelle
9
Es ist AGPL, scheint noch schlimmer als GPL zu sein. Sie müssen Open Source sein, auch wenn Sie nur das PDF bereitstellen und iText serverseitig ist.
Eran Medan
10
@Eran, benutze einfach die letzte Nicht-AGPL-Version (com.lowagie: itext: 2.1.7 in Maven).
Nowaker
1
HTMLWorker ist in neueren Versionen von IText zugunsten von XMLWorker veraltet. Die CSS-Unterstützung ist jedoch in beiden Fällen schlecht (siehe demo.itextsupport.com/xmlworker/itextdoc/… ) und war für meine Anforderungen nicht ausreichend. Im Gegenteil, Flying Saucer war perfekt.
Pino
Sie können die LGPL-Version verwenden, die unter github.com/albfernandez/itext2
Vladimir Rozhkov
4

Wenn Sie die Finanzierung haben, geht nichts über Prince XML, wie dieses Video zeigt

Ólafur Waage
quelle
1
Wenn Sie nach einer günstigeren Alternative für Prince suchen, versuchen Sie es mit DocRaptor.com. Es verwendet Prince als Motor.
Julie
Und wenn Sie billiger wollen, aber mit mehr Optionen, versuchen Sie es mit htm2pdf.co.uk - es verwendet Webkit und Benutzer echte WYSIWIG
user1914292
3

Gibt es möglicherweise eine Möglichkeit, die gerenderte Seite aus der Rendering-Engine des Internet Explorers abzurufen und automatisch an ein PDF-Drucker-Tool zu senden?

So funktioniert ActivePDF bedeutet, dass Sie wissen, was Sie erhalten, und dass es eine angemessene Unterstützung für das Styling bietet.

Es ist auch eines der wenigen Pakete, die ich gefunden habe (vor ein paar Jahren) und die tatsächlich die verschiedenen CSS-Befehle für Seitenumbrüche unterstützen.


Leider ist die ActivePDF-Software sehr frustrierend - da sie den IE-Browser für Konvertierungen im Hintergrund starten muss, kann sie recht langsam sein und ist auch nicht besonders stabil.

Derzeit gibt es eine neue Version in der Beta, die viel besser sein soll, aber ich hatte noch keine Gelegenheit, sie auszuprobieren. Ich weiß also nicht, wie stark sie verbessert ist.

Peter Boughton
quelle
Danke für die hilfreiche Antwort. Ich denke nicht, dass ActivePDF wegen des Preises wirklich geeignet ist, aber es ist gut zu wissen, dass so etwas existiert.
Panschk
Die HTML-zu-PDF-API von GrabzIt : grabz.it/html-to-pdf-image-api.aspx Funktioniert genauso wie das HTML in einem Browser und erstellt dann das PDF. Dadurch wird sichergestellt, dass die PDF-Konvertierungen wesentlich genauer sind.
user1474090
2

Sie können einen kopflosen Firefox mit einer Erweiterung verwenden. Es ist ziemlich nervig, zum Laufen zu kommen, aber es bringt gute Ergebnisse.

Schauen Sie sich diese Antwort für weitere Informationen an.

Rojoca
quelle
Klingt nicht nach einer sehr skalierbaren Lösung, wenn Seiten im laufenden Betrieb parallel in PDF konvertiert werden müssen. Wenn einige Anfragen eingehen, die zu einer Konvertierung mit FF führen, hat Ihr Server einige GIG Speicher verloren, nur um einige konvertierte Seiten bereitzustellen. Dies würde Ihren Server für ein DOS öffnen.
mP.
Besser, aber ähnlich: github.com/ariya/phantomjs/wiki/Screen-Capture (laut we-love-php.blogspot.com/2012/12/… hat das PDF echten Text, nicht gerastert)
nafg
0

Wenn Sie sich die Seitenleiste Ihrer Frage ansehen, werden Sie viele verwandte Fragen sehen ...

In Ihrem Kontext besteht die einfachere Methode möglicherweise darin, einen PDF-Druckertreiber wie PDFCreator zu installieren und die Seite nur in dieser Ausgabe zu drucken.

PhiLho
quelle
Wie ist das eine Java-Lösung? Dies ist ein Windows-Druckertreiber.
Grau
Das OP erwähnte ausdrücklich Windows. Und ich nehme an, es gibt ähnliche Treiber für andere Systeme. Das OP erwähnte nur Java als mögliche Lösung ...
PhiLho
0

Amyuni WebkitPDF kann mit JNI für eine reine Windows-Lösung verwendet werden. Dies ist eine HTML-zu-PDF / XAML-Konvertierungsbibliothek, die für den kommerziellen und nichtkommerziellen Gebrauch kostenlos ist.

Wenn die Ausgabedateien nicht sofort benötigt werden, ist es für eine bessere Skalierbarkeit möglicherweise besser, eine Warteschlange und einige Hintergrundprozesse zu haben, die Elemente von dort übernehmen, konvertieren und dann in der Datenbank oder im Dateisystem speichern.

Es gilt der übliche Haftungsausschluss

yms
quelle