| |
| * Link führt ins Internet |
|
| |
Im folgenden Abschnitt werden wir Ihnen einige Funktionen vorstellen und aufzeigen, wie Sie auf einfache Weise eine PDF-Datei via PHP erzeugen können.
Einfaches Dokument
Der Einstieg in die Erzeugung von PDF-Dokumenten via PHP ist recht simpel. Das folgende Beispiel erzeugt bereits ein gültiges PDF-Dokument und schreibt es in die Datei testdok.pdf.
Beispiel
<?php
$datei = fopen("testdok.pdf", "w");
$dokument = pdf_open($datei);
pdf_begin_page($dokument, 200, 200);
pdf_end_page($dokument);
pdf_close($dokument);
fclose($datei);
?>
|
Das Dokument enthält lediglich eine leere Seite. Initialisiert wird ein PDF-Dokument immer mit der Funktion pdf_open(), die in diesem Fall den Dateizeiger $datei übergeben bekommt. Dies führt dazu, dass das Dokument in einer Datei abgelegt wird. Alternativ könnte das Argument für pdf_open() auch entfallen, und das Dokument wird im Speicher erzeugt und seitenweise an die Standardausgabe übergeben. Die Erzeugung des Dokuments im Speicher ist insbesondere im Web-Serverbetrieb von Vorteil, da keine Datei in das Dateisystem geschrieben werden muss und das Dokument ohne Umwege an den Browser ausgegeben wird. Geschlossen wird das Dokument mit pdf_close().
PDF-Dokumente sind wie PostScript-Dokumente seitenorientiert. Bevor also irgendwelche Ausgaben gemacht werden können, muss eine Seite generiert werden. Die Funktion pdf_begin_page() erzeugt eine solche Seite und bestimmt gleichzeitig deren Größe in PostScript-Punkten. Natürlich müssen auch Seiten beendet werden, was mit Hilfe der Funktion pdf_end_page() erfolgt. Nach dem Beenden einer Seite sind keinerlei Veränderung mehr möglich.
Einsatz von Text
Das folgende Beispiel stellt auf einfache Weise dar, wie innerhalb eines PDF-Dokuments Text abgelegt werden kann. Zusätzlich machen Sie erste Erfahrungen mit dem Koordinatensystem einer PDF-Seite.
Beispiel
<?php
$datei = fopen("testdok2.pdf", "w");
$dokument = pdf_open($datei);
pdf_begin_page($dokument, 200, 200);
pdf_set_font($dokument, "Arial", 24, "host");
pdf_set_text_pos($dokument, 100, 100);
pdf_show($dokument, "Ihr erster Text im Dokument");
pdf_end_page($dokument);
pdf_close($dokument);
fclose($datei);
?>
|
Wesentliche Bestandteile des Skripts wurden aus dem ersten Beispiel übernommen, hinzu kommen lediglich die drei Funktionen zur Auswahl des Zeichensatzes pdf_set_font(), zum Setzen der Ausgabeposition pdf_set_text_pos() und die eigentliche Textausgabefunktion pdf_show(). Das Ergebnis ist ein Text in Arial mit der Größe 24pt. Der letzte Parameter von pdf_set_font() gibt das Encoding des Zeichensatzes an. Mit host liegt man in der Regel richtig. Der Ursprung des PDF-Koordinatensystem liegt, wie Sie bereits erfahren haben, in der linken unteren Ecke, der Text erscheint also jeweils 100 Punkte vom linken und unteren Rand entfernt.
Fallbeispiel für die Berechnung
100 Punkte entsprechen 100/72*2.54cm=3.528cm
Einsatz von Geometrischen Formen
Der Einsatz von Text innerhalb eines PDF-Dokuments ist jedoch noch lange nicht alles. Mit Hilfe der pdflib lassen sich zusätzlich geometrische Formen erzeugen. Auch das kann PDF, man sollte jedoch im klaren darüber sein, dass dies immer zwei Schritte erfordert:
. Im ersten Schritt wird ein so genannter Pfad durch die Zeichenfunktionen erzeugt.
. Im zweiten Schritt wird dieser Pfad gezeichnet oder anderweitig verwendet.
Sie werden im folgenden Beispiel erfahren, was notwendig ist um eine diagonale Linie zu realisieren.
Beispiel
<?php
$datei = fopen("testdok3.pdf", "w");
$dokument = pdf_open($datei);
pdf_begin_page($dokument, 200, 200);
pdf_moveto($dokument, 50, 50);
pdf_lineto($dokument, 100, 100);
pdf_stroke($dokument);
pdf_end_page($dokument);
pdf_close($dokument);
fclose($datei);
?>
|
Auch in diesem Fall sind wieder drei neue Funktionen zum Einsatz gekommen. Mit Hilfe der Funktion pdf_moveto() setzen Sie den Ausgangspunkt der Linie. Die Funktion pdf_lineto() fügt ein Liniensegment dem aktuellen Pfad hinzu und erst die Funktion pdf_stroke() zeichnet den aktuellen Pfad, also die eigentliche Linie. Das mag kompliziert klingen, macht aber Sinn, sobald Sie die weiteren Möglichkeiten mit Pfaden zu arbeiten kennen gelernt haben. So ist es beispielsweise möglich einem Pfad mit einer Farbe oder einem Muster zu füllen, auch kann ein Pfad als Begrenzung anderer Bildteile verwendet werden. Pfade werden damit zu einem leistungsfähigen Werkzeuge.
Um diese Aussage zu untermauern, sollten Sie sich folgendes Beispiel betrachten:
<?php
$datei = fopen("testdok4.pdf", "w");
$dokument = pdf_open($datei);
pdf_begin_page($dokument, 400, 400);
pdf_moveto($dokument, 100, 100);
pdf_lineto($dokument, 200, 200);
pdf_lineto($dokument, 100, 200);
pdf_closepath_fill_stroke($dokument);
pdf_circle($dokument, 300, 250, 50);
pdf_stroke($dokument);
pdf_rect($dokument, 100, 210, 120, 120);
pdf_stroke($dokument);
pdf_end_page($dokument);
pdf_close($dokument);
fclose($datei);
?>
|
Auch in diesem Beispiel wird deutlich, das die Zeichenoperation erst dann ausgeführt wird, wenn pdf_stroke() oder wie im vorliegenden Beispiel pdf_closepath_fill_stroke() aufgerufen wird. Mit pdf_closepath_fill_stroke() wird zunächst der Pfad geschlossen, das Dreieck wurde nur mit zwei pdf_lineto() Anweisungen gezeichnet, und danach gefüllt und gezeichnet.
Sollten Sie die Strichstärke verändern wollen steht Ihnen die Funktion pdf_setlinewidth() zur Verfügung. Übergabeparameter sind das PDF-Dokument und die Breite der Linie in Punkten.
Beispiel
<?php
$datei = fopen("testdok5.pdf", "w");
$dokument = pdf_open($datei);
pdf_begin_page($dokument, 400, 400);
pdf_setlinewidth($dokument, 5);
pdf_rect($dokument, 100, 210, 120, 120);
pdf_stroke($dokument);
pdf_end_page($dokument);
pdf_close($dokument);
fclose($datei);
?>
|
Einbinden von Bildern
Als nächstes wenden wir uns dem einbinden von Bildern zu. PDF-Dokumente können wie auch HTML-Dokumente Bilder enthalten. Im Unterschied zu HTML werden die Bilder jedoch direkt in das Dokument eingebettet und nicht auf eine externe Datei verwiesen. Das hat insbesondere den Vorteil, dass Sie beim Datenaustausch nur eine Datei übertragen müssen. Sie sollten sich folgendes Beispiel betrachten:
<?php
$datei = fopen("testdok6.pdf", "w");
$dokument = pdf_open($datei);
pdf_begin_page($dokument, 400, 400);
$bild = pdf_open_image_file($dokument, "jpeg", "logo.jpg");
pdf_place_image($dokument, $bild, 10, 10, 1);
pdf_end_page($dokument);
pdf_close($dokument);
fclose($datei);
?>
|
Ein Bild muss zunächst unter Angabe des Formats jpeg und des Dateinamens mit der Funktion pdf_open_image_file() geladen werden. Die Platzierung erfolgt anschliessend mit Hilfe der Funktion pdf_place_image(). Bei der Platzierung kann zu der Position auch noch ein Skalierungsfaktor angegeben werden. In diesem Fall ist er auf 1 (100%) gesetzt. Neben JPEG können auch die Formate GIF, TIFF und PNG eingelesen werden.
Die Zweiteilung der Einbindung eines Bildes hat im übrigen einen guten Grund. Sie können ein Bild mehrfach verwenden, ohne jedes mal das Bild in das PDF-Dokument einzubetten. Die Funktion pdf_place_image() schreibt intern lediglich einen Verweis auf das bereits im Dokument befindliche Bild. Der Speicherplatzbedarf kann dadurch erheblich reduziert werden.
Machen Sie doch einfach mal folgenden Test. Platzieren Sie das Bild mehrere mal auf der Seite und vergleichen Sie die Dateigrößen der PDF-Dokumente.
Beispiel
<?php
$datei = fopen("testdok7.pdf", "w");
$dokument = pdf_open($datei);
pdf_begin_page($dokument, 400, 400);
$bild = pdf_open_image_file($dokument, "jpeg", "logo.jpg");
for($i=0; $i<10; $i++) {
pdf_place_image($dokument, $bild, 10, 10, 1);
pdf_rotate($dokument, 10);
}
pdf_end_page($dokument);
pdf_close($dokument);
fclose($datei);
?>
|
Das PDF-Dokument aus dem ersten Beispiel besitzt eine Größe von 17.525 Bytes. Das zweiten Beispiel ist mit 17.554 Bytes nur geringfügig größer. Wie wichtig diese Eigenschaft sein kann, werden Sie spätestens dann feststellen, wenn Sie das erste mehrseitige Dokument erstellen, welches auf jeder Seite das Firmenlogo benötigt.
Das Laden eines Bildes muss übrigens nicht zwingend innerhalb einer Seite erfolgen. Insbesondere bei der Verwendung eines Bildes auf mehreren Seiten bietet es sich an, das Bild schon vor der ersten Seite zu laden. So wie im folgenden Beispiel.
<?php
$datei = fopen("testdok8.pdf", "w");
$dokument = pdf_open($datei);
$bild = pdf_open_image_file($dokument, "jpeg", "logo.jpg");
$skalierung = 0.5;
$breite = pdf_get_image_width($dokument, $bild) * $skalierung;
$hoehe = pdf_get_image_height($dokument, $bild) * $skalierung;
$margin = (400-$breite)/2;
pdf_begin_page($dokument, 400, 500);
pdf_place_image($dokument, $bild, $margin, 500-$hoehe, $skalierung);
pdf_end_page($dokument);
pdf_close($dokument);
fclose($datei);
?>
|
Sie werden sicher bemerkt haben, dass das Beispiel mit zwei neue Funktion ausgestattet wurde, um das Bild am Kopf der Seite mit gleichen Ränder nach links, rechts und oben zu platzieren. Die Funktion pdf_get_image_width() und pdf_get_image_height() liefern die Breite bzw. Höhe eines Bildes. Mit ihnen lässt sich bei bekannter Breite und Höhe der Seite das Bild entsprechend zentrieren. Die Anpassung hierfür ist nicht sonderlich schwer, wie folgendes Beispiel zeigt:
<?php
$datei = fopen("testdok9.pdf", "w");
$dokument = pdf_open($datei);
$bild = pdf_open_image_file($dokument, "jpeg", "logo.jpg");
$skalierung = 1;
$breite = pdf_get_image_width($dokument, $bild) * $skalierung;
$hoehe = pdf_get_image_height($dokument, $bild) * $skalierung;
$marginbreite = (400-$breite)/2;
$marginhoehe = (500-$hoehe)/2;
pdf_begin_page($dokument, 400, 500);
pdf_place_image($dokument, $bild, $marginbreite, $marginhoehe, $skalierung);
pdf_end_page($dokument);
pdf_close($dokument);
fclose($datei);
?>
|
Erweiterte Textausgabe
Die Textausgabe ist eine elementare Funktion, die in kaum einer Grafikbibliothek fehlt. PDF als eher textlastiges Ausgabeformat darf da keineswegs zurückstehen und bietet daher eine Vielzahl von Textausgabemöglichkeiten an.
Konzentriert man sich auf die 35 Standardschriften, zu denen auch Arial, Times und Helvetica gehören, lässt sich leicht ein PDF-Dokument erstellen, das auf jedem System dargestellt werden kann.
Beispiel
<?php
$datei = fopen("testdok10.pdf", "w");
$groesse = 72;
$dokbreite = 500;
$dokhoehe = 400;
$dokument = pdf_open($datei);
pdf_begin_page($dokument, $dokbreite, $dokhoehe);
pdf_set_font($dokument, "Arial", $groesse, "host");
$breite = pdf_stringwidth($dokument, "AtomicScript");
$marginbreite = ($dokbreite-$breite)/2;
$marginhoehe = ($dokhoehe -$groesse)/2;
pdf_set_text_pos($dokument, $marginbreite, $marginhoehe);
pdf_show($dokument, "AtomicScript");
pdf_end_page($dokument);
pdf_close($dokument);
fclose($datei);
?>
|
Auch in diesem Fall erfolgt eine Zentrierung des Textes.
Nun bestehen Texte in der Regel nicht nur aus einigen wenigen Worten, welche in eine Zeile passen, daher muss bei längeren Texten ein Umbruch der Zeilen erfolgen. Dies kann man, mit Hilfe der Funktion pdf_stringwidth() und der Einzelpositionierung der Worte realisieren oder auf die Funktion pdf_show_boxed() zurückgreifen. Die Funktion pdf_show_boxed() bricht den Text in einer vorgegebenen Box zeilenweise um und liefert zudem die Anzahl der Zeichen, die nicht mehr in die Box passten zurück. Mit dieser Information lässt sich Text leicht über mehrere Boxen verteilen und optimal darstellen.
Beispiel
<?php
$datei = fopen("testdok11.pdf", "w");
$dokument = pdf_open($datei);
pdf_begin_page($dokument, 400, 500);
pdf_set_font($dokument, "Arial", 12, "host");
$text =
"In diesem Kapitel werden wir uns mit den Objekten ".
"auseinandersetzen Sie erfahren, wie sie Objekte ".
"nutzen und erzeugen können und was Eigenschaften ".
"und Methoden sind. Zusätzlich bietet Ihnen dieses ".
"Kapitel eine Einführung und Vertiefung in die ".
"objektorientierte Programmierung aus Sichtweise ".
"des PHP Entwickler durchleuchten werden und nicht ".
"aus der Sichtweise eines Informatikers. ";
$pos = pdf_show_boxed($dokument, $text, 20.0, 350.0, 170.0, 100.0, "justify");
$pos = pdf_show_boxed($dokument, substr($text, -$pos), 210.0, 350.0, 170.0, 100.0, "justify");
pdf_end_page($dokument);
pdf_close($dokument);
fclose($datei);
?>
|
Einsatz von Bookmarks
Eine weitere nützliche Eigenschaft von PDF-Dokumenten sind Lesezeichen (Bookmarks). Sie ermöglichen das Verzweigen auf eine Seite des Dokuments aus einer hierarchischen Übersicht. Erstellt wird eine solche Übersicht mit Hilfe der Funktion pdf_add_bookmark(). Die hierarchische Anordnung wird durch einen optionalen Parameter der Funktion erreicht, welcher die Hauptgruppe (Mutter) des neuen Bookmarks festlegt.Jeder neuen Hauptgruppe könne Sie weitere Untergruppen zuweisen, welche wiederum eigene Untergruppen besitzen können. Eine Untergruppe kann somit selbst zu einer Hauptgruppe werden und weitere Bookmarks enthalten. Ein weiterer optionaler Parameter offen legt fest, ob die Übersicht einer bestimmten Gruppe beim Öffnen des PDF-Dokuments ein- oder ausgeklappt sein soll. Soll also die Übersicht ausgeklappt sein, so brauchen Sie lediglich offen einen Werte ungleich 0 zuweisen.
Beispiel
<?php
$ebene1 = "1. Thema";
$ebene2 = "1.1 Thema";
$ebene3 = "2. Thema";
$ebene4 = "2.1 Thema";
$ebene5 = "2.2 Thema";
$datei = fopen("testdok12.pdf", "w");
$dokument = pdf_open($datei);
pdf_begin_page($dokument, 400, 500);
$m1 = pdf_add_bookmark($dokument, $ebene1);
$m2 = pdf_add_bookmark($dokument, $ebene2, $m1);
$m3 = pdf_add_bookmark($dokument, $ebene3, $_x,1);
$m4 = pdf_add_bookmark($dokument, $ebene4, $m3);
$m5 = pdf_add_bookmark($dokument, $ebene5, $m4);
$bild = pdf_open_image_file($dokument, "jpeg", "logo.jpg");
pdf_end_page($dokument);
pdf_close($dokument);
fclose($datei);
?>
|
Einsatz von Hyperlinks
Ein wesentlicher Punkt des Internet sind die Verweise zwischen Webseiten. Ein Dokumentenformat, welche keine Hyperlinks unterstützt, schränkt den Einsatzbereich deutlich ein. Daher unterstützt PDF neben Verweisen innerhalb des Dokuments auch Verweise auf Ressourcen im Internet. Realisiert wird dies durch die Funktion pdf_add_weblink(). In folgendem Beispiel wird ein Hyperlink auf die Website www.atomicscript.de gesetzt.
Beispiel
<?php
$datei = fopen("testdok13.pdf", "w");
$dokument = pdf_open($datei);
$bild = pdf_open_image_file($dokument, "jpeg", "logo.jpg");
$skalierung = 1;
$breite = pdf_get_image_width($dokument, $bild) * $skalierung;
$hoehe = pdf_get_image_height($dokument, $bild) * $skalierung;
$marginbreite = (400-$breite)/2;
$marginhoehe = (500-$hoehe)/2;
pdf_begin_page($dokument, 400, 500);
pdf_place_image($dokument, $bild, $marginbreite, $marginhoehe, $skalierung);
pdf_add_weblink($dokument, $marginbreite, $marginhoehe, $marginbreite+$breite, $marginhoehe+$hoehe, "www.atomicscript.de");
pdf_end_page($dokument);
pdf_close($dokument);
fclose($datei);
?>
|
|
|
|
|
|
|
|