Tutorial: Mit PHP-Code die Ausgabe eines PHP-Scripts in eine pdf-Datei exportieren

Athelstan

New member
Mit PHP-Code die Ausgabe eines PHP-Scripts in eine pdf-Datei exportieren

Es gibt vielerlei Möglichkeiten, die Ausgabe eines PHP-Scripts in eine ".pdf"-Datei zu exportieren, aber leider ist das oft mit Java oder Javascript verbunden, oder eine entsprechende Bibliothek muss erst in PHP eingebunden werden, außerdem lässt es sich meistens nicht im PHP-Code selbst machen. Die meisten Lösungen sind arbeitsaufwändig oder kompliziert. Daher möchte ich eine Alternative dazu anbieten.

Um das ganze durchführen zu können, braucht ihr die Programme "wget" und "htmldoc". wget ist auf Linux standardmäßig dabei, htmldoc allerdings nicht, ladet es euch also zuerst einmal herunter. Es bietet sich an, das aus den jeweiligen Repositories zu machen. Wenn ihr es installiert habt, kann es auch schon losgehen. Zunächst müsst ihr in eurem PHP-Script mit "wget" die Ausgabe des gewollten PHP-Scripts in eine ".html"-Datei umleiten. Der Code dazu sieht so aus:

Code:
system('wget "phpscript.php?parameter=1" -O htmldatei.html');

Mit "system();" wird ein Systembefehl ausgeführt, als hättet ihr ihn in der Konsole eingegeben. Die Option -O sagt wget, wie die html-Datei heißen soll, hier in "htmldatei.html". Achtet darauf, dass ihr bei der Angabe des Scriptes (In diesem Fall "phpscript.php") Anführungszeichen setzen müsst. Das ist notwendig, weil bei den Parametern die Zeichen "?" und "&" stehen. Wenn diese nicht von Anführungszeichen "entschärft" werden, interpretiert das System diese Zeichen anders (Sonderzeichen haben meistens eine besondere Beudeutung in der Konsole). Nun, da die html-Datei mit der Ausgabe des PHP-Scripts erstellt ist, müsst ihr mit htmldoc daraus ein PDF erzeugen. Der PHP-Code dazu ist folgendermaßen:

Code:
system('htmldoc --webpage -f pdfdatei.pdf htmldatei.html');

Nun ist die Datei "htmldatei.html" und damit die Ausgabe des PHP-Scripts in der Datei "pdfdatei.pdf" abgespeichert. Um unnötig viele Dateien zu vermeiden, löscht ihr am besten direkt noch die html-Datei:

Code:
system('rm htmldatei.html');

Jetzt habt ihr die Ausgabe eures PHP-Scripts als PDF abgespeichert, allerdings ohne Farben, was vielleicht ein kleiner Nachteil ist.

Der Sinn des ganzen: Auf vielen Seiten gibt es einen Button namens "als PDF exportieren". So etwas könnt ihr hiermit realisieren. Ihr erstellt einfach mit HTML einen Button, der, wenn man auf ihn klickt, die aktuelle URL noch einmal aufruft, allerdings mit einem neuen, zusätzlichen Parameter, zum Beispiel "action=pdf". Ihr programmiert dann einfach ein if-Konstrukt in euer Script, das mit dem oben stehenden Code ausgestattet ist. Das könnte so aussehen:

Code:
$parameter = GET['parameter'];    // Die Parameter der aktuellen URL alle abspeichern, damit sie weiter als Parameter übergeben werden können
echo '<form action="phpscript.php?parameter='.$parameter.'&action=print"><input type="submit" value="Als PDF exportieren"></form>';    // Button für das Exportieren, ruft bei Anklicken das Script noch einmal auf, allerdings mit dem zusätzlichen "action=print"
if ( $_GET['action']=='print' ) {    // Wenn die Seite mit "action=print" aufgerufen wurde, wird in eine PDF-Datei exportiert
  system('wget "phpscript.php?parameter='.$parameter.'" -O '.$parameter.'.html');
  system('htmldoc --webpage -f '.$parameter.'.pdf '.$parameter.'.html');
  system('rm '.$parameter.'.html');
  echo 'Erfolgreich exportiert<br><br>';
}

Hier wird ein Button angegeben, der die Seite erneut aufruft und dann die Exportierung aktiviert. Dann wird eine Erfolgsmeldung ausgegeben. Die PDF-Datei wird nach den Parametern der aktuellen Seite benannt, damit hat man dann dynamische Dateinamen. Mit ein wenig mehr Code könnt ihr diese Datei auch direkt zum Download anbieten, zum Beispiel mit:

Code:
echo '<meta http-equiv="refresh" content="0;URL='.$parameter.'.pdf">';
@Team: Wäre schön, wenn das in dieser Form auch bei den Tutorials stehen könnte.

mfg,

Athelstan
 

CentralWay

New member
Schönes Tutorial.

Angemerkt sollte vielleicht noch werden, dass die system() Funktion unter Umständen nicht verfügbar ist oder nur sehr eingeschränkt verwendet werden kann.

Für diese Fälle kann ich, das ganze wird dann natürlich etwas aufwändiger, die html2pdf Bibliothek empfehlen.

[0] http://html2fpdf.sourceforge.net/
 

beavisbee

Member of Honour
schöne Idee...
aber ist das nicht ziemlich inperformant, wenn das Script für jede PDF-Erstellung erst ordentlich auf der Platte rum werkeln muss???

außerdem: wenn ich sowas produktiv nutzen wollen würde, hätte ich (wenn ich keinen Root-Server hätte) keine Möglichkeit, das htmldoc beim Webspace-Anbieter einfach so zu installieren...
da wäre die Wahrscheinlichkeit sicherlich gering, dass man einem Kunden so ein Programm installiert und die Rechte einräumt. system() oder ähnliche Funktionen zu benutzen...
Jedenfalls auf meinem Server hab ich aus Sicherheitsgründen system(), shell_exec() und co. deaktiviert...

Dazu kommt, dass das ganze ziemlich plattformabhängig ist...
Wenn man an Projekten arbeitet, die unter Linux und Windows arbeiten können sollen, ist es sicherlich nicht gerade von Vorteil, so viel mit system() zu arbeiten...

Daher mein persönliches Fazit: schöne Idee, aber für die Praxis in meinen Augen für die meisten User nicht unbedingt sooo umsetzbar.
 

Woosh

Member
Denen, die dein Tutorial nicht direkt einsetzen können, kann ich fpdf oder (wie CentralWay ja schon sagte) html2pdf empfehlen. Allerdings ist fpdf nicht da um HTML in PDF umzuwandeln sondern um generell PDF-Dokumente in PHP zu erstellen.
 

beavisbee

Member of Honour
jepp. ich fände fpdf / html2fpdf auch ne wesentlich sauberere Lösung als 10 system("bla")-Aufrufe...
 
Oben