'."\n"; $debug=0; ?> PDF mit PHP @ PS-Trainer

PDF mit PHP

Acrobat-Dokumente mit PHP erstellen

Acrobat-PDF-(Portable Document Format)-Dokumente bieten einige Vorteile: Auf jedem PC lesbar, unabhängig von Betriebssystem, Hersteller und Version, mit und ohne Browser. Vor allem aber sind sie nur lesbar - ohne (einfache) Möglichkeit, die Originale zu ändern. PDF-Dokumente können verschiedene Eelemente enthalten: Text, gezeichnete Grafik, Bilder, Links, ...
PHP ist mit Hilfe des Moduls pdflib in der Lage, beliebige PDF-Dokumente zu erstellen.
PHP Hypertext Processor PHP PHP Hypertext Processor
Voraussetzungen Lesen (Acrobat Reader) und Herstellung von PDF-Dokumenten
PDFlib Modul PDFlib für PHP
PDF-Design Datenstrom oder PDF-Datei
Grundgerüst Herstellung eines Minimal-PDF-Dokuments mit PHP
Text Schrift - PostScript, Text
Objekt-Grafik Zeichnen mit PDF
Bilder Einbettung von Bild-Dateien
Links Ausgewählte PDF-Links Links zum Thema 'PDF mit PHP'

Voraussetzungen

für die Verwendung von PDF-Dokumenten und für deren Erstellung mit PHP
Verwendung von PDF-Dokumenten
Das Standard-Werkzeug zur Ansicht von PDF-Dokumenten ist der Acrobat Reader von Adobe. Sie erhalten den Reader kostenlos im Web von Adobe.
Tip: Installieren sie vorher alle Browser, in diesem Fall wird das Adobe-Reader-Plugin in alle installierten Browser eingefügt.
Erstellung von PDF-Dokumenten:
Besonders einfach ist die Herstellung mit OpenOffice. Für höhere Ansprüche benötigen sie Acrobat von Adobe.
Das Thema dieser Seite ist die Herstellung dynamischer PDF-Dokumente mit PHP: solche Dateien werden Live und 'vorprogrammiert' auf einem Webserver erzeugt.

Live-PDF-Test:

Wenn sie den Text auf der rechten Seite sehen, dann 'versteht' ihr Browser PDF-Dokumente.
Alternativ können sie das Test-Dokument 'PDF-Eigenschaften' auf einer eigenen Webseite anzeigen.
Dieses 'statische' PDF-Dokument wurde mit OpenOffice hergestellt.

Erstellung von PDF-Dokumenten mit PHP

PHP läuft normalerweise auf einem Webserver, z.B. Apache. Der Webserver muss installiert, konfiguriert, gestartet und getestet sein. Als Sonderfall ist es auch möglich, PHP als 'Standalone'-Programm zu verwenden.

Der Webserver muss PHP unterstützen: PHP muss installiert, konfiguriert und getestet sein.

PDFlib PHP muss mit PDFlib-Unterstützung erstellt bzw. konfiguriert sein (Details unter PHP-Module).
Die PDFlib ist für den privaten nichtkommerziellen Gebrauch kostenfrei erhältlich.
Details zur Installation und Konfiguration von Apache und PHP auf Windows finden sie auf der Webseite 'WAMP' (Windows, Apache, MySQL, PHP).

Zur Herstellung statischer PDF-Dokumente ist OpenOffice besonders geeignet. Optimale PDF-Dokumente erstellen sie mit den PDF-Standardschriften (s.u. PDF-Text), deren Installation sehr empfehlenswert ist.

Für größere Ansprüche benötigem sie Adobe Acrobat. Die Adobe-Webseite bietet Details zu diesem Programm. Auch Programme anderer Hersteller bieten gute PDF-Funktionalität.

PHP-Modul   PDFlib

