web-dev-qa-db-de.com

HTML + CSS mit PHP in PDF konvertieren?

Ich habe ein HTML-Dokument (nicht XHTML), das in Firefox 3 und IE 7 einwandfrei dargestellt wird. Es verwendet relativ einfaches CSS, um es zu formatieren, und es wird in HTML einwandfrei dargestellt.

Ich bin jetzt nach einer Möglichkeit, es in PDF umzuwandeln. Ich habe versucht:

  • DOMPDF : Es gab große Probleme mit Tabellen. Ich habe meine großen verschachtelten Tabellen ausgeklammert und es hat geholfen (bevor es nur bis zu 128M Speicher verbrauchte und dann starb - das ist mein Speicherlimit in der php.ini), aber es macht ein komplettes Durcheinander von Tabellen und scheint nicht zu bekommen bilder. Bei den Tabellen handelte es sich lediglich um grundlegende Elemente mit einigen Rahmenstilen, um an verschiedenen Stellen Linien hinzuzufügen.
  • HTML2PDF und HTML2PS : Ich hatte damit eigentlich mehr Glück. Es wurden einige der Bilder gerendert (alle Bilder sind Google Chart-URLs) und die Tabellenformatierung war viel besser, aber es schien ein Komplexitätsproblem zu geben, das ich noch nicht herausgefunden habe und das mit unbekannten node_type () -Fehlern gestorben ist. Ich bin mir nicht sicher, wohin ich von hier aus gehen soll. und
  • Htmldoc : Dies scheint in einfachem HTML gut zu funktionieren, unterstützt aber fast kein CSS, so dass man alles in HTML machen muss (ich wusste nicht, dass es noch 2001 in Htmldoc-Land war ... ) so ist es für mich nutzlos.

Ich habe eine Windows-App namens Html2Pdf Pilot ausprobiert, die eigentlich ganz ordentliche Arbeit geleistet hat, aber ich brauche etwas, das mindestens unter Linux läuft und im Idealfall auf Abruf über PHP auf dem Webserver läuft.

Was fehle ich oder wie kann ich dieses Problem beheben?

1560
cletus

Wichtig: Bitte beachten Sie, dass diese Antwort im Jahr 2009 verfasst wurde und möglicherweise nicht die kostengünstigste Lösung heute im Jahr 2019 ist. Online-Alternativen sind heute besser unter das als sie damals waren.

Hier sind einige Online-Dienste, die Sie verwenden können:


Schauen Sie sich PrinceXML an.

Es ist definitiv der beste Konverter von HTML/CSS in PDF, obwohl er nicht kostenlos ist (Da Sie auch berücksichtigen müssen, dass für die alternativen Lösungen ein dedizierter Server mit der richtigen Software eingerichtet werden muss)

Oh ja, habe ich schon erwähnt, dass dies die erste (und wahrscheinlich einzige) HTML2PDF-Lösung ist, die voll funktionsfähig ist ACID2 ?

PrinceXML-Beispiele

536
SchizoDuckie

Schauen Sie sich wkhtmltopdf an. Es ist Open Source, basiert auf Webkit und ist kostenlos.

Wir haben ein kleines Tutorial geschrieben hier .

EDIT (2017):

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

660
Mic

Nach einigen Nachforschungen und allgemeinem Haarziehen scheint die Lösung HTML2PDF zu sein. DOMPDF hat einen schrecklichen Job mit Tabellen, Rahmen und sogar mäßig komplexem Layout gemacht und htmldoc scheint einigermaßen robust zu sein, ist aber fast komplett CSS-ignorant und ich möchte nicht gehen Zurück zu HTML-Layout ohne CSS nur für dieses Programm.

HTML2PDF sah am vielversprechendsten aus, aber ich hatte weiterhin diesen seltsamen Fehler bezüglich der Nullreferenzargumente für node_type. Ich habe endlich die Lösung dafür gefunden. Grundsätzlich hat PHP 5.1.x mit Regex-Ersetzungen (preg_replace_ *) für Zeichenfolgen beliebiger Größe problemlos funktioniert. PHP 5.2.1 hat eine php.ini config Direktive namens pcre.backtrack_limit eingeführt. Dieser Konfigurationsparameter begrenzt die Stringlänge, für die ein Abgleich durchgeführt wird. Warum dies eingeführt wurde, weiß ich nicht. Der Standardwert wurde als 100.000 gewählt. Warum so ein niedriger Wert? Wieder keine Ahnung.

