In diesem Tutorial möchte ich ihnen erklären, wie sie mit PHP ein PDF-Dokument erstellen. Es gibt verschiedene Klassen in PHP, womit man ein PDF-Dokument erstellen kann. Am meisten verbreitet ist die Klasse von FPDF, diese kann man direkt auf der Homepage kostenlos herunterladen. In unserem Tutorial verwenden wir die Klasse von FPDF.
Als Erstes benötigen wir die Klasse, diese könnt Ihr in gezippter Form hier herunterladen. Die ZIP Datei entpackt ihr bitte im gleichen Verzeichnis, wo das Script liegt. Danach benötigen wir eine Eingabemaske, wo man die Daten eingeben kann, die später von dem PHP Script zu ein PDF-Dokument umgewandelt werden. In der Eingabemaske benötigen wir die Daten: Absender, Empfänger, Betreffzeile, Anrede, Text und Grußformel.
Überblick: Der Ablauf der PDF-Erstellung
Bevor wir in den Code einsteigen, hier der Gesamtablauf auf einen Blick:
graph TD
A[HTML-Formular ausfüllen] --> B[Absenden per POST]
B --> C{PHP: Eingaben prüfen}
C -->|Gültig| D[FPDF-Objekt erstellen]
C -->|Ungültig| E[Fehlermeldung ausgeben]
D --> F[Seite anlegen und Schrift setzen]
F --> G[Inhalte schreiben]
G --> H[PDF ausgeben oder speichern]
Der Nutzer füllt ein HTML-Formular aus, PHP empfängt die Daten per $_POST[], validiert sie und erzeugt dann mit der FPDF-Bibliothek das fertige PDF.
So würde unter anderem unser Formular aussehen, was wir erstellen möchten.

