Bis vor kurzem ging ich noch davon aus, dass es nicht all zu einfach wäre, mit PHP ein PDF zu erstellen. Da lag ich falsch: Mit FPDF existiert schon seit 2001 eine Klasse, um PDFs zu erstellen.

So steht der PDF-Erstellung auf der Website – sei es zur automatischen Erstellung der Rechnung oder Personalisieren von Druckdaten – nichts mehr im Wege.

Im Folgenden ein paar Kniffe für FPDF.

Erste Schritte: Schriften

Was hat man von einem PDF, wenn man nicht die richtigen Schriften verwendet. Da kann man dann auch gleich HTML verwenden.

Achtung: Vor allen weiteren Schritten sollte man sicherstellen, alle notwendigen Rechte an den zu konvertierenden/verwendenden Schriften zu besitzen!

Um seine gewünschten Schriften mit FPDF verwenden zu können, muss man diese erst einmal um ein paar notwendige zusätzliche Dateien erweitern.
Die im FPDF-Tutorial beschriebenen Schritte haben ich hier zusammengefasst.

Wir brauchen:

  • Eine Schrift-Metrik-Datei .afm
  • Eine .php-Datei mit Code-Informationen der Schrift
  • Eine .z-Datei, die die komprimierte Schrift enthält

Ausgehend von einer PostScript-Schrift sollten wir die .afm-Datei bereits haben, für die TrueType-Schrift müssen wir sie zuerst erstellen und bei einer OpenType-Schrift musste ich die OpenType-Schrift erst in eine TrueType-Schrift wandeln, um weiter zu kommen (habe mir keinen weiteren Kopf darum gemacht, "nur" eine TrueType-Schrift am Ende raus zu bekommen, da ich hier keine hochwertigen Druckdaten herstellen wollte).
Hier mag der eine oder andere Online-Schriften-Konverter hilfreich sein:
cloudconvert.com, everythingfonts.com, onlinefontconverter.com, etc.

Falls noch nicht vorhanden: .afm-Datei erstellen
Hier hilft das Kommandozeilenprogramm ttf2pt1 weiter, welches man bei Sourceforge herunterladen kann.

ttf2pt1 -a font.ttf font

# Z.B. lieblingsschrift.ttf => lieblingsschrift.afm
ttf2pt1 -a /pfad/zur/lieblingsschrift.ttf lieblingsschrift

.php und .z erstellen
Im Ordner "tutorial" des FPDF-Downloads befindet sich die Datei makefont.php, in welcher man seine zu konvertierende Schrift einträgt:

<?php
require('../makefont/makefont.php');
MakeFont('lieblingsschrift.ttf','cp1252');
?>

Die Schrift-Datei sollte natürlich zusammen mit der .afm-Datei im selben Verzeichnis wie dieses PHP-Skript liegen; dann PHP-Skript im Browser ausführen lassen.
Danach sollten im selben Verzeichnis die benötigten .php und .z Dateien liegen.

Alle für sein Projekt benötigten Schrift-Dateien sammelt man am besten in einem zentralen Schriften-Verzeichnis.
Im PDF-Erstellungs-Skript verweist man per Konstante FPDF_FONTPATH auf dieses Verzeichnis, fügt per AddFont Schriften hinzu und setzt die gerade verwendete Schrift per SetFont.

Beispiel:

<?php
define('FPDF_FONTPATH','meine_fonts/');
require('fpdf.php');

$pdf=new FPDF();

// Folgende Schriften sollen im Dokument verwendet werden
$pdf->AddFont('DIN-A-Bold',     '', 'din-a-bold.php');
$pdf->AddFont('Zurich-Regular', '', 'zurich.php');
$pdf->AddFont('Zurich-Bold',    '', 'zurich-bold.php');

$pdf->AddPage();

$pdf->SetFont('DIN-A-Bold','',35);
$pdf->Cell(0,10,'Eine Schrift');

$pdf->SetFont('Zurich-Regular','',35);
$pdf->Cell(0,30,'Noch eine im Standard-Schnitt');

$pdf->SetFont('Zurich-Regular','',35);
$pdf->Cell(0,50,'...und fett.');

$pdf->Output();
?>

Templates verwenden

Man muss das Rad nicht immer neu erfinden und das PDF nicht unbedingt von Grund auf mit FPDF aufbauen.
Dank Template-Funktion erstellt man sein PDF mit allen grundlegenden Elementen im Layout-Programm und fügt dann die variablen Elemente mit FPDF hinzu.

<?php
define('FPDF_FONTPATH','fonts/');
require_once('fpdf.php');
require_once('fpdi.php');
require_once('fpdf_tpl.php'); // <-- Wir brauchen hierfür die Template-Klasse

$pdf = new FPDI(); // <-- FPDI statt FPDF
$pdf->AddPage();
$pdf->setSourceFile("template.pdf");     // Vorbereitetes Template laden...
$tplIdx = $pdf->importPage(1);           // ...und erste Seite des Templates importieren
$pdf->useTemplate($tplIdx, 10, 10, 100); // Importierte Template-Seite auf unserer aktuellen Seite an Position 0/0 mit 210mm Breite einbauen

// An hier alle weiteren PDF-Elemente zur Seite hinzufügen.
// Zum Beispiel ein rotes "Test"
$pdf->AddFont('Dinot-Regular', '', 'DINOT-Regular.php');
$pdf->SetFont('Dinot-Regular');
$pdf->SetTextColor(255, 0, 0);
$pdf->SetXY(30, 30);
$pdf->Write(0, 'Test');

$pdf->Output();
?>

JavaScript in PDF einbinden

PDFs können JavaScript enthalten und ausführen.

Um mit FPDF JavaScript-Code hinzuzufügen, muss man sich den Code von dieser Seite in eine neue Datei kopieren und diese dann in sein PDF-Erstellungs-Skript einbinden.

Zu beachten ist , dass die Zeile

class PDF_JavaScript extends FPDF { 

durch

class PDF_JavaScript extends FPDI { 

ersetzt werden sollte, wenn man zusätzlich die Template-Klasse verwendet.

Und das neue PDF-Objekt wird dann mit

$pdf = new PDF_JavaScript();
initialisiert.

PDF gleich beim Öffnen drucken lassen

Als Beispiel zur JavaScript-Verwendung befindet sich bei oben beschriebener JavaScript-Erweiterung die Möglichkeit, JavaScript-Code in das PDF einzubetten, welcher das PDF-Anzeigeprogramm dazu animiert, den Druck-Dialog zu öffnen.

Eine andere Möglichkeit ohne JavaScript mit nativem PDF-Code habe ich in diesem Artikel beschrieben.

PDF auf Webserver speichern (z.B. für Download) statt direkt an Client zu senden

Den Ansatz hierzu findet man auf der FPDF-Seite im Artikel Memory optimization.