Ein Bug wurde hierfür gegen PHP 5.2.1 ausgelöst , der fast zwei Jahre später noch offen ist .

Das Schreckliche daran ist, dass beim Überschreiten des Grenzwerts das Ersetzen nur im Hintergrund fehlschlägt . Zumindest wenn ein Fehler aufgetreten und protokolliert worden wäre, hätten Sie einen Hinweis darauf, was passiert ist, warum und was geändert werden muss, um ihn zu beheben. Aber nein.

Ich habe also eine 70k-HTML-Datei, die ich in eine PDF-Datei umwandeln kann. Es erfordert die folgenden php.ini-Einstellungen:

  • pcre.backtrack_limit = 2000000; # wahrscheinlich mehr als ich brauche, aber das ist in Ordnung
  • memory_limit = 1024M; # ja, ein Gigabyte ; und
  • max_execution_time = 600; # ja, 10 Minuten .

Jetzt kann der kluge Leser bemerkt haben, dass meine HTML-Datei kleiner als 100 KB ist. Der einzige Grund, warum ich auf dieses Problem gestoßen bin, ist, dass html2pdf als Teil des Prozesses eine Konvertierung in xhtml durchführt. Vielleicht hat mich das überwältigt (obwohl fast 50% Aufblähen seltsam erscheint). Wie dem auch sei, das oben Genannte hat funktioniert.

Jetzt ist html2pdf ein Ressourcenfresser. Meine 70k-Datei benötigt ungefähr 5 Minuten und mindestens 500-600 MB RAM, um eine 35-seitige PDF-Datei zu erstellen. Leider (bei weitem) nicht schnell genug für einen Echtzeit-Download, und die Speichernutzung veranlasst das Speichernutzungsverhältnis in der Größenordnung von 1000 zu 1 (600 MB RAM für eine 70-KB-Datei) absolut lächerlich.

Leider ist das das Beste, was ich mir ausgedacht habe.

148
cletus

Warum versuchst du es nicht mit mPDF Version 2. ? Ich habe es verwendet, um PDF ein Dokument zu erstellen. Es funktioniert gut.

Mittlerweile ist mPDF in der Version 5.7 und wird im Gegensatz zu HTML2PS/HTML2PDF aktiv gepflegt

Bedenken Sie jedoch, dass die Dokumentation sehr schwer zu handhaben sein kann. Schauen Sie sich zum Beispiel diese Seite an: https://mpdf.github.io/ .

Sehr grundlegende Aufgaben rund um HTML bis PDF können mit dieser Bibliothek erledigt werden, aber komplexere Aufgaben werden einige Zeit in Anspruch nehmen, um die Dokumentation zu lesen und zu "verstehen".

122
Karthick

1) benutze MPDF !

a) extrahieren in yourfolder

b) erstelle file.php in yourfolder und füge diesen Code ein:

<?php
include('../mpdf.php');
$mpdf=new mPDF();
$mpdf->WriteHTML('<p style="color:red;">Hallo World<br/>Fisrt sentencee</p>');
$mpdf->Output();   exit;
 ?>

c) öffne file.php in deinem Browser




2) Verwenden Sie pdfToHtml !

1) extrahieren Sie pdftohtml.exe in Ihren Root-Ordner:

2) In diesem Ordner in anyfile.php folgenden Code einfügen (vorausgesetzt, es gibt auch eine Quelldatei 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) geben Sie FinalFolder ein, und es werden die konvertierten Dateien angezeigt (so viele Seiten, wie die Quelle PDF hatte ..)

68
T.Todua

Checkout TCPDF . Es verfügt über einige HTML- bis PDF -Funktionen, die möglicherweise ausreichen, um Ihre Anforderungen zu erfüllen. Es ist auch kostenlos!

55
Darryl Hein

Ich schlage vor DocRaptor (das PrinceXML als "Motor" verwendet)

30
Oren

Ich habe DOMPDF ausprobiert und es hat perfekt funktioniert. Ich habe DIV und andere Block-Level-Elemente verwendet, um alles zu positionieren. Ich habe es streng in CSS 2.1 gehalten und es hat sehr gut gespielt.

29

Es wurde bereits erwähnt, aber ich möchte nur bestätigen, dass mpdf der einfachste, leistungsstärkste und kostenlosste Konverter von HTML in PDF ist. Der Himmel ist wirklich die Grenze. Sie können sogar PDF-Dateien mit dynamischen, benutzergenerierten Daten erstellen.

