Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Geleitwort
Vorwort
1 PEAR – Einführung
2 Authentication
3 Caching
4 Date and Time
5 File Formats
6 HTTP
7 Internationalization
8 Mail
9 Networking
10 PHP
11 Text
12 Web Services
13 Benchmarking
14 Configuration
15 Database
16 File System
17 HTML
18 Images
19 Logging
20 Math
21 Numbers
22 Tools and Utilities
23 XML
24 Selbst Pakete erstellen
25 PECL
Index
Ihre Meinung?

Spacer
 <<   zurück
PHP PEAR von Carsten Möhrke
Anwendung und Entwicklung – Erweiterungen für PHP schreiben
Buch: PHP PEAR

PHP PEAR
798 S., 39,90 Euro
Rheinwerk Computing
ISBN 3-89842-580-0
gp 5 File Formats
  gp 5.1 Contact_Vcard_Build
  gp 5.2 Contact_Vcard_Parse
  gp 5.3 MP3_ID
  gp 5.4 Archive_Tar
  gp 5.5 File_Passwd
    gp 5.5.1 Grundsätzliche Funktionsweise
    gp 5.5.2 .htpasswd-Dateien
    gp 5.5.3 Unix-User verwalten
    gp 5.5.4 Samba-Passwort-Dateien
    gp 5.5.5 CVS-Passwort-Dateien
  gp 5.6 File_HtAccess
  gp 5.7 Spreadsheet_Excel_Writer
    gp 5.7.1 Arbeitsblätter
    gp 5.7.2 Tabellenfelder
    gp 5.7.3 Drucken
  gp 5.8 File_PDF


Rheinwerk Computing

5.8 File_PDF  toptop


Besprochene Version: 0.0.1 Lizenz: LGPL
Klassendatei(en): File/PDF.php

Auch wenn File_PDF zurzeit noch in einer recht frühen Version vorliegt, ist das Paket weitgehend stabil, da es sich um eine Portierung handelt, der die altbewährte fpdf-Klasse zugrunde liegt. Zugegebenermaßen treten momentan aber noch einige Fehler auf. Insbesondere eine automatische Ausgabe über mehrere Seiten sowie die Ausgabe von Links funktionieren zurzeit noch nicht. Daher habe ich mich hier darauf beschränkt, die momentan stabilen Features zu beschreiben, so dass Sie die hier genannten Funktionalitäten problemlos nutzen können.

Zwar deckt File_PDF nicht den kompletten Leistungsumfang von PDF-Dateien wie Formulare oder JavaScript ab, aber die meisten der relevanten Funktionen sind enthalten.

require_once('PEAR.php'); 
require_once('File/PDF.php'); 
 
// Neues Objekt ableiten 
$pdf=File_PDF::factory(); 
// Datei initialisieren 
$pdf->open(); 
// Seite hinzufuegen 
$pdf->addPage(); 
// Schriftart festlegen 
$erg=$pdf->setFont('Arial'); 
// Fehler beim Laden der Schrift? 
if (true===PEAR::isError($erg)) 
{ 
   die ($erg->getmessage()); 
} 
// Schriftgroesse festlegen (in Punkt) 
$erg=$pdf->setFontSize(20); 
// Textfeld einfuegen 
$pdf->write(10,'Hallo Welt!'); 
// Datei an Browser senden 
$erg=$pdf->output(); 
if (true===PEAR::isError($erg)) 
{ 
   die ($erg->getMessage()); 
}

Listing 5.12 Generieren einer PDF-Datei mit File_PDF

Im obigen Listing finden Sie ein einfaches Beispiel, wie eine PDF-Datei mithilfe von File_PDF erstellt werden kann.

Die Klasse File_PDF nutzt das PEAR-Error-Handling, bindet die Datei PEAR.php aber erst dann ein, wenn ein Fehler auftritt. Möchten Sie mithilfe von PEAR::isError() testen, ob ein Fehler aufgetreten ist, so müssen Sie PEAR.php manuell einbinden.

Die Klasse benutzt keinen klassischen Konstruktor, sondern eine Methode namens factory(). Diese liefert ein File_PDF-Objekt zurück und kann ohne Parameter aufgerufen werden. Allerdings können Sie ihr Parameter übergeben, um grundlegende Einstellungen zu definieren. Als ersten Parameter können Sie hierbei den Buchstaben 'P' oder 'L' übergeben, womit definiert wird, ob eine Hochformat-Darstellung (Portrait) oder eine Querformat-Darstellung (Landscape) genutzt werden soll. Darüber hinaus akzeptiert sie als zweiten Parameter die Angabe der Maßeinheit, die in dem Dokument genutzt werden soll. Standardmäßig geht das Paket davon aus, dass alle Angaben in Millimeter erfolgen, was Sie auch explizit festlegen können, indem Sie 'mm' angeben. Alternativ können Sie 'pt' für Punkt, 'cm' für Zentimeter und 'in' für Inch (Zoll) angeben. Mit einem dritten Parameter können Sie die Blattgröße festlegen. Hierbei können Sie eines der folgenden Formate nutzen: 'A3', 'A4' (Standard), 'A5', 'Letter' oder 'Legal'. Wie Sie sehen, sind leider keine Über- oder Sonderformate definiert. Wünschen Sie ein Sonderformat, ist es möglich, die Blattgröße in Form eines Arrays zu übergeben, wobei das erste Feld die Breite und das zweite die Höhe enthält. Die Angaben sind dabei in der Maßeinheit zu tätigen, die Sie vorher festgelegt haben.

Die Methode open() akzeptiert keine Parameter und dient lediglich dazu, die Datei korrekt zu initialisieren.

Um Elemente ausgeben zu können, müssen Sie mindestens eine Seite hinzufügen, wozu die Methode addPage() vorgesehen ist. Jeder Aufruf fügt standardmäßig eine neue Seite in der vorgegebenen Ausrichtung in das Dokument ein. Allerdings können Sie auch hier wieder ein 'P' oder 'L' übergeben, um die Ausrichtung dieser einzelnen Seite zu manipulieren.

Um einen Text mithilfe von write() ausgeben zu können, muss zuvor die Schriftart selektiert werden. Hierzu habe ich zum Ersten die Schriftart mit setFont('Arial') selektiert. Das Paket wird standardmäßig mit den Schriftarten Courier, Helvetica (entspricht Arial), Times, Symbol und ZapfDingbats ausgeliefert, die hier alle angegeben werden können. [Um eine andere Schriftart zu nutzen, muss die Font-Datei zuerst konvertiert werden. Eine Anleitung dazu finden Sie auf www.fpdf.org. ] Sie können auch direkt zwei weitere Werte übergeben, um das Erscheinungsbild der Schrift zu beeinflussen. Übergeben Sie den zweiten Parameter nicht oder übergeben Sie einen leeren String, so wird der normale Schriftschnitt genutzt. Um eine fette Darstellung zu erhalten, können Sie den String 'B' für bold übergeben. Des Weiteren sind 'I' für eine kursive (italic) und 'U' für eine unterstrichene Darstellung möglich. Als letzten Parameter können Sie dann schließlich die gewünschte Schriftgröße in Punkt übergeben.

In Listing 5.12 habe ich die Schriftgröße allerdings mit der Methode setFontSize() gesetzt, die auch die gewünschte Größe in Punkt übergeben bekommt.

Der eigentliche Text wird schließlich mit der Methode write() ausgegeben. Diese bekommt die Zeilenhöhe der gewünschten Ausgabe-Box in der vorher definierten Maßeinheit sowie den auszugebenden Text übergeben. An dieser Stelle stellt sich natürlich die Frage, wie die Zeilenhöhe berechnet werden muss, wenn die Schriftgröße doch in Punkt anzugeben ist. Sie können davon ausgehen, dass ein Punkt ca. 0,35 mm entspricht.

Die Methode write() umbricht den Text übrigens automatisch, wenn das Ende der Zeile erreicht oder ein \n gefunden wird.

Die Box wird automatisch an der Stelle positioniert, an der sich der »Cursor« befindet. Solange dieser nicht anders positioniert wird, handelt es sich dabei um die linke obere Ecke des Blattes – genauer gesagt um die linke, obere Position auf dem Blatt, die durch die Seitenränder definiert wird.

Um die Datei an den Browser zu senden, ist die Methode output() vorgesehen. Rufen Sie diese ohne Parameter auf, wird die Datei unter dem Namen unknown.pdf an den Browser gesendet, der die Datei dann zum Download anbietet. Allerdings können Sie der Methode als ersten Parameter auch einen anderen Dateinamen übergeben, und wenn Sie danach ein true angeben, wird die Datei direkt im Browser dargestellt.

Möchten Sie die Datei auf dem Server abspeichern, ist das auch kein Problem. In diesem Fall müssen Sie die Methoden close() und save() aufrufen. Die erste beendet das Dokument korrekt, und die zweite speichert die Datei auf dem Server ab. Damit die Zieldatei einen anderen Namen als unknown.pdf bekommt, können Sie diesen an save() übergeben.

Die generierte PDF-Datei sehen Sie in Abbildung 5.9.

Abbildung 5.9 Generiertes Dokument in Adobe Acrobat

Wird der Text einfach mit write() ausgegeben, richtet sich die Zeilenlänge nach den Rändern, die definiert sind. Diese können wiederum mit den Methoden setLeftMargin(), setTopMargin() und setRightMargin() definiert werden. Jede dieser Methoden bekommt eine Zahl übergeben, die die Randbreite in der gewählten Maßeinheit definiert. Alternativ steht auch setMargins() zur Verfügung. Diese Methode bekommt zwei bis drei Zahlen übergeben. Die erste definiert den linken und die zweite den oberen Rand. Übergeben Sie keine dritte Angabe, wird der rechte Rand automatisch so breit wie der linke. Ansonsten können Sie auch dafür einen Wert definieren. Wichtig ist, dass diese Methoden vor addPage() aufgerufen werden, da sie sich immer auf die nächste generierte Seite beziehen.

Vielleicht wundern Sie sich, dass in der Aufzählung der untere Rand fehlte. Der Grund ist recht einfach. Normalerweise wird der untere Rand nicht unbedingt benötigt, da die Position der einzelnen Elemente von Hand festgelegt wird, wie Sie gleich noch sehen werden. Allerdings kann es natürlich vorkommen, dass Sie mithilfe von write() einen sehr langen Text ausgeben, der über mehrere Seiten geht. In einem solchen Fall ist die Default-Einstellung, dass automatisch ein Seitenumbruch eingefügt wird und der Text somit auf der nächsten Seite, die automatisch eingefügt wird, weiter ausgegeben wird. [Zum jetzigen Zeitpunkt ist die Ausgabe über mehrere Seiten noch fehlerhaft. ] Die Methode setAutoPageBreak() bekommt als ersten Parameter einen booleschen Wert übergeben, der definiert, ob automatisch ein Umbruch auf die nächste Seite erfolgen soll. Der zweite Parameter legt fest, wie groß der untere Rand der Seite sein soll.

Neben der Methode write() ist auch die Methode cell() vorgesehen, um einen Text auszugeben. In diesem Fall wird der Text in eine Zelle ausgegeben, die eine fest definierte Größe hat. Der Text wird bei der Ausgabe nicht umbrochen und abgeschnitten, wenn er aus dem Feld herausläuft.

Der Vorteil dieser Vorgehensweise besteht darin, dass der Text innerhalb dieser Box horizontal ausgerichtet werden kann. Des Weiteren kann eine Zelle auch mit einem Rahmen versehen werden.

require_once('PEAR.php'); 
require_once('File/PDF.php'); 
 
// Variablen fuer die Raender 
$left_margin=10; 
$right_margin=10; 
// Breite der Zelle. 210 mm = Breite von A4-Papier 
$breite=210-$left_margin-$right_margin; 
 
$pdf=File_PDF::factory('P','mm','A4'); 
$pdf->open(); 
 
// Raender festlegen 
$pdf->setLeftMargin($left_margin); 
$pdf->setRightMargin($right_margin); 
$pdf->addPage(); 
$erg=$pdf->setFont('Arial','B',20); 
if (true===PEAR::isError($erg)) 
{ 
   die ($erg->getmessage()); 
} 
// Farbe fuer den Rahmen (Dunkelgrau) 
$pdf->setDrawColor('rgb',0.1,0.1,0.1); 
// Schriftfarbe (helleres Grau) 
$pdf->setFillColor('rgb',0.6,0.6,0.6); 
// Ausgabe des Textes mit Rahmen 
$pdf->cell($breite,20,'Überschrift','TB',0,'C'); 
 
$erg=$pdf->output(); 
if (true===PEAR::isError($erg)) 
{ 
   die ($erg->getMessage()); 
}

Listing 5.13 Ausgabe einer Überschrift in einer Zelle

In Listing 5.13 wird cell() genutzt, um eine Überschrift zentriert im oberen Bereich der Seite zu platzieren. Zuvor werden allerdings mithilfe von setDrawColor() und setFillColor() die zu verwendenden Farben festgelegt. Die erste definiert hierbei die Farbe des Rahmens und die zweite die des Textes. Der Parameter 'rgb' legt fest, dass die Farbe im RGB-Farbmodell angegeben wird. Die drei nachfolgenden Zahlen definieren die Intensität der drei Farbkanäle in Prozent. Alternativ können Sie als ersten Parameter auch 'cmyk' oder 'gray' nutzen. Im ersten Fall folgen danach vier Zahlen und im zweiten eine Zahl, die definiert, wie intensiv der gewünschte Grauwert erscheinen soll.

cell() bekommt als ersten Parameter die Breite der gewünschten Zelle und als zweiten die Höhe übergeben. Danach folgt der Text, der erscheinen soll. Der String 'TB' legt fest, dass oben (Top) und unten (Bottom) ein Rahmen erscheinen soll. Dieser String kann auch noch die Buchstaben L und R enthalten, um den linken und rechten Rahmen einzuschalten. Um alle Rahmen auf einmal anzusprechen, können Sie auch die 1 nutzen, um alle einzuschalten, oder die 0, um alle auszuschalten.

Die 0, die Sie danach finden, definiert, wo der Cursor nach dem Zeichnen der Zelle positioniert werden soll. Eine 0 bedeutet, dass er rechts neben der gezeichneten Zelle platziert werden soll. 1 würde heißen, dass der Cursor am Anfang der nachfolgenden Zeile platziert wird, und bei einer 2 landet er rechts unterhalb der Zelle.

Der letzte Parameter 'C' definiert, dass der Text zentriert ausgegeben werden soll. 'L' würde eine linksbündige Ausrichtung bedeuten, wohingegen 'R' den Text nach rechts verschiebt.

Abbildung 5.10 Ausgabe der Überschrift

Natürlich können Sie den Cursor auch manuell platzieren, was in vielen Fällen sehr hilfreich ist. Hierzu sind setX(), setY() und setXY() vorgesehen. Die ersten beiden akzeptieren einen Parameter, um die X- bzw. Y-Koordinate des Cursors zu verändern. Die letzte Methode bekommt zwei Werte übergeben, um beide Koordinaten gleichzeitig zu ändern. Die Koordinaten beziehen sich hierbei immer auf die linke obere Ecke des Blattes, ohne dass die Rahmen beachtet werden.

Hilfreich sind auch noch die Zeichenfunktionen, mit denen Sie Linien, Kreise und Vierecke zeichnen können. Die Linienstärke, die standardmäßig 0,2 mm beträgt, können Sie mit der Methode setLineWidth() definieren.

line() bekommt jeweils die X- und Y-Koordinaten der beiden Eckpunkte übergeben, die durch die Linie verbunden werden. circle() zeichnet einen Kreis,der durch die X- und Y-Koordinate des Mittelpunkts sowie seinen Radius definiert wird. rect() erstellt ein Rechteck für Sie und bekommt die X- und Y-Koordinate der linken, oberen Ecke, gefolgt von der Breite und der Höhe des Vierecks übergeben. Sowohl circle() als auch rect() unterstützen noch einen weiteren Parameter. Mit 'F' wird nur eine gefüllte Figur ohne Rahmen gezeichnet, wohingegen 'D' ein leeres Objekt erstellt, und 'FD' zeichnet sowohl den Rahmen als auch die Füllung. Zwar sind diese Zeichenfunktionen nicht sehr umfangreich, aber wenn Sie beispielsweise ein Balkendiagramm erstellen wollen, sind sie durchaus ausreichend, wie Sie in Listing 5.14 und Abbildung 5.11 sehen können.

require_once('PEAR.php'); 
require_once('File/PDF.php'); 
 
// Werte fuer die Balken 
$werte = array (20, 15, 32, 22, 5); 
 
// Parameter, die zur Berechnung gebraucht werden 
$breite_gesamt = 190; 
$y_baseline = 150; 
$x_pos=10; 
$rahmen_oben=10; 
$abstand=1; 
$max_hoehe=$y_baseline-$rahmen_oben; 
 
$pdf=File_PDF::factory('P','mm','A4'); 
$pdf->open(); 
$pdf->addPage(); 
 
//Anzahl der Werte bestimmen, Breite eines Balkens berechnen 
$anzahl= count($werte); 
$breite = ($breite_gesamt/$anzahl)-$abstand; 
 
// Sortieren und groessten Wert ermitteln 
sort($werte); 
$max=$werte[$anzahl-1]; 
 
$pdf->setLineWidth(0.5); 
$pdf->setDrawColor('rgb',0,0,0); 
foreach ($werte as $wert) 
{ 
   // Neuen Grauwert fuer jeden Balken 
   $col=$wert/$max; 
   $pdf->setFillColor('rgb',$col,$col,$col); 
   // Koordinaten berechnen 
   $hoehe=($wert/$max)*$max_hoehe; 
   $y_pos=$y_baseline-$hoehe; 
   // Balken zeichnen 
   $pdf->rect($x_pos,$y_pos,$breite,$hoehe,'FD'); 
   $x_pos=$x_pos+$breite+$abstand; 
} 
$erg=$pdf->output(); 
if (true===PEAR::isError($erg)) 
{ 
   die ($erg->getmessage()); 
}

Listing 5.14 Erstellen eines Balkendiagramms mit File_PDF

Abbildung 5.11 PDF mit Balkendiagramm

 <<   zurück
     
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: PHP PEAR
PHP PEAR
Jetzt Buch bestellen!
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: PHP 5.6 und MySQL 5.7






 PHP 5.6 und
 MySQL 5.7


Zum Rheinwerk-Shop: Einstieg in PHP 5.6 und MySQL 5.6






 Einstieg in PHP 5.6
 und MySQL 5.6


Zum Rheinwerk-Shop: Responsive Webdesign






 Responsive Webdesign


Zum Rheinwerk-Shop: Moderne Websites entwickeln






 Moderne Websites
 entwickeln


Zum Rheinwerk-Shop: MySQL 5.6






 MySQL 5.6


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo








Copyright © Rheinwerk Verlag GmbH 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern