Jalara Studio

veröffentlicht am

Ein PDF mit der PHP-Bibliothek mPDF erstellen

#


Mit der PHP-Bibliothek mPDF1 lässt sich aus UTF-8-codiertem HTML ein PDF erstellen. Die unter der GNU GPL in der Version 2 lizenzierte Bibliothek wurde von Ian Back geschrieben und basiert auf der PHP Klasse FPDF2 und dem PHP-Script HTML2FPDF3.

PDF erstellen

Im folgendem wird anhand eines Beispiels gezeigt, wie ein PDF mit zwei Seiten und einem Lesezeichen erstellt wird:

Installation

Voraussetzung für die Nutzung von mPDF ist ein nginx- oder Apache-Server auf dem mindestens PHP 5.6 läuft.

Installieren lässt sich mPDF via Composer4 und dem folgendem Befehl, eingefügt in die Befehlszeile (engl. command-line interface, kurz CLI):

composer require mpdf/mpdf

Alternativ kannst du mPDF in der Version 7.1.9 (06. Feb 2019) bei php-download.com5 herunterladen. Die Datei php_files.zip enthält bereits die notwendigen Dateien.

Ohne Composer kannst du auch die archivierte Bibliothek in der Version 6 (MPDF_6_0.zip)6 nutzen.

Lade anschließend den entpackten (z.B. in mpdf60 umbenannten) Ordner auf den Server und erstelle in diesem Ordner eine PHP-Datei (z.B. index.php).

PDF erstellen

Nutzt du mPDF in der Version 7 mit dem Composer, kann das PDF bereits mit folgendem PHP-Code7 erstellt werden:

<?php
require_once __DIR__ . '/vendor/autoload.php';
$mpdf = new \Mpdf\Mpdf();
$mpdf->WriteHTML( '<h1>Hallo Welt!</h1>' );
$mpdf->Output(); ?>

Nutzt du mPDF in der Version 6, lässt sich das PDF mit folgendem PHP-Code8, eingefügt in die Beispiel-PHP-Datei index.php, erstellen:

<?php
include( 'mpdf60/mpdf.php' );
$mpdf = new mPDF();
$mpdf->WriteHTML( '<h1>Hallo Welt!</h1>' );
$mpdf->Output();
exit; ?>

Hinweis: Statt der Kontrollstruktur include()9 kann ebenfalls der Befehl require_once()10 verwendet werden:

require_once( 'mpdf60/mpdf.php' );

Erklärung | Version 6

Instanziierung

Der Befehl new mPDF() erstellt eine Instanz der Klasse mPDF. Im Codebeispiel wurde diese in der Variable namens $mpdf gespeichert.

Bei der Instanziierung können weitere Parameter angegeben werden, wie beispielsweise die Kodierung oder die Größe des PDFs:

$mpdf = new mPDF( 'utf-8', 'A5' );

Statt den Angaben 'A5' oder 'A4' können auch Pixel Millimeter in einem Array angegeben werden:

$mpdf = new mPDF( 'utf-8', array( 148, 210 ) );

Weitere Parameter sind die Schriftgröße, die Font-Familie (z.B. Arial), der linke, rechte, obere und untere Abstand, die Abstände der Fuß- und Kopfzeile, sowie die Angabe 'L', für Landscape und 'P' für Portrait:

$mpdf = new mPDF( 'utf-8', 'A5', 12, 'Arial', 20, 20, 20, 20, 5, 5, 'L' );

HTML und CSS

Der Funktion WriteHTML()11 kann u.a. ein String mit HTML mitgegeben werden.

$mpdf->WriteHTML( '<h1>Hallo Welt!</h1>' );

Im folgenden Codebeipiel wird der String einer Variable namens $html übergeben:

$html = '<bookmark content="Lesezeichen 1" />'; // Siehe Abschnitt: Lesezeichen
$html .= '<h1>Hallo Welt!</h1>';
$mpdf->WriteHTML( $html );

Das CSS kann direkt vom HTML kommen:

$html = '<style>h1{color:red}</style>';
$mpdf->WriteHTML($html);

oder als CSS-Datei mit Hilfe der Funktion WriteHTML() in das PDF integrieren:

$stylesheet = file_get_contents( 'style.css' );
$mpdf->WriteHTML( $stylesheet, 1 );

Lesezeichen

Mit dem String '<bookmark content="Lesezeichen 1" />' wurde im vorherigem Codebeispiel das Lesezeichen erzeugt. Alternativ kann der Befehl Bookmark()12 verwendet werden. Hiermit lässt sich optional über einen Integerwert der sogenannte "tree"-Level des Lesezeichens bestimmen:

$mpdf->Bookmark( 'Lesezeichen 1', 0 );
$mpdf->WriteHTML( '<h1>Hallo Welt</h1>' );

Neue Seite anlegen

Mit der Funktion AddPage()13 wird eine weitere Seite in dem PDF angelegt:

$mpdf->AddPage();