Zum Beispiel wollte ein Kunde ein CMS-System, damit er die Titelliste der Musik, die er in seinem Club spielte, aktualisieren konnte. Das war kein Problem, aber er wollte auch, dass Benutzer ein PDF der Wiedergabeliste herunterladen konnten, und so musste dieses herunterladbare PDF auch vom CMS aktualisiert werden. Dank mpdf konnte ich mit ein paar einfachen Schleifen und eingestreuten Variablen genau das tun. Etwas, von dem ich dachte, es würde Wochen dauern, dauerte buchstäblich Minuten.

Großartig Artikel das hat mir geholfen, anzufangen.

28
Starkers

Gute Nachrichten! Bissig !!

Snappy ist eine sehr einfache Open-Source-PHP5-Bibliothek, die die Erstellung von Thumbnails, Snapshots oder PDF aus einer URL oder einer HTML-Seite ermöglicht. Und ... es verwendet das ausgezeichnete Webkit-basierte wkhtmltopdf

Genießen! ^ _ ^

28
Paulo Coghi

Wenn Sie eine perfekte XHTML + CSS zu PDF Konverter Bibliothek finden möchten, vergessen Sie es. Das ist alles andere als möglich. Weil es so ist, als ob man einen perfekten Browser findet (XHTML + CSS Rendering Engine). Haben wir eine IE oder FF?

Ich hatte einige Erfolge mit DOMPDF. Die Sache ist, dass Sie Ihren HTML + CSS-Code so ändern müssen, dass er mit der Funktionsweise der Bibliothek übereinstimmt. Ansonsten habe ich ziemlich gute Ergebnisse.

Siehe unten:

Original HTML

HTML in PDF konvertieren

25
datasn.io

Die HTML2PDF und HTML2PS , die ursprünglich im Eröffnungsbeitrag erwähnt wurden, sprachen über ein 2009-Paket mit diesem Link

Aber es gibt ein besseres HTML2PDF

Es basiert auf TCPDF, obwohl es teilweise in Französisch ist.

Sie können Tabellenkopf- oder -fußzeilen haben, die sich auf den Seiten wiederholen und Seitenzahlen und Gesamtseiten haben. Siehe seine Beispiele . Ich benutze es seit über drei Jahren und empfehle es.

24
Luke Wenke

Es gibt ein Tutorial zu Zend's devzone zum Generieren von PDF aus PHP ( Teil 1 , Teil 2 ) ohne externe Bibliotheken. Ich habe diese Art von Lösung nie implementiert, aber da es sich um PHP handelt, ist es möglicherweise flexibler zu implementieren und zu debuggen.

20
yoavf

Versuchen Sie es mit dem neuesten nächtlichen dompdf Build. Ich habe eine ältere Version verwendet, die eine schreckliche Ressource darstellte, und es hat ewig gedauert, mein PDF zu rendern. Nach einem nächtlichen Grabbing von hier .

Die Erstellung des PDF dauerte nur wenige Sekunden - UND es wurde genauso gut gerendert wie mit PrinceXML / Docraptor . Scheint, als hätten sie den dompdf Code ernsthaft optimiert, seit ich ihn das letzte Mal benutzt habe!

15
Arni J

Darryl Heins Erwähnung von TCPDF ist wahrscheinlich eine großartige Idee. Nicola Asunis Code ist ziemlich handlich und mächtig. Der einzige Mörder ist, wenn Sie jemals vorhaben, PDF Dateien mit Ihren generierten PDF zusammenzuführen, sind diese Funktionen nicht verfügbar. Sie müssten das PDF erstellen und es dann mit PDFTK von Sid Steward (www.pdflabs.com/tools/pdftk-the-pdf-toolkit/) zusammenführen.

15
Arachnid

Bezüglich der Kosten kann die Verwendung eines Web-Service (API) in vielen Fällen der sinnvollere Ansatz sein. Wenn Sie diesen Prozess auslagern, entlasten Sie Ihre eigene Infrastruktur/Ihr Backend und stellen - vorausgesetzt, Sie nutzen einen seriösen Service - die Kompatibilität mit der Anpassung von Webstandards, der Verfügbarkeit, den kurzen Verarbeitungszeiten und der schnellen Bereitstellung von Inhalten sicher.

