Frage Konvertieren von HTML + CSS in PDF mit PHP? [geschlossen]


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

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

  • DOMPDF: Es hatte große Probleme mit den Tischen. Ich habe meine großen verschachtelten Tabellen ausgeklammert und es hat geholfen (bevor es nur bis zu 128M Speicher verbraucht hat und dann gestorben ist - das ist meine Grenze für Speicher in php.ini), aber es macht eine komplette Unordnung der Tabellen und scheint nicht zu kommen Bilder. Die Tabellen waren nur Grundkenntnisse mit einigen Randstilen, um an verschiedenen Stellen Linien hinzuzufügen.
  • HTML2PDF und HTML2PS: Ich hatte tatsächlich mehr Glück damit. Einige der Bilder wurden gerendert (alle Bilder sind Google-Chart-URLs) und die Tabellenformatierung war viel besser, aber es schien ein komplexes Problem zu haben, das ich noch nicht herausgefunden hatte und das mit unbekannten node_type () - Fehlern endete. Ich bin mir nicht sicher, wo ich von hier aus hingehen soll. und
  • Htmdoc: Das scheint auf Basic-HTML gut zu funktionieren, aber hat fast keine Unterstützung für CSS, also muss man alles in HTML machen (ich wusste nicht, dass es 2001 noch in Htmldoc-Land war), also ist es nutzlos für mich.

Ich habe eine Windows-App namens Html2Pdf Pilot ausprobiert, die eigentlich einen ziemlich guten Job gemacht hat, aber ich brauche etwas, das zumindest auf Linux läuft und idealerweise auf Wunsch über PHP auf dem Webserver läuft.

Was fehlt mir oder wie kann ich dieses Problem beheben?


1395


Ursprung


Antworten:


Wichtig: Bitte beachten Sie, dass diese Antwort im Jahr 2009 verfasst wurde und im Jahr 2018 möglicherweise nicht die kosteneffektivste Lösung ist. Online-Alternativen wie PDF-Verschiebung sind heute besser als damals.


Schau es dir an PrinzXML.

Es ist definitiv der beste HTML / CSS zu PDF Konverter da draußen, obwohl es nicht kostenlos ist (Aber hey, deine Programmierung ist vielleicht auch nicht kostenlos, also wenn du 10 Stunden Arbeit sparst, bist du zu Hause frei (da musst du auch) Berücksichtigen Sie, dass die alternativen Lösungen erfordern, dass Sie einen dedizierten Server mit der richtigen Software einrichten)

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

PrinceXML-Beispiele


442



Schau es dir an wkhtmltopdf . Es ist Open Source, basierend auf Webkit und kostenlos.

Wir haben ein kleines Tutorial geschrieben Hier.

BEARBEITEN (2017):

Wenn es heute etwas bauen würde, würde ich diesen Weg nicht mehr gehen.
Aber würde verwenden http://pdfkit.org/ stattdessen.
Vermutlich strippt es von all seinen Knotenabhängigkeiten, um im Browser zu laufen.


627



Nach einiger Untersuchung und allgemeinem Haarziehen scheint die Lösung zu sein HTML2PDF. DOMPDF hat einen schrecklichen Job mit Tischen, Grenzen und sogar gemäßigt komplexem Layout und htmldoc scheint einigermaßen robust zu sein, ist aber fast komplett CSS-ignorant und ich möchte nicht einfach für dieses Programm wieder HTML-Layout ohne CSS machen.

HTML2PDF sah am vielversprechendsten aus, aber ich hatte diesen seltsamen Fehler über Null-Referenzargumente für node_type. Ich habe endlich die Lösung dafür gefunden. Im Grunde genommen funktionierte PHP 5.1.x gut mit regex ersetzt (preg_replace_ *) für Strings jeder Größe. PHP 5.2.1 führte eine php.ini config-Anweisung namens pcre.backtrack_limit. Was dieser Config-Parameter bewirkt, ist die String-Länge, für die der Abgleich durchgeführt wird. Warum das eingeführt wurde, weiß ich nicht. Der Standardwert wurde als 100.000 ausgewählt. Warum so ein niedriger Wert? Nochmal keine Ahnung.

EIN Es wurde ein Bug gegen PHP 5.2.1 gemeldet, die noch offen ist fast zwei Jahre später.

Das Erschreckende daran ist, dass wenn das Limit überschritten wird, das Ersetzen einfach scheitert still. Zumindest wenn ein Fehler gemeldet und protokolliert wurde, haben Sie einen Hinweis darauf, was passiert ist, warum und was geändert werden muss, um es zu beheben. Aber nein.

Also habe ich eine 70k HTML-Datei, um PDF zu machen. 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 hat der scharfsinnige Leser vielleicht bemerkt, dass meine HTML-Datei kleiner als 100k ist. Der einzige Grund, warum ich erraten kann, warum ich dieses Problem habe, ist, dass html2pdf als Teil des Prozesses eine Konvertierung in xhtml durchführt. Vielleicht hat mich das überfordert (obwohl fast 50% Bloat seltsam scheint). Was auch immer der Fall war, das obige funktionierte.

Jetzt ist html2pdf eine Ressource Schwein. Meine 70k-Datei dauert ungefähr 5 Minuten und mindestens 500-600M RAM, um eine 35-seitige PDF-Datei zu erstellen. Nicht schnell genug (bei weitem) für einen Echtzeit-Download leider und die Speicherauslastung legt das Speichernutzung Verhältnis in der Größenordnung von 1000 zu 1 (600M RAM für eine 70k-Datei), was völlig lächerlich ist.

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


141



Warum versuchst du es nicht? mPDF Version 2.0? Ich habe es zum Erstellen von PDF-Dokumenten verwendet. Es funktioniert gut.

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

Bedenken Sie jedoch, dass die Dokumentation wirklich schwer zu handhaben ist. Schauen Sie sich beispielsweise diese Seite an: https://mpdf.github.io/.

Mit dieser Bibliothek können sehr einfache Aufgaben rund um HTML bis hin zu PDF erledigt werden, aber komplexere Aufgaben werden einige Zeit brauchen, um die Dokumentation zu lesen und zu "verstehen".


115



1) verwenden MPDF !

a) extrahiere in yourfolder

b) erstellen Datei.php im yourfolder und füge folgenden 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) offen Datei.php von Ihrem Browser






2) Verwenden pdfToHtml !

1) extrahieren pdftohtml.exe zu Ihrem Stammordner:

2) in diesem Ordner, in anyfile.php Datei, setze diesen Code (vorausgesetzt, es gibt auch ein Quellbeispiel.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) eingeben FinalFolderund es wird die konvertierten Dateien geben (so viele Seiten, wie das Quell-PDF hatte ..)


60



Auschecken TCPDF. Es verfügt über einige HTML-zu-PDF-Funktionen, die für das, was Sie benötigen, ausreichen könnten. Es ist auch kostenlos!


51



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


29