PDF in PHP mit Seitenzahl generieren

/ Autor: Albrecht, 23 Dez 2008

Um mit PHP automatisiert PDF-Dokumente erstellen zu können, bietet sich die kostenlose PHP-Klasse “FPDF” an. Diese Klasse erkennt automatisch, wann die aktuelle Seite voll ist und erzeugt dann selbstständig eine weitere Seite. Man braucht sich also vorher keine Gedanken über die Seitenanzahl machen. Jedoch ist es hilfreich, nach dem erzeugen des Dokuments, einen schnellen Überblick zu haben, wie viele Seiten die Datei enthält und auf welcher Seit man sich befindet. Auch das ist mit FPDF kein Problem.

Funktion beim Seitenwechsel automatisch aufrufen

Wenn von FPDF eine neue Seite erzeugt oder das Dokument geschlossen wird, wird automatisch die Funktion Footer() aufgerufen. Diese Funktion ist erstmal leer, da FPDF aber schön objektorientiert funktioniert, ist es kein Problem diese Funktion zu überschreiben und den eigenen Bedürfnissen anzupassen.

Anstatt FPDF direkt zu instanziieren, arbeiten wir also mit einer Unterklasse, die wir an unsere Bedürfnisse anpassen können.

<?php
// so wuerden wir eine Instanz von FPDF erzeugen
// $pdf = new FPDF();

// wir erzeugen aber eine eigene Klasse ...
class MyFPDF extends FPDF {

	function Footer() {
		// ... some stuff to do ...
	}
}

// ... um diese dann zu verwenden
$pdf = new MyFPDF();

?>

In dieser Footer()-Funktion können wir Text auf das PDF-Dokument schreiben.

function Footer() {
	$this->SetFont('Arial', 'B', 8);
	$this->Cell(0,10,'Seite A von B',0,0,'C');
}

Dynamische Seitenzahl

Die aktuelle Seitenzahl kann mit der Funktion PageNo() ausgelesen werden und für die Anzahl der Gesamtseiten verwenden wir den Platzhalter {nb} – dazu später mehr.

function Footer() {
	$this->SetFont('Arial', 'B', 8);
	$this->Cell(0,10,'Seite '.$this->PageNo().' von {nb}',0,0,'C');
}

Position der Anzeige

Als nächsten Schritt Positionieren wir die Anzeige auf der Seite dort, wo wir sie erwarten. Nämlich unten. Allerdings müssen wir dazu den Margin-Bereich auf 0 setzen, da wir mit FPDF eigentlich nicht außerhalb dieses Bereichs schreiben dürfen. Die fertige Footer()-Funktion sieht dann wie folgt aus:

function Footer() {
	$this->SetAutoPageBreak(true, 0); // set bottom margin to 0 mm
	$this->SetXY(10,277); // set position
	$this->SetFont('Arial', 'B', 7.98);
	$this->Cell(0,10,'Seite '.$this->PageNo().' von {nb}',0,0,'C');
	$this->SetAutoPageBreak(true, 20); // set bottom margin to 20 mm
}

Zunächst wir der Margin-Bereich auf 0 gesetzt. Dann die Position für das Textfeld bestimmt, anschließend die Schriftart, -schnitt und -größe. Daraufhin wird das Textfeld mit Inhalt und einigen weiteren Parametern erzeugt. Und zum Schluss wird der Margin-Bereich wieder zurück gesetzt.

Update

Die Manipulation mit dem Margin-Bereich ist nicht nötig, wenn die Aktion in der Funktion Footer() erfolgt. Von dieser Funktion aus kann auch unterhalb des Bottom-Margins geschrieben werden.

Gesamt-Anzahl der Seiten anzeigen

Bis jetzt steht in der Ausgabe noch immer der Platzhalter {nb} anstatt der Gesamtzahl der Seiten. Um diesen Alias zu ersetzen muss die Funktion AliasNbPages([string alias]) aufgerufen werden. Über den optionalen Parameter kann dabei der Name des Platzhalters definiert werden. Bleibt der Parameter leer, wird automatisch {nb} verwendet.

Hier also der Komplette Code:

<?php
// wir erzeugen eine eigene Klasse ...
class MyFPDF extends FPDF {

	function Footer() {
		$this->SetAutoPageBreak(true, 0); // set bottom margin to 0 mm
		$this->SetXY(10,277); // set position
		$this->SetFont('Arial', 'B', 7.98);
		$this->Cell(0,10,'Seite '.$this->PageNo().' von {nb}',0,0,'C');
		$this->SetAutoPageBreak(true, 20); // set bottom margin to 20 mm
	}
}

// ... um diese dann zu verwenden
$pdf = new MyFPDF();
$pdf->AliasNbPages();

?>

Weitere Informationen zu FPDF und den jeweiligen Funktionen gibt es auf der offiziellen Webseite: www.fpdf.org

Leave a Reply