Ich habe einige Nachforschungen zu den meisten derzeit auf dem Markt befindlichen Webdiensten angestellt. Im Folgenden finden Sie die APIs, die meines Erachtens in diesem Thread erwähnt werden sollten, in einer Reihenfolge, die auf dem Preis-Leistungs-Verhältnis basiert. Alle von ihnen bieten vorgefertigte PHP Klassen und Pakete an.

  1. pdflayer.com - Kosten: $ - Qualität: ☆☆☆☆
  2. docraptor.com - Kosten: $$$ - Qualität: ☆☆☆☆☆
  3. pdfcrowd.com - Kosten: $$ - Qualität: ☆☆☆

Qualität:

Mit der hochqualitativen Engine PrinceXML als Backbone bietet DocRaptor eindeutig die beste PDF Qualität und liefert hochglanzpolierte und gut konvertierte PDF Dokumente. Allerdings kommt der pdflayer API Dienst hier ziemlich nahe. Pdfcrowd punktet nicht unbedingt mit der Qualität, sondern mit der Verarbeitungsgeschwindigkeit.

Kosten:

pdflayer.com - Wie bereits erwähnt, ist pdflayer.com die kosteneffektivste Option und bietet ein kostenloses Abonnement für 100 monatliche PDFs und Premium Abonnements zwischen 9,99 und 119,99 US-Dollar. Der Preis für 10.000 monatliche PDF Dokumente beträgt 39,99 USD.

docraptor.com - Bietet eine kostenlose Testphase von 7 Tagen. Premium-Abonnements kosten zwischen 15 und 2250 US-Dollar. Der Preis für 10.000 monatliche PDF Dokumente beträgt ~ 300,00 USD.

pdfcrowd.com - Biete 100 PDFs einmalig kostenlos an. Premium-Abonnements kosten zwischen 9 und 89 US-Dollar. Der Preis für 10.000 monatliche PDF Dokumente beträgt ~ 49,00 USD.

Ich habe alle drei benutzt und dieser Text soll jedem helfen, sich zu entscheiden, ohne für alle bezahlen zu müssen. Dieser Text wurde nicht verfasst, um ein Produkt zu unterstützen, und ich bin mit keinem der Produkte verbunden.

13
Frank

Wenn Sie Zugriff auf die Befehlszeile haben, können Sie mit PhantomJS das PDF aus einem URL (remote oder lokal) erstellen ).

Es funktioniert wirklich gut und ist eine kostenlose Lösung.

Schauen Sie sich dieses Beispiel Skript an, das genau für dieses Problem erstellt wurde.

12
chjortlund

Diese Frage ist schon ziemlich alt, aber ich habe noch niemanden erwähnt CutyCapt also werde ich :)

CutyCapt

CutyCapt ist ein kleines plattformübergreifendes Befehlszeilendienstprogramm zum Erfassen des WebKit-Renderings einer Webseite in einer Vielzahl von Vektor- und Bitmapformaten, einschließlich SVG, PDF, PS, PNG, JPEG, TIFF, GIF. und BMP

11
Koen.

Ich empfehle TCPDF oder DOMPDF in dieser Reihenfolge.

10
criss_ae

Ich glaube nicht, dass eine PHP-Klasse das Beste ist, um eine xHtml-Seite mit CSS zu rendern.

Was passiert, wenn eine neue CSS-Regel herauskommt? (bald CSS 3.0 ...)

Der beste Weg, um eine HTML-Seite zu rendern, ist natürlich ein Browser. Firefox 3.0 kann nativ im PDF-Format 'drucken', torisugary hat dafür eine Erweiterung (Command Line Print) entwickelt. Hier finden Sie es.

Wie auch immer, es gibt immer noch viele Probleme, die Firefox nur als PDF-Konverter ausführen ...

Im Moment denke ich, dass wkhtmltopdf das Beste ist (das vom Safari-Browser verwendet wird), schnell, schnell, fantastisch. Ja, auch Opensource ... Schau mal

9
Strae

Vielleicht können Sie versuchen, Tidy zu verwenden, bevor Sie die Datei an den Konverter übergeben. Wenn einer der Renderer ein HTML-Problem (z. B. nicht geschlossenes Tag) verursacht, kann dies möglicherweise Abhilfe schaffen.

9
PhiLho

Ich habe eine öffentliche API entwickelt, um PDF Dateien von Webseiten zu erstellen. Es hat eine Nice PHP Client-Klasse, die es super einfach zu bedienen macht. Es verwendet wkhtmltopdf, um das PDF in der Cloud zu rendern.

Keine Notwendigkeit für etwas Besonderes im HTML. Keine Notwendigkeit für absolute URLs in Bildern/CSS/JS-Links. Funktioniert auch auf localhost (dev machine).