Die Funktion AddPage() kann mehrere Parameter entgegennehmen, wie die Orientation ('landscape', 'portrait'), Seiten-Typ (z.B. 'ODD', 'EVEN'), Weiterführung oder neuer Start der Seitennumerierung (0, 1), den Stil der Seitennummerierung (z.B. '1', 'A', 'I' (römische Ziffern)), die Unterdrückung der Seitennumerierung (0,1), die Abstände u.s.w.

Praxis-Beispiel: Die Angabe der folgenden Parameter eignen sich so z.B. für das Anlegen einer Cover-Seite, in der die bereits definierten Abstände auf Null gesetzt und die Seitennummerierung zurückgesetzt werden soll:

$mpdf->AddPage( '','',1,'','', 0, 0, 0, 0, 0, 0 );
$mpdf->WriteHTML('<div style="background:black; width:148mm; height:210mm"><h1 style="color:white; text-align:center; padding-top:40mm">Titel</h1></div>');

Anschließend kann der Funktion WriteHTML() erneut ein Lesezeichen und weiterer Text mit Bildern mitgegeben werden:

$mpdf->Bookmark( 'Lesezeichen 1-1', 1 );
$mpdf->WriteHTML('<h2>Hallo nächste Seite!</h2>');
$mpdf->WriteHTML('<p>Weiterer Text.</p>');
$mpdf->WriteHTML('<img src="tiger.jpg" alt="tiger.jpg" width="100">');

PDF direkt downloaden und speichern

Mit der Funktion Output()14 wird das PDF direkt bei Aufruf der PHP-Datei im Browser erstellt. Für den Fall, dass das PDF mit einem Namen direkt heruntergeladen werden soll, kann die Funktion Output() weitere Parameter entgegennehmen:

$mpdf->Output( 'filename.pdf','D' );

Der String 'filename.pdf' ist der Name der Datei und die Angabe 'D' steht für Download. Weitere Angabemöglichkeiten sind 'I' für Inline, das die Datei im Browser anzeigen wird, oder 'F' für File, mit dem sich die Datei auf dem Webspace, beispielsweise in einem Ordner namens pdf, speichern lässt:

$mpdf->Output( 'pdf/filename.pdf','F' );

Damit nicht jedes Mal beim Aufruf des PHP-Codes erneut das PDF erstellt wird, kann folgende bedingte Anweisung das erneute Erstellen unterbinden:

$filePath = 'pdf/filename.pdf';
if (! file_exists( $filePath ) ){
     $mpdf->Output( $filePath, 'F' );
     echo "Die Datei wurde erstellt.";
} else {
     echo "Die Datei existiert bereits.";
}

Beispielcode

Der folgende Code einer PHP-Datei erstellt bei Aufruf die beschriebene Beispiel-PDF. Diese kann anschließend mit Klick auf die Schaltfläche Download im Browser aufgerufen werden:

<?php

require_once( 'mpdf60/mpdf.php' );

$mpdf = new mPDF( 'utf-8', 'A5', 12, 'Arial', 20, 20, 20, 20, 5, 5, 'L' );
$mpdf->Bookmark( 'Lesezeichen 1', 0 );
$mpdf->WriteHTML( '<h1>Hallo Welt</h1>' );
$mpdf->AddPage();
$mpdf->Bookmark( 'Lesezeichen 1-1', 1 );
$mpdf->WriteHTML( '<h2>Hallo nächste Seite!</h2>' );
$mpdf->WriteHTML( '<p>Weiterer Text.</p>' );

$filePath = 'filename.pdf';
$downloadBtn = '<button type="submit" onclick="window.open(\''.$filePath.'\')">Download</button>';

if ( ! file_exists( $filePath ) ){
    $mpdf->Output( $filePath, 'F' );
    echo "Die Datei wurde erstellt.<br>"
    . $downloadBtn;
} else {
    echo 'Die Datei existiert bereits.</br>'
    . $downloadBtn;
}
exit; ?>

Tipp: Wer das Content-Management-System WordPress nutzt und seinen Lesern den PDF-Download eines Beitrages oder einer Seite ermöglichen möchte, kann das Plugin DK-PF15 von Emili Castells aktivieren, das zur PDF-Erstellung, ebenfalls die PHP-Bibliothek mPDF in der Version 6 verwendet. Wenn du den Code des Open-Source-Plugins anpassen und selbst pflegen möchtest, ändere den Namen des Plugin-Ordners und den Plugin-Namen in der Datei dk-pdf.php, um eine versehentliche Aktualisierung des Plugins zu vermeiden.

Links

Buchempfehlung

Anzeige | Affiliate-Link*

Möchtest du mehr über die Pro­gram­mie­rung dy­namischer Websites mit PHP und den Daten­bank­ver­walt­ungs­sys­temen MySQL und MariaDB erfahren, sei dir das 600 Seiten starke Standard­werk Einstieg in PHP 7 und MySQL des Dipl.-Ing. für Tech­nische Infor­matik Thomas Theis empfohlen, das 2017 im Rheinwerk Verlag erschien.