HTML-Code für das Formular
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN">
<html>
<head>
<title> PDF-Generator </title>
</head>
<body>
<form
action="pdf.php" method="post" target="_blank">
<fieldset
style="width:390px; border-color:#000;
border-width:1px;">
<legend><span> PDF-Generator </span></legend>
<br>
<table
border="0" width="300">
<tr>
<td
valign="top"> Absender
</td>
<td><textarea name="absender" cols="25" rows="4" style="width:250px;">
</textarea></td>
</tr>
<tr>
<td
valign="top"> Empfä
nger
</td>
<td><textarea name="empfaeger" cols="25" rows="4" style="width:250px;">
</textarea></td>
</tr>
<tr>
<td
valign="top"> Betreffzeile
</td>
<td><input name="betreff" value="" type="text" style="width:250px;"></td>
</tr>
<tr>
<td
valign="top"> Anrede
</td>
<td><input name="anrede" value="" type="text" style="width:250px;"></td>
</tr>
<tr>
<td
valign="top"> Text
</td>
<td><textarea name="text" cols="25" rows="7" style="width:250px;">
</textarea></td>
</tr>
<tr>
<td
valign="top"> Gruß
formel
</td>
<td><input name="gruss" value="" type="text" style="width:250px;"></td>
</tr>
</table>
<input
name="senden" type="submit" value="PDF erstellen"><br>
<br>
</fieldset>
</form>
</body>
</html>
Das HTML Formular muss man einfach in einen Texteditor kopieren und als index.html im gleichen Verzeichnis speichern, wo die Datei fpdf.php liegt.
Das PHP-Script: Formulardaten zum PDF
Das PHP-Script nimmt die Formulardaten per $_POST entgegen, validiert sie und erzeugt mit FPDF ein fertiges PDF-Dokument. Nachfolgend finden sie das PHP Script, dies müssen sie als pdf.php im gleichen Ordner speichern.
Der Code für das PHP-Script:
<?php
/**
* Die Variable $_POST["absender"] überprüfen, ob
dieser einen Wert zugewiesen ist.
*/
if (!isset($_POST["absender"])) $_POST["absender"]
= '';
/**
* Wen die Variable $_POST["absender"] leer ist,
geben wir eine Fehlermeldung aus und brechen
das Script mit exit ab.
*/
if ($_POST["absender"] == '') {
echo 'Bitte geben Sie einen Absender ein!';
exit;
}
/**
* Die Variable $_POST["empfaeger"] überprüfen, ob
dieser einen Wert zugewiesen ist.
*/
if (!isset($_POST["empfaeger"]))
$_POST["empfaeger"] = '';
/**
* Wen die Variable $_POST["empfaeger"] leer ist,
geben wir eine Fehlermeldung aus und brechen
das Script mit exit ab.
*/
if ($_POST["empfaeger"] == '') {
echo 'Bitte geben Sie ein Empfänger ein!';
exit;
}
/**
* Die Variable $_POST["betreff"] überprüfen, ob
dieser einen Wert zugewiesen ist.
*/
if (!isset($_POST["betreff"])) $_POST["betreff"] =
'';
/**
* Wen die Variable $_POST["betreff"] leer ist,
geben wir eine Fehlermeldung aus und brechen
das Script mit exit ab.
*/
if ($_POST["betreff"] == '') {
echo 'Bitte geben Sie eine Betreffzeile ein!';
exit;
}
/**
* Die Variable $_POST["anrede"] überprüfen, ob
dieser einen Wert zugewiesen ist.
*/
if (!isset($_POST["anrede"])) $_POST["anrede"] =
'';
/**
* Wen die Variable $_POST["anrede"] leer ist,
geben wir eine Fehlermeldung aus und brechen
das Script mit exit ab.
*/
if ($_POST["anrede"] == '') {
echo 'Bitte geben Sie eine Anrede ein!';
exit;
}
/**
* Die Variable $_POST["text"] überprüfen, ob
dieser einen Wert zugewiesen ist.
*/
if (!isset($_POST["text"])) $_POST["text"] = '';
/**
* Wen die Variable $_POST["text"] leer ist, geben
wir eine Fehlermeldung aus und brechen das
Script mit exit ab.
*/
if ($_POST["text"] == '') {
echo 'Bitte geben Sie einen Text ein!';
exit;
}
/**
* Die Variable $_POST["gruss"] überprüfen, ob
dieser einen Wert zugewiesen ist.
*/
if (!isset($_POST["gruss"])) $_POST["gruss"] = '';
/**
* Wen die Variable $_POST["gruss"] leer ist, geben
wir eine Fehlermeldung aus und brechen das
Script mit exit ab.
*/
if ($_POST["gruss"] == '') {
echo 'Bitte geben Sie eine Grußformel ein!';
exit;
}
/**
* Festlegen des Verzeichnisses, wo die
Schriftarten gespeichert sind.
*/
define('FPDF_FONTPATH', 'font/');
/**
* Laden der FPDF Class
*/
include('fpdf.php');
/**
* Neues Objekt erstellen
*/
$pdf = new FPDF();
/**
* Beginnen mit den erstellen von PDF Dokument.
*/
$pdf->Open();
/**
* Eine Seite in PDF Dokument hinzufügen.
*/
$pdf->AddPage();
/**
* Das Logo einbinden, das Logo muss die Maße
130x30 haben, ansonsten müssen die Maße
entsprechend der Bildgröße angepasst werden.
*/
$pdf->Image('logo.jpg', '130', '30', '0', '0');
$pdf->Ln(18);
/**
* Den Absender mit der Schriftart "Arial"
schreiben.
*/
$pdf->SetFont('Arial', 'I', 12);
$pdf->Write(6, $_POST["absender"]);
$pdf->Ln(15);
/**
* Den Empfänger mit der Schriftart "Arial"
schreiben.
*/
$pdf->SetFont('Arial', 'B', 12);
$pdf->Write(6, $_POST["empfaeger"]);
$pdf->Ln(15);
/**
* Den Betreff mit der Schriftart "Arial" schreiben.
*/
$pdf->SetFont('Arial', 'I', 14);
$pdf->Write(6, $_POST["betreff"]);
$pdf->Ln(15);
/**
* Die Anrede mit der Schriftart "Arial" schreiben.
*/
$pdf->SetFont('Arial', '', 14);
$pdf->Write(6, $_POST["anrede"]);
$pdf->Ln(15);
/**
* Den Text mit der Schriftart "Arial" schreiben.
*/
$pdf->SetFont('Arial', '', 14);
$pdf->Write(6, $_POST["text"]);
$pdf->Ln(15);
/**
* Die Grußformel mit der Schriftart "Arial"
schreiben.
*/
$pdf->SetFont('Arial', 'B', 14);
$pdf->Write(6, $_POST["gruss"]);
$pdf->Ln(15);
/**
* Das PDF Dokument ausgeben.
*/
$pdf->Output("dokument.pdf", "D");
?>
Erklärung des PHP-Scripts
In diesem Script werden die Werte aus dem POST-Array überprüft. Es wird zunächst überprüft, ob die Variablen überhaupt einen Wert zugewiesen bekommen haben. Wenn das nicht der Fall ist, wird eine Fehlermeldung ausgegeben und das Script mit dem Befehl exit; abgebrochen. Ist jedoch ein Wert vorhanden, wird die FPDF-Class geladen und ein neues Objekt erstellt. Anschließend wird mit dem Befehl AddPage() eine Seite hinzugefügt und mit dem Befehl Image() ein Logo eingebunden. Es folgen die Schreibbefehle SetFont(), Write() und Ln(). Mit SetFont() wird die Schriftart festgelegt, mit Write() der jeweilige Text geschrieben und mit Ln() eine Zeile nach unten gesprungen. Zuletzt wird das erstellte PDF-Dokument mit dem Output-Befehl ausgegeben.
Wenn die beiden Dateien in einem Ordner gespeichert sind, muss der gesamte Ordner auf den Webspace übertragen werden. Nach der Eingabe des Formulars und dem Absenden des Formulars wird das PDF-Dokument in einem neuen Fenster angezeigt. Es ist von Bedeutung, dass man zuvor den Eintrag für das Logo in das PHP Script einfügt. Wenn kein Logo mit auf den Server übertragen wird, kann das PDF-Dokument mit dem PHP Script nicht ordnungsgemäß generiert werden.
Ihr könnt das gesamte Script, was in diesen PHP Tutorial behandelt wurde, hier herunterladen. Bei Fragen zu diesen PHP Tutorial, möchte ich euch bitten, direkt im Forum eure Frage zu stellen. In unserer Tutorial-Datenbank haben wir bereits nachfolgende Funktionen behandelt, die auch entsprechend in diesem Tutorial vorkommen. Wenn ihr diese Tutorials noch nicht gelesen habt, könnt ihr dies an der Stelle nachholen.
Funktionen, die in diesem Tutorial verwendet wurden:
echo: Text ausgeben mit PHP.
isset(): Eine Variable prüfen, ob ein Inhalt enthalten ist.
If-Anweisung: Erklärung wie man die If-Anweisung verwenden kann in PHP.
include(): Hier wird erklärt, wie man den PHP Befehl include() benutzen kann.
$_POST[]: Erklärung, wie man Daten an ein Formular übergibt.
Die wichtigsten FPDF-Methoden im Überblick
Das Codebeispiel oben nutzt mehrere FPDF-Methoden. Hier eine kurze Referenz der wichtigsten Funktionen, damit du sie selbstständig anpassen kannst:
| Methode | Beschreibung | Beispiel |
AddPage() | Fügt eine neue Seite hinzu. Optional mit Ausrichtung (P=Hochformat, L=Querformat). | $pdf->AddPage('P') |
SetFont() | Setzt Schriftart, Stil (B=fett, I=kursiv) und Größe. | $pdf->SetFont('Arial', 'B', 14) |
Write() | Schreibt Text an der aktuellen Position. Der erste Parameter ist die Zeilenhöhe. | $pdf->Write(6, 'Text') |
Cell() | Erzeugt eine Zelle mit optionalem Rahmen. Gut für Tabellen. | $pdf->Cell(60, 10, 'Inhalt', 1) |
MultiCell() | Wie Cell(), aber mit automatischem Zeilenumbruch bei langem Text. | $pdf->MultiCell(0, 6, $text) |
Ln() | Erzeugt einen Zeilenumbruch. Der Parameter gibt den Abstand in mm an. | $pdf->Ln(10) |
Image() | Fügt ein Bild ein (JPG, PNG, GIF). Position und Größe einstellbar. | $pdf->Image('logo.png', 10, 10, 30) |
Output() | Gibt das PDF aus. 'I' = im Browser, 'D' = Download, 'F' = Datei speichern. | $pdf->Output('D', 'brief.pdf') |
UTF-8 und Umlaute in FPDF
FPDF unterstützt von Haus aus kein UTF-8. Wenn du deutsche Umlaute (ä, ö, ü, ß) in deinem PDF verwendest, werden sie ohne Konvertierung falsch dargestellt. Bis PHP 8.1 konnte man utf8_decode() verwenden, aber seit PHP 8.2 ist diese Funktion veraltet.
<?php
/* FPDF: Umlaute korrekt darstellen */
$text = $_POST["text"];
/* Bis PHP 8.1: utf8_decode() */
$pdf->Write(6, utf8_decode($text));
/* Ab PHP 8.2: mb_convert_encoding() */
$pdf->Write(
6,
mb_convert_encoding($text, 'ISO-8859-1', 'UTF-8')
);
?>
Wer dieses Problem komplett umgehen will, kann auf tFPDF (einen FPDF-Fork mit nativer UTF-8-Unterstützung) oder direkt auf TCPDF umsteigen. Beide Bibliotheken verarbeiten UTF-8 ohne manuelle Konvertierung.
Sicherheitshinweise
Im Beispielcode oben werden die $_POST-Werte direkt in das PDF geschrieben. Das funktioniert, ist aber in einer produktiven Anwendung gefährlich. Benutzereingaben sollten immer validiert und bereinigt werden, bevor sie weiterverarbeitet werden:
<?php
/* Eingabe bereinigen und auf Länge prüfen */
$absender = trim(strip_tags($_POST["absender"] ?? ''));
if (mb_strlen($absender) === 0 || mb_strlen($absender) > 200) {
echo 'Absender fehlt oder ist zu lang.';
exit;
}
/* Im PDF verwenden */
$pdf->Write(6, $absender);
?>
Verwende trim() zum Entfernen überflüssiger Leerzeichen, strip_tags() zum Entfernen von HTML und prüfe die Länge der Eingabe. Für Formulare im öffentlichen Bereich empfiehlt sich zusätzlich ein CSRF-Token, damit das Formular nicht von fremden Seiten aus missbraucht werden kann.
Moderner Ansatz: PDF-Erstellung mit Composer
FPDF ist seit Jahren nicht mehr aktiv gewartet. Für neue Projekte empfiehlt sich eine der modernen Alternativen, die sich bequem über Composer installieren lassen und UTF-8 nativ unterstützen.
Dompdf: HTML zu PDF
Dompdf wandelt HTML und CSS direkt in ein PDF um. Ideal, wenn du bereits ein HTML-Template hast:
<?php
/* Installation: composer require dompdf/dompdf */
require 'vendor/autoload.php';
use Dompdf\Dompdf;
$dompdf = new Dompdf();
$html = '<h1>Brief</h1>';
$html .= '<p>Sehr geehrte Damen und Herren,</p>';
$html .= '<p>Äöüß funktionieren nativ.</p>';
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
/* PDF als Download senden */
$dompdf->stream('brief.pdf');
?>
Welche Bibliothek passt?
Die folgende Tabelle hilft bei der Wahl:
| Bibliothek | UTF-8 | HTML-zu-PDF | Composer | Einsatzgebiet |
| FPDF | Nein | Nein | Nein | Einfache PDFs, Legacy-Projekte |
| TCPDF | Ja | Teilweise | Ja | Maximale Kontrolle, komplexe Layouts |
| Dompdf | Ja | Ja | Ja | HTML-Templates zu PDF |
| mPDF | Ja | Ja | Ja | CSS-lastige Dokumente, Tabellen |
Für die meisten neuen Projekte ist Dompdf die einfachste Wahl, weil du einfach HTML und CSS schreibst. Wer pixelgenaue Kontrolle über jedes Element braucht, greift zu TCPDF. mPDF ist ein guter Mittelweg mit starker CSS-Unterstützung.
Häufige Fragen zur PDF-Erstellung mit PHP
Die folgenden Fragen tauchen bei der PDF-Erstellung mit PHP besonders oft auf.
Warum werden Umlaute im PDF nicht korrekt angezeigt?
FPDF arbeitet intern mit ISO-8859-1, während PHP-Dateien heute meist in UTF-8 gespeichert sind. Du musst den Text vor der Ausgabe konvertieren, entweder mit mb_convert_encoding($text, 'ISO-8859-1', 'UTF-8') oder indem du eine Bibliothek mit nativer UTF-8-Unterstützung wie TCPDF oder Dompdf verwendest.
Kann ich HTML direkt in ein PDF umwandeln?
Ja, mit Dompdf oder mPDF. Beide Bibliotheken nehmen HTML und CSS als Eingabe und erzeugen daraus ein PDF. FPDF und TCPDF bieten diese Möglichkeit nicht direkt, dort musst du das Layout programmatisch mit Methoden wie Cell() und Write() aufbauen.
Wie füge ich eine Tabelle in das PDF ein?
Mit FPDF verwendest du Cell() in einer Schleife. Für jede Zeile setzt du mehrere Zellen nebeneinander und rufst dann Ln() auf. Dompdf und mPDF können HTML-Tabellen direkt rendern, was bei komplexen Tabellen deutlich einfacher ist.
Wie erstelle ich mehrseitige PDFs?
Rufe AddPage() auf, wenn du eine neue Seite brauchst. FPDF erzeugt auch automatisch einen Seitenumbruch, wenn der Text über den unteren Rand hinausgeht, sofern du SetAutoPageBreak(true, 15) gesetzt hast.
Fazit
Die PDF-Erstellung mit PHP ist dank Bibliotheken wie FPDF, TCPDF und Dompdf gut lösbar. FPDF eignet sich für einfache Dokumente und zum Verständnis der Grundlagen. Für produktive Anwendungen empfiehlt sich der Umstieg auf eine modernere Bibliothek mit UTF-8-Unterstützung und Composer-Integration. Unabhängig von der Bibliothek gilt: Benutzereingaben immer validieren und bereinigen, bevor sie ins PDF geschrieben werden.