Derzeit verfügt der Dienst über Endpunkte in 4 Azure-Regionen: US-Ost-, US-West-, EU-Nord- und Südostasien.

Es ist schnell, da es ein proprietäres Protokoll verwendet, um den Inhalt der Webseite zur Konvertierung in PDF an die API zu senden.

Dies ist zuverlässig, da alle Endpunkte über einen Lastenausgleich verfügen.

Kostenloses Konto zum Testen oder zur geringen Nutzung verfügbar. Details auf der Website:

https://rotativahq.com

9
Giorgio Bozio

Obwohl bereits viele Lösungen angeboten werden, empfehle ich die folgenden beiden:

  1. HTM2PDF - Bietet eine API zum Konvertieren von HTML in PDF und ein PHP SDK, das die Implementierung in PHP sehr einfach macht. Es bietet eine Auswahl an Serverstandorten in Europa, Asien und den USA
  2. PDFmyURL - Bietet eine API, die URL und HTML auch für PDF ausführt, mit ungefähr der gleichen Funktionalität wie HTM2PDF, jedoch mit einer Landschaft mit Lastenausgleich arbeitet und etwas länger besteht

Das Besondere an diesen beiden APIs ist, dass sie nicht nur HTML in PDF mit CSS und JavaScript konvertieren, sondern auch PDF Rechteverwaltung, Wasserzeichen und Verschlüsselung bieten . Daher ist es eine All-in-One-Lösung für alle, die sofort loslegen möchten.

Haftungsausschluss: Ich arbeite für Kaiomi, ein Unternehmen, das beide Websites betreibt.

7
user1914292

Feines Rendering hat nichts zu bedeuten. Validiert es?

Alle Browser tun ihr Möglichstes, um nur etwas auf dem Bildschirm anzuzeigen, egal wie schlecht die Eingabe ist. Und natürlich machen sie nicht dasselbe. Wenn Sie dasselbe Rendering wie FireFox wünschen, können Sie dessen Rendering-Engine verwenden. Es gibt PDF-Generatoren dafür. Es ist jedoch eine Menge Arbeit.

7

TCPDF funktioniert einwandfrei, ohne Abhängigkeiten, ist kostenlos und wird ständig überarbeitet. Es hat eine angemessene Geschwindigkeit, wenn die bereitgestellten HTML/CSS-Inhalte gut formatiert sind. Normalerweise generiere ich aus 50 - 300 kB HTML-Eingaben (einschließlich CSS) und erhalte PDF Ausgaben innerhalb von 1-3 Sekunden mit 10 - 15 PDF Seiten.

Ich empfehle dringend, ordentlich library als HTML-Formatierer zu verwenden, bevor Sie etwas an TCPDF senden.

5
lubosdz

Muss die Konvertierung von HTML in PDF wirklich serverseitig mit PHP erfolgen ?

Ich bin gerade auf jsPDF gestoßen, eine clientseitige Lösung mit HTML5/JavaScript. Das MIT-lizenzierte Code ist auf GitHub ebenfalls.

5
Oliver Schafeld

Ich habe viele verschiedene Bibliotheken für PHP ausprobiert. Alle aufgelisteten habe ich ausprobiert. Meiner Meinung nach ist TCPDF library die beste Kompromissleistung/Benutzerfreundlichkeit. Es ist sehr einfach zu installieren und zu verwenden, auch bei kleinen und mittleren Anwendungen eine gute Leistung. Wenn Sie eine hohe Leistung und ein sehr großes PDF Dokument benötigen, verwenden Sie das Zend_PDF Modul, aber bereiten Sie sich darauf vor, hart zu codieren!

4
trullallero

Web API

Wenn es Leute gibt, die immer nach solchen Dingen suchen, gibt es eine kostenlose Website, auf der Sie HTML-Code und Seiten in PDF konvertieren können. Es gibt auch eine (sehr kleine) API, mit der Sie PDF-Dateien von der URL abrufen können.

Überprüfen Sie es hier

3
Superdrac

nicht PHP, sondern eine Java Bibliothek , was macht das Ding:

Flying Saucer verwendet XML oder XHTML und wendet CSS 2.1-kompatible Stylesheets an, um in PDF zu rendern

Es kann von PHP über system() oder einen ähnlichen Aufruf verwendet werden. Obwohl es XML Wohlgeformtheit des input erfordert.

2
Ivan Kurmanov