Zur Erstellung von PDF-Dokumenten verwendet PHP die PDFlib. Sie müssen zunächst feststellen, ob ihre PHP-Version das Modul enthält.
Die Variable $pdfok wird true gesetzt, wenn das Modul geladen ist.
Details zu PHP-Modulen
$pdfok = 0;
$module = get_loaded_extensions();
if (in_array("pdf", $module)) {$pdfok++;}
Live-Live-PHP-PHP:  
Einige Provider von Webspace laden nur wenige Module ständig. Das beschleunigt die Ausführung von PHP-Scripts. Alternativ können sie Module wie pdf zur Laufzeit laden.
Dazu wird die Funktion dl verwendet, die allerdings aus Sicherheitsgründen nur in jenen Pfaden sucht, welche in der Konfiguration php.ini unter 'extension_dir' angeführt sind.
Danach sind Modul und Funktionen bis zum Ende der Script-Datei verfügbar.
(Auskunft beim Provider einholen)
So wird Modul pdf zur Laufzeit geladen:
Dateiname der Bibliothek ohne Pfad !
if (!extension_loaded("pdf") {
dl('libpdf_php.so');
}
if (extension_loaded("pdf") {$pdfok++;}
Live-Live-PHP-PHP:  
PDF entwickelt sich relativ rasch. Daher sind zahlreiche PDFlib- Versionen verfügbar, die unterschiedliche Funktionen unterstützen. Das Beispiel zeigt, wie alle enthaltenen Funktionen von PDFlib ausgegeben werden.
if($pdfok) {
$func = get_extension_funcs('pdf');
$c = count($func);
print "Liste der $c pdf-Funktionen: ";
sort($func);
foreach ($func as $f) {print "$f, ";}
}
Liste der $c verfügbaren pdf-Funktionen:
\n"; sort($func); foreach ($func as $f) {print "$f, ";} print "
\n"; } else {print "\t\t\tKeine pdf-Funktionen für PHP verfügbar.
\n";} ?>
Falls die PDFlib in ihrer PHP-Version nicht enthalten ist:
Laden sie aus dem Internet die neueste stabile Version von PHP, installieren sie das PDF-Modul und konfigurieren sie PHP (Windows).
Testen sie PHP und das Modul nach Installation.
Tipp: Besorgen sie sich (aus dem Internet) möglichst auch die PDF-Standard-Schriften (s.u.).

PDF-Design

Das Acrobat-Format wurde zur Erstellung gedruckter Seiten erfunden. Aus dieser Tradition stammen die Design-Prinzipien:
Ein Dokument ist in Seiten gegliedert.
Die Seiten haben ein fixes Format, z.B. A4 Hochformat.
Die Position jedes Elements wird von der linken unteren Ecke gemessen.
Schriften (fonts) haben große Bedeutung - ähnlicher dem grafischen Gewerbe als der Informatik.

Zielsetzung dieser Webseite: Eine knappe Darstellung der Design-Methoden für PDF-Seiten mit einigen Beispielen.
Detaillierte References, Tutorials usw. gibt es zahlreich und in guter Qualität im Web.
PHP-Strategie:
2 verschiedene Wege zur PDF-Erstellung sind möglich:

PHP erstellt das PDF-Dokument und sendet es als binären Datenstrom an den Browser. Diese Methode eignet sich für sehr kurzlebige Dokumente, oder für solche, die nur für eine einzige Anfrage erstellt wurden.

PHP erstellt eine 'echte' PDF-Datei, die am Server gespeichert wird. Diese Datei kann wie jede andere von Browser-Clients abgerufen werden. Diese Methode eignet sich für wiederverwendbare Dokumente.

PDF-Grundgerüst

Wenn ein pdf-Datenstrom erzeugt werden soll, dann bleibt der Dateiname ($outname) leer. Wenn eine Datei erzeugt wird, dann wird ein Dateiname (Pfad) eingesetzt.
Zu Beginn wird ein neues pdf-Objekt erzeugt (hier $pdf). Jede pdf-Funktion erhält dieses Objekt als Argument.
Das Funktions-Paar pdf_open_file und pdf_close bezeichnet Beginn und Ende der Datei.
Eine Datei enthält Informationen (z.B. Creator) und beliebig viele Seiten.
Das Funktions-Paar pdf_begin_page und pdf_end_page bezeichnet Beginn und Ende einer Seite.
Innerhalb der Seite werden die anzuzeigenden Objekte (Text, Grafik, Links, ...) erstellt.
Wenn eine Datei erstellt wurde, dann ist das PDF-Grundgerüst hier beendet, ansonsten folgt noch die Übersendung des Dokuments als Datenstrom.

Achtung: neuere Versionen der PDFlib verwenden für das Grundgerüst teilweise andere Funktionen. Konsultieren sie dazu die Dokumentation ihrer PDFlib-Version.
// Dateiname
$outname="";
// Beginn pdf-Dokument
$pdf = PDF_new();
pdf_open_file($pdf,$outname);
pdf_set_info($pdf,"Creator","PDFlib");
pdf_begin_page($pdf,360,250);
// PDF-Inhalt hier einfügen
pdf_end_page($pdf);
pdf_close($pdf);
// Ende pdf-Dokument

// Datenstrom senden
$pdf_data = pdf_get_buffer($pdf);
$cl = strlen($pdf_data);
header("Content-type: application/pdf");
header("Content-disposition: inline; filename=demo.pdf");
header("Content-length: $cl";
print $pdf_data;

PDF-Text

Text wird mit Hilfe eines Font-Objekts erstellt. Funktion pdf_findfont erstellt ein Font-Objekt (hier $f) mit Hilfe einer installierten oder 'internen' Schrift. Jede folgende Text-Funktion verwendet dieses (oder ein anderes) Font-Objekt.
Funktion pdf_show_xy schreibt Text an die angegebene Stelle (Koordinaten in Pixel von links unten).
Funktion pdf_setcolor definiert eine Farbe. Sie wird solange verwendet, bis eine andere Farbe definiert wird.
$f = pdf_findfont($pdf, "Helvetica-Bold", "winansi",0);

pdf_setfont($pdf, $f, 12);
pdf_show_xy($pdf, "PDFlib",10, 185);

pdf_setcolor($pdf,"fillstroke","rgb",0,0,0.5,0);
pdf_setfont($pdf, $f, 12);
$s = strftime("%H:%M:%S",time());
pdf_show_xy($pdf, "Server-Zeit: $s", 10,170);
PDF-Dokumente achten genau auf die verwendete Schrift und verlassen sich nicht auf 'irgendeine' Schrift am Ziel-PC. Verwendete Schriften (Postscript, TrueType) werden daher normalerweise zusammen mit der gesamten Metrik in einem pdf-Dokument inkludiert.
Um das zu verhindern, verwenden sie am besten eine der 14 'internen' Schriften der PDFlib (siehe rechts ihre Simulation auf dieser Webseite).
Die 14 'internen' Schriften der PDFlib (Groß/Klein-Schreibung der Schriftnamen genau beachten):
Courier, Courier-Bold, Courier-Oblique, Courier-BoldOblique,
Helvetica, Helvetica-Bold, Helvetica-Oblique, Helvetica-BoldOblique,
Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic,
Symbol, ZapfDingbats
Besorgen sie sich (Internet) die PostScript-Schriften (Courier.afm, Courier-Bold.afm, ... ZapfDingbats.afm) und installieren sie die Schriften in ihrem Betriebssystem. Das oben eingefügte PDF-Test-Dokument hat mit üblichen Win-Schriften (Arial, Times New Roman) eine Größe von ca. 60kb, mit PDF-Standard-Schriften (Helvetica, Times) nur ca. 8kb !

PDF-Grafik

Grafik-Objekte werden zuerst 'zusammengestellt', danach 'gezeichnet'. Vor dem Zeichnen ist das Objekt nicht sichtbar.
Beispiel Kreis: mit pdf_circle wird das Objekt erzeugt, (erst) mit pdf_stroke gezeichnet.

Linien und Linienzüge werden so erstellt:
mit pdf_moveto bewegt man sich zum Anfangspunkt,
mit pdf_linto wird eine Linie zum (nächsten) Endpunkt gezogen.
Zuletzt wird mit pdf_stroke, pdf_fill oder pdf_fillstroke gezeichnet.

Farben werden mit pdf_setcolor definiert. Jede Definition gilt, solange sie nicht durch eine andere ersetzt wird.
pdf_setcolor($pdf,"fillstroke","rgb",0,0,0,0);
pdf_circle($pdf,$mx,$my,$r);
pdf_stroke($pdf);
pdf_moveto($pdf,$mx+$x,$my+$y);
$x=$rhs*sin($wb);
$y=$rhs*cos($wb);
pdf_lineto($pdf,$mx+$x,$my+$y);
pdf_stroke($pdf);
pdf_setcolor($pdf,"fillstroke","rgb",0,0,1,0);
pdf_moveto($pdf,$mx,$my);
$x=$rm*sin($wb);
$y=$rm*cos($wb);
pdf_lineto($pdf,$mx+$x,$my+$y);
pdf_stroke($pdf);
pdf_setcolor($pdf,"fillstroke","rgb",0,0,1,0);
pdf_moveto($pdf,$mx,$my);
$x=$rh*sin($wb);
$y=$rh*cos($wb);
pdf_lineto($pdf,$mx+$x,$my+$y);
pdf_stroke($pdf);
pdf_setcolor($pdf,"fillstroke","rgb",1,0,0,0);
pdf_circle($pdf,$mx,$my,$rmp);
pdf_fill_stroke($pdf);

PDF-Bilder

Funktion pdf_load_image erzeugt ein Bild-Objekt (hier $img), welches mit anderen Bild-Funktionen weiter verarbeitet werden kann.
Das Bild wird mit pdf_fit_image positioniert, zuletzt mit pdf_close_image geschlossen.
$img=pdf_load_image($pdf,"jpeg",$imgname,"");
pdf_fit_image($pdf,$img,150,0,"");
pdf_close_image($pdf,$img);

Ausgewählte Links zum Thema 'PDF mit PHP'

PDFlib PDFlib.com - Die Homepage der PDFlib. PHP.net: PDF-Funktionen (en, de)
PHP.de - Forum
PHP-Resource.de - Forum, Scripts, Tutorials
Sourceforge - Projekt pdf-php

 
n immer im Quelltext der gleichen Webseite gesucht wird.
HTML-Links können an viele Objekte gebunden werden, z.B. an Texte oder an Bilder.
<a href="javascript:get_test1()" target="_self">
  <img src="demon.gif">
</a>

Grafik-Button fordert CGI an

Versteckte Formulare:

HTML kennt für Formulare den Feld-Typ hidden
Derartige Felder können beliebige Texte enthalten, sind jedoch nicht sichtbar. Mit Javascript kann man allerdings auch in diese Felder Texte eintragen, z.B. Datum und Zeit.
Beim Absenden werden versteckte Daten genauso als Argumente gesendet wie Daten aus sichtbaren Feldern.
Im Extremfall kann ein Formular ausschließlich versteckte Felder enthalten.
<form name="fgh" method="get" action="/cgi-bin/perlget.pl">
<input type="hidden" name="date">
<input type="hidden" name="time">
</form>

URL-(GET)-Codierung mit Javascript

Javascript bietet einige Methoden zur Anforderung von Webseiten (open, location.href, ..)
Dabei wird die Adresse der angeforderten Seite als Text (String) formuliert.
Wenn man an den Datei-Pfad eine GET-Anforderung anhängt, dann lassen sich damit auch dynamische Webseiten anfordern, deren Argumente von Javascript programmiert wurden.

Vorteil: Man kann auf ein HTML-Formular ganz verzichten.
Nachteil: Die Codierung des URL-Strings muss selbst durchgeführt werden.
Details zur URL-Codierung.
function get_test2() {
var wert=new Date();
var target="/cgi-bin/cppget?test="+wert;
alert("Fenster wird geöffnet");
var xy="height=300,width=475,left=100,top=100";
testwindow = open(target,"testdata", xy);
}

<a href="javascript:get_test2()">
Neues Fenster öffnen
</a>