Читать книгу Webdesign mit PHP und HTML - Max Bold - Страница 4
ОглавлениеPDF-Dokumente online erstellen und ausgeben
PDF via PHP
Gerade bei dynamischen Webseiten ist häufig die On-the-Fly-Ausgabe von PDF-Daten gefragt. Es gibt eine ganze Reihe von PHP-Klassen, die das erledigen. Von Max Bold
Auf einen Blick
» Der Workshop zeigt verschiedene Methoden, mit denen Sie PDF-Dokumente innerhalb Ihrer Webanwendung generieren und ausgeben können.
» Sie erfahren, wie Sie mit Hilfe von PHP-Bibliotheken oder -Klassen PDF-Dokumente dynamisch generieren.
Alle gängigen Office-Applikationen sind in der Lage, PDF-Output zu generieren, vorausgesetzt die entsprechenden Treiber und Tools sind installiert. Damit lassen sich schnell Dokumente in einem Format ausgeben, das dank Adobe Reader auf vielen Plattformen ohne Probleme gelesen werden kann. Anders sieht es jedoch bei dynamischen Inhalten von Webseiten aus, die aus Datenbanken erst zum Zeitpunkt des Abrufs generiert werden. Ist hier eine Ausgabe als PDF gewünscht, muss die Konvertierung auf dem Server erfolgen.
Auch dafür gibt es diverse Werkzeuge, mit denen sich ein solcher Workflow realisieren lässt. Am einfachsten gestaltet sich die Konvertierung, wenn das verwendete Content-Management-System eine Exportfunktion für PDF integriert hat. Das ist bei zahlreichen Applikationen Standard, oder die entsprechende Funktion kann mit Extensions nachgerüstet werden. Einige CMS wie zum Beispiel Joomla oder Contenido arbeiten hier mit der PHP-Klasse TCPDF (www.tcpdf.org), die diese Arbeit innerhalb des Content-Management-Systems erledigt.
Solche PHP-Klassen kann ein PHP-Programmierer auch für individuelle Lösungen heranziehen und damit relativ komfortabel und mit wenig Codieraufwand den Output von PDF-Dokumenten aus einer Webanwendung heraus realisieren.
»Die PHP-Variante«
Der Platzhirsch auf diesem Sektor ist die Bibliothek PDFlib (www.pdflib.com), die alle notwendigen API-Funktionen für die PDF-Erstellung zur Verfügung stellt. Es handelt sich dabei um ein kommerzielles Produkt, für das bei einer kommerziellen Nutzung Lizenzgebühren fällig werden. Es gibt jedoch auch noch mit PDFlib Lite eine Open-Source-Va-riante, die einen kostenlosen Einsatz unter bestimmten Bedingungen erlaubt, allerdings nur eine Teilmenge der von PDFlib angebotenen Funktionen unterstützt. Seit der Version 6 bietet PDFlib zusätzlich zum funktionsorientierten API für PHP 4 ein objektorientiertes API für PHP 5.
Mit der PHP-Klasse EZPDF lassen sich auch ansprechende Tabellen generieren.
»Freie Alternativen«
Wem die PDFlib nicht zur Verfügung steht, der kann als Alternative zu einem in PHP implementierten Ersatz greifen. Dabei handelt es sich in der Regel um eine Klasse, die dem Webentwickler Funktionen ähnlich denen von PDFlib zur Verfügung stellt. Neben funktionalen Einschränkungen muss man bei dieser Variante eventuell auch mit einer reduzierten Performance leben.Während es sich nämlich bei PDFlib um eine echte, in C geschriebene PHP-Erweiterung handelt, muss bei einer PDF-Klasse der Interpreter die ganze Arbeit leisten.
Ein Beispiel für eine solche Klasse ist EZPDF, die unter sourceforge.net/projects/pdf-php zum kostenlosen Download zur Verfügung steht.
Installation und Nutzung sind denkbar einfach: Entpacken Sie das Archiv und legen Sie es im gewünschten Server-Verzeichnis ab. Die entscheidenden Dateien sind class, ezpdf.php und class.pdf.php.Wichtig ist auch noch das Verzeichnis mit den Schriften. Zur ersten Orientierung sieht man sich am besten das Skript readme.php an. Es generiert aus einer Textdatei das Handbuch zu der Klasse - natürlich als PDF. Ein einfaches Beispiel, bei dem eine Textdatei als PDF ausgegeben werden soll, kann so aussehen:
<?php
include ('class.ezpdf.php');
$str=file_get_contents("lamp.txt")
$pdf =& new Cezpdf();
$pdf->selectFont
('./fonts/Helvetica.afm');
$pdf->ezText($str,50);
$pdf->ezStream();
?>
Neben dem kompakten Code erfreut EZPDF den Entwickler noch mit ein paar netten Gimmicks: Mit ezTable kann man zum Beispiel aus den Werten eines Arrays schnell eine PDF-Tabelle erzeugen. Dabei können die Array-Werte zum Beispiel aus eine CSV-Datei oder einer Datenbankabfrage stammen. Ein konkretes Beispiel sieht etwa folgendermaßen aus:
<?php
include
('class.ezpdf.php');
$row = 1;
$handle =
fopen("lamp.csv", "r");
while (($data =
fgetcsv($handle, 0, ";"))
!== FALSE) {
$row++;
$zeile[$row] = $data;
}
fclose($handle);
$pdf =& new Cezpdf();
$pdf->selectFont(
'./fonts/Helvetica.afm');
$data = $zeile;
$pdf->ezTable ($data,'',
'Providerübersicht', array ('shade-
Col'=> 173,158,250));
$pdf->ezStream();
?>
Man kann Bilder mit ezImage einbinden oder mit Zeichenwerkzeugen operieren (line, ellipse, polygon, rectangle). Ja sogar Bezier-Kurven lassen sich zeichnen (curve).
»PDFs mit FPDF«
Eine weitere Bibliothek zum Erzeugen von PDFs aus einer Webapplikation heraus ist FPDF (www.fpdf.org). Auch hier ist die Installation sehr einfach:Aus dem entpackten Archiv kopieren Sie fpdf.phpund den Ordner fontauf Ihren Webserver Für die Arbeit mit der Bibliothek müssen Sie als Erstes die Klassendatei einbinden und definieren, wo sich die Schriften befinden. Die Ausgabe einer Textdatei kann mit dem folgenden Codefragment realisiert werden:
<?php
require('fpdf.php');
$handle = @fopen('test.txt', 'r');
$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',10);
if ($handle) {
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
$pdf->write(5,$buffer);
}
fclose($handle);
}
$pdf->Output();
?>
Zuerst muss die Klassendatei eingebunden werden.
Ein PDF mit einem Bildelement, produziert mit der PHP-Klasse FPDF.
Mit AddPage() wird eine neue Seite in das Dokument eingefügt. Der Text wird mit fgets() zeilenweise eingelesen und mit write() in das PDF eingefügt. Zuvor muss noch eine Schriftart mit SetFont() festgelegt werden. Sie können auf die Schriften im Verzeichnis fontzugreifen.Andere Schriften lassen sich auf Wunsch installieren. Mit SetFontQ können Sie durch zusätzliche Parameter den Schriftschnitt und die Schriftgröße definieren. Die Angabe der Schriftgröße erfolgt in der Maßeinheit Punkt, unabhängig von der für das Dokument festgelegten Maßeinheit.
Standardmäßig wird die zuletzt festgelegte Schriftgröße verwendet, die mit SetFontSize() oder einem vorherigen SetFont()-Aufruf gesetzt wurde. Wir keine Größe angegeben, ist die Schrift automatisch 12 Punkt groß. Der Schriftstil wird den Buchstaben U (Unterstreichung), I (kursiv) oder B (fett) definiert. Mehrere Buchstaben lassen sich auch kombinieren, um zum Beispiel einen kursiven Fettdruck zu realisieren.
»Mehrzeilige Texte«
Für den Einbau der Zeilen in das PDF-Dokument wird die Methode write() verwendet. Sie gibt einen Text ab der aktuellen Position aus. Ist der rechte Seitenrand erreicht oder taucht in dem String ein \n auf, erfolgt ein Zeilenumbruch. Am linken Seitenrand erfolgt die Ausgabe in einer neuen Zeile.
Mehrzeilige Texte lassen sich mit der Methode MultiCell() ausgeben, wobei die Texte auch über mehrere Seiten laufen können. Als Parameter gibt man der Methode die Breite und Höhe einer Zeile, den Text und optional einen Rahmen an.
Durch die Kombination verschiedener Methoden lassen sich auch aufwendigere PDFs generieren. Das folgende Beispiel platziert zuerst eine Headline in einer Schriftgröße von 32 Punkt, dann eine Bannergrafik und schließlich den Fließtext aus einer Datei:
<?php
require('fpdf.php');
$handle =
@fopen('test.txt', 'r');
$pdf=new FPDF();
$pdf->AddPage();
$pdf->
SetFont('Arial','B',32);
$pdf->Cell(0, 10,
'Testumgebung mit PHP 6',
0, 1);
$pdf->Image('bild.jpg',
10, 25);
$pdf->SetY(55);
$pdf->
SetFont('Arial','B',10);
if ($handle) {
while (!feof($handle))
{
$buffer = fgets($handle,
4096);
$pdf->write(5,$buffer);
}
fclose($handle);
}
$pdf->Output();
?>
Gegenüber dem ersten Beispiel werden hier noch folgende weitere Methoden verwendet: Zuerst wird mit SetFont('Anal'/'B',32) die Schriftgröße auf 32 Punkt und fett festgelegt. Mit der Cell()-Methode wird anschließend eine Headline ausgegeben. Danach soll ein Bild erscheinen. Das erledigt die Methode ImageQ, die die Bilddatei sowie eine horizontale und vertikale Positionsangabe als Parameter benötigt.
Bevor nun der eigentliche Text ausgegeben werden kann, muss der Pointer an eine Position unterhalb des Bildes positioniert werden. Das erledigt die Methode SetY().
»Ausgabe des PDFs«
Die Methode Output(), die dann in der letzten Zeile aufgerufen wird, schickt die Daten direkt an den Browser. Standardmäßig sendet FPDF die Daten als Datei mit dem Namen doc.pdf zum Browser. Um die Datei unter einem anderen Namen zu verschicken, geben Sie diesen einfach als ersten Parameter an. Mit dem zweiten Parameter können Sie dann noch bestimmen, ob die Datei wirklich an den Browser geschickt werden soll. Geben Sie 'I' an, so wird die Datei im Browser dargestellt, wenn ein entsprechendes Plug-in vorhanden ist. Der String 'D' sendet die Datei als Download an den Browser. Hierbei kann es allerdings passieren, dass der ein oder andere Browser das ignoriert und die Datei trotzdem via Plug-in darstellt. Mit dem Parameter 'F' wird das PDF-Dokument als Datei auf dem Server abgespeichert, und 'S' gibt die Datei als String zurück. [mb]