Jalara Studio

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 jeweils einem Lesezeichen erstellt wird:

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 kann auf der Website mpdf1.com5 die Bibliothek in der Version 6.0 in einer 56 MB großen .zip-Datei (MPDF_6_0.zip)6 herunter geladen werden. Lade anschließend den entpackten Ordner mit dem Namen mpdf60 auf den Server.

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.0, lässt sich das PDF mit folgendem PHP-Code8 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 auch der Befehl require_once()10 verwendet werden:

require_once( 'mpdf60/mpdf.php' );

Erklärung

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 in einem Array angegeben werden:

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

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. Der String kann auch einer Variable übergeben werden:

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

CSS-Dateien lassen sich ebenfalls mittels der Funktion WriteHTML() in das PDF integrieren:

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

Lesezeichen

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

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

Neue Seite anlegen

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

$mpdf->AddPage();

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; ?>

Links