Kontakt aufnehmen

PDF-Dateien erstellen mit PHP

Die Unterstützung für das PDF-Format ist im Laufe der Jahre immer weiter verbessert worden. Immer mehr Programme unterstützen das Format, weshalb es nur sinnvoll ist, wenn Daten im Internet in PDF angeboten werden. Bereits fertige Dateien sind aber nicht das Ende der Fahrenstange. PHP bietet eine Erweiterung an, mit deren Hilfe PDF-Dateien dynamisch erstellt werden können.
Dieser Artikel zeigt die wichtigsten Funktionen dieser PHP-Erweiterung auf und erklärt, wie PDF-Dateien erstellt werden können.

Installation der Erweiterung

Wenn die Extension nicht Teil der installierten PHP-Distribution ist, muss diese zuerst aus dem Internet heruntergeladen werden. Über die Internetadresse http://pecl.php.net/package/pdflib bekommt man die notwendige Datei.
Nach dem Download muss die DLL-Datei in das ext- oder extensions-Verzeichnis im PHP-Ordner kopiert werden.
Jetzt ist noch ein Eintrag in der DLL-Liste in der php.ini-Datei (Rubrik "Windows Extensions") notwendig. Am Ende der Liste muss die Zeile "extension=php.pdf.dll" eingegeben werden.
Zum Schluß muss der Webserver neu gestartet werden.

Wenn die DLL-Datei bereits vorhanden ist, muss diese evtl. noch freigeschaltet werden. Dazu muss in der php.ini in der Zeile "extension=php.pdf.dll" überprüft werden, ob am Zeilenanfang ein Semikolon angegeben ist. Ist das der Fall, muss dieses entfernt, danach die Datei gespeichert und der Webserver neu gestartet werden.
Danach stehen die Funktionen zur Verfügung.

Die PDFLib Lite-Variante der PDF-Erweiterung

Es gibt eine Version der PDF-Erweiterung, die nicht alle Funktionen der "großen" Bibliothek unterstützt. Diese kleine Extension wird als "Lite" bezeichnet und besitzt einen eingeschränkten Funktionsumfang. Zum Beispiel können mit der kleinen Version keine Formulare und keine Tabellen angelegt werden.

Wichtig: In der php.ini-Datei wird in der Liste der Windows Extensions nicht zwischen den möglichen Versionen unterschieden. Eine Möglichkeit, um herauszufinden, um welche Version es sich handelt, ist die Eigenschaften der angelegten PDF-Datei aufzurufen. Im Karteireiter "PDF" wird in der Zeile "PDF Producer" der Name und die Version der Bibliothek angezeigt.

Unterschied zur CPDF-Erweiterung

Neben der bekannten PDFLib unterstützt PHP auch die CPDF-Erweiterung, mit der ebenfalls PDF-Dateien erstellt werden können. Allerdings besteht laut PHP-Dokumentation keine wesentlichen Unterschiede zwischen den beiden Erweiterungen.

Hinweis: Die CPDF-Erweiterung ist Teil des PECL-Repository und ab der PHP-Version 5.1.0 nicht mehr standardmäßig enthalten.

Praxisbeispiele zur Erstellung einer pdf-Datei

Jedes Element einer pdf-Datei muss im Dokument positioniert werden. Dazu gibt man zwei Koordinaten als Parameter der benötigten Funktionen an. Wenn die Position festgelegt wird, muss man vom linken unteren Eck des Dokumentes ausgehen.

Erzeugen einer Objektinstanz für die pdf-Datei

Als Grundlage für die Arbeit mit PDF-Dateien muss zunächst das passende Objekt erzeugt werden:

$doc = pdf_new();

... anschließend wird das zu schreibende Dokument geöffnet:

pdf_open_file($doc,"test.pdf");

Erstellen eines Inhaltsverzeichnisses (Lesezeichen) für die Datei

Wenn man eine pdf-Datei aufruft, wird unter Umständen auf der linken Seite ein Inhaltsverzeichnis der Datei mit ausgegeben.
Ein dazu notwendiger Eintrag kann mit der folgenden Skriptzeile angelegt werden:

$page1 = pdf_add_bookmark($doc,"Kapitel 1", $x, 1);

Es ist empfehlenswert, jedem Aufruf der Funktion einen Rückgabewert zu geben. Dies ist notwendig, um ein verschachteltes Inhaltsverzeichnis anzulegen. Die pdf-Datei kann so zu einzelnen Kapiteln / Blöcken zusammengefasst werden.
Ein Funktionsaufruf benötigt immer 4 Parameter. Neben der Instanz für die pdf-Datei muss eine Bezeichnung für den Eintrag angegeben werden. Der dritte Parameter legt fest, ob es sich um einen Eintrag innerhalb einer Gruppe bzw. eines Kapitels der pdf-Datei handelt. Wenn es sich bei der betreffenden Seite in der obersten Ebene des Inhaltsverzeichnisses befinden soll, muss an dieser Stelle eine Variable angegeben werden, die sonst nicht im Skript verwendet wird. Eine Fehlermeldung wird nicht angezeigt. Der vierte Parameter, der entweder die Werte 0 oder 1 annehmen kann, gibt an, ob das Inhaltsverzeichnis an dieser Stelle bereits geöffnet sein soll (Wert 1) oder geschlossen bleibt (Wert 0).

Weiteres Beispiel:

$page1 = pdf_add_bookmark($doc,"Kapitel 1", $x, 1);
$page2 = pdf_add_bookmark($doc,"Seite 1.1", $page1, 1);

Die Seite, die als "Seite 1.1" bezeichnet wird, gehört zum Kapitel 1. Deshalb wird in der entsprechenden Zeile der Rückgabewert $page1 anstatt einer willkürlichen Variablen mit angegeben.

Angabe von organisatorischen Informationen zur Datei

Die Angabe dieser Informationen ist optional. Das Dokument wird auch dann erstellt, wenn diese Angaben nicht gemacht werden.

pdf_set_info($doc, "Author", "Michael Stöckel");
// Autor der Datei
pdf_set_info($doc, "Title", "Testdatei");
// Titel des Dokumentes
pdf_set_info($doc, "Subject" , "Artikel");
// Betreff für das Dokument
pdf_set_info($doc, "Creator", "HTMLWorld");
// Weitere Details zum Ersteller

Definition von Schriften

Mit der Funktion pdf_set_parameter können individuelle Schriftarten eingebunden werden. Dabei muss der absolute Pfad zur Schriftdatei mit angegeben werden.

pdf_set_parameter($doc, "FontOutline", 
                  "Arial=C:/WINDOWS/Fonts/arial.ttf"); 
$font1 = PDF_findfont($doc, "Courier", "winansi", 0);
$font2 = PDF_findfont($doc, "Arial", "winansi", 1);

Mit der Funktion pdf_findfont werden die Schriften für das Dokument definiert. Für ein pdf-Dokument können mehrere Schriften definiert werden. Über den Rückgabewert der Definition(en) kann die gewünschte Schriftart jederzeit eingesetzt werden.
Für folgende Schriftarten ist die Funktion pdf_set_parameter nicht notwendig:
Courier, Courier-Bold, Courier-Oblique, Courier-BoldOblique, Helvetica, Helvetica-Bold, Helvetica-Oblique, Helvetica-BoldOblique, Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic, Symbol, ZapfDingbats

Beginn einer Seite im pdf-Dokument

Die Funktion pdf_begin_page eröffnet eine neue Seite. Sie muss zwingend zusammen mit der Funktion pdf_end_page angegeben werden da sonst eine Fehlermeldung erscheint.

pdf_begin_page($doc, 595, 842);

Die beiden Zahlen stellen die Breite und die Höhe des Dokumentes in Pixel da.

Die folgende Tabelle zeigt ein paar übliche Seitengößen und die notwendigen Angaben für die Funktion:

Größe Maße
A0 2380x3368
A1 1684x2380
A2 1190x1684
A3 842x1190
A4 595x842
A5 421x595
A6 297x421
B5 501x709
Letter (8.5"x11") 612x792
Legal (8.5"x14") 612x1008
Ledger (17"x11") 1224x792
11"x17" 792x1224

Einfügen von Textzeilen

Grundsätzlich gilt, dass jede Textzeile im pdf-Dokument separat eingefügt werden muss. Zwei Funktionen sind dazu notwendig:

pdf_setfont($doc, $font1, 20); 
pdf_show_xy($doc, "Test der PDFLib", 10, 500);

Mit der Funktion pdf_setfont wird zum einen die Schriftart und die Schriftgröße festgelegt, mit der der Text dargestellt werden soll.
Die Funktion pdf_show_xy bringt den Text in das eigentliche Dokument. Dazu muss der Text selbst und die Position, an der der Text erscheinen soll, angegeben werden. Der erste Wert gibt die x-Richtung und der zweite Wert die y-Richtung vor.

Mit der Funktion pdf_set_parameter() gibt es zudem die Möglichkeit, die betreffende Textzeile zu unterstreichen. Dazu muss vor und nach der pdf_show_xy-Zeile jeweils eine weitere Skriptzeile eingefügt werden, so dass der Code jetzt so aussieht (Schriftdefinition wird weggelassen):

pdf_set_parameter($doc,'underline','true');
pdf_show_xy($doc, 'Test der PDFLib', 10, 500);
pdf_set_parameter($doc,'underline','false');

Wichtig dabei ist, daß bei der ersten Zeile mit pdf_set_parameter der Parameter "true" mitgegeben wird. Bei der zweiten Zeile muss an der gleichen Stelle "false" eingetragen werden, um das aktuelle Unterstreichen "abschließen" zu können.

Zeichnen einer Linie

Um eine Linie in ein pdf-Dokument zu bekommen, sind immer vier Funktionen notwendig:

pdf_setlinewidth($doc,20);
pdf_moveto($doc, 100, 100);
pdf_lineto($doc, 200, 100);
pdf_stroke($doc);

Mit der Funktion pdf_setlinewidth, die zwingend zuerst angegeben werden muss, kann die Dicke der Linie verändert werden. Mit der Funktion pdf_moveto wird der Startpunkt der Linie festgelegt, mit pdf_lineto der Endpunkt und erst mit der Funktion pdf_stroke wird die Linie tatsächlich gezeichnet.

Einbinden eines Weblinks

Ein Link wird mit der Funktion pdf_add_weblink eingefügt:

pdf_add_weblink($doc, 10, 30, 150, 50, 
                "/");

Die angegebenen Zahlen sind die Koordinaten für die Positionierung des Weblinks.
Sie haben folgende Bedeutung:

1. Zahl: Startposition in x-Richtung
2. Zahl: Startposition in y-Richtung
3. Zahl: Endposition in x-Richtung
4. Zahl: Endposition in y-Richtung

Hinweis: Im pdf-Dokument wird nur ein Kasten angelegt. Wenn man mit der Maus darüber fährt, ändert sich der Cursor und in einem Meldefenster wird das Ziel des Weblinks angezeigt.
Wenn man einen Linktext angeben will, muss man eine Textzeile definieren und diese entsprechend über den Kasten des Weblinks positionieren.

Einbinden eines Bildes

Mit der Funktion pdf_load_image wird die Verwendung des Bildes "vorbereitet". Alle notwendigen Parameter werden festgelegt. Zum einen wird die Instanz für die aktuelle pdf-Datei angegeben und zum anderen der Typ des Bildes. Dabei handelt es sich nicht um den MIME-Type, sondern um eine explizite Angabe, die die PDFLib zur Interpretation braucht. Beispiel:

$pic = pdf_load_image($doc, "jpeg", "bild1a.jpg", "");
pdf_place_image($doc, $pic, 100, 200, .24);
pdf_close_image($doc, $pic);

Folgende Bildtypen werden unterstützt: jpeg, tiff, gif, png

Wie der Name schon sagt, platziert die Funktion pdf_place_image das Bild in der Datei. Die notwendigen Parameter sind die Instanz auf die Datei, die Instanz für das vorher vorbereitete Bild, Position in x-Richtung, Position in y-Richtung und der Wert für die Skalierung des Bildes. Für die Skalierung sind Werte zwischen 0.00 und 1.00 möglich.
Mit pdf_close_image wird die aktuelle Instanz für das Bild wieder geschlossen.

Du arbeitest in einer Agentur oder als Freelancer?
Dann wirf doch mal einen Blick auf unsere Software FeatValue.

Weiterlesen: ⯈ PHP Datentypen richtig benutzen

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Cookie-Einstellungen

Helfen Sie dabei, uns noch besser zu machen. Wir nutzen Cookies und ähnliche Technologien, um die Website auf Ihre Bedürfnisse anzupassen. Zur Datenschutzerklärung

Auswahl speichern