PDFs in Laravel mit wkhtmltopdf erstellen

Nachdem ich mich jetzt sicher schon zum dritten oder vierten mal mit der Installation und Einrichtung von wkhtmltopdf unter Ubuntu herumgeschlagen habe verfasse ich nun diesen Blogpost als Gedankenstütze und hoffentlich um auch anderen Leuten die Kopfschmerzen zu ersparen. Regelmäßig endet der Installationsversuch in der Fehlermeldung „Cannot connect to X Server“ weil immer genau soviel Zeit zwischen zwei Installationen vergeht, dass ich den Trick vergessen habe und die meisten Informationen bei Google leider schon veraltet sind.

Wenn du also bereits auf dasselbe Problem gestoßen bist, in diesem Artikel schauen wir uns an wie man wkhtmltopdf installiert und wie man danach in Laravel damit ganz einfach PDFs wie zum Beispiel Rechnungen erstellen kann.

wkhtmltopdf installieren

Bevor wir unser wundervolles generiertes PDF in den (virtuellen) Händen halten müssen wir natürlich die Software installieren, die die Arbeit für uns übernimmt. Es gibt hier diverse Lösungen, allerdings bin ich (von den Installationsschwierigkeiten mal abgesehen) bisher von wkhtmltopdf am überzeugtesten. Der etwas kryptische Name steht dabei für WebKitHTMLToPDF.
Und im Namen lässt sich auch schon der große Vorteil des Tools erkennen: Im Gegensatz zu anderen Libraries, die HTML in ein PDF verwandeln und dabei selbst versuchen, CSS auszuwerten geht wkhtmltopdf einen anderen Weg. Unser gewünschter HTML Code (inklusive CSS) wird durch eine WebKit Engine gerendert. Auf WebKit basieren zum Beispiel auch die Engines, die Webseiten im Google Chrome oder Apple Safari rendern. Das Ergebnis des Renderings wird dann danach in ein PDF gepackt.

Durch diesen kleinen „Umweg“ können wir wesentlich modernere CSS Techniken verwenden und das PDF sieht trotzdem gut aus. Doch wie installieren wir die Library nun?
Die hier gezeigten Befehle beziehen sich auf Ubuntu 14.04 mit 64bit (weil das auf all meinen Servern läuft :)).

Zuerst installieren wir das Paket xfonts-75dpi da wkhtmltopdf das benötigt:

Als nächstes laden wir wkhtmltopdf mit dem wget Befehl herunter:

Und nun installieren wir das Paket noch manuell mit dpkg:

Achtung: Beim letzten Befehl kommen manchmal noch Meldungen bezüglich fehlender Abhängigkeiten (zum Beispiel xfonts-base). In diesem Fall diese Abhängigkeiten einfach mit apt-get install PAKET installieren, sobald sie installiert sind wird wkhtmltopdf automatisch fertig eingerichtet.

Nun können wir testen, ob das Programm funktioniert. Der Befehl

sollte einen langen Hilfetext zeigen bei dem ganz oben irgendwo die Version 0.12.2 steht (siehe den Dateinamen, den wir vorher heruntergeladen haben). Mit dem Befehl

sollte außerdem ein PDF von der Google Startseite erstellt werden können ohne eine Fehlermeldung zu erhalten.

 

 

PDF Wrapper in Laravel einrichten

Nachdem unsere Library nun einsatzfähig ist geht es an die Integration in Laravel. Um nicht alles selbst machen zu müssen verwenden wir ein tolles Package von Barry van den Heuvel – Laravel Snappy. Dieses wrappt die Funktionalitäten von wkhtmltopdf und stellt sie uns in Laravel mit einer simplen Facade zur Verfügung.

Für die Installation fügen wir unserer composer.json einfach folgende Abhängigkeit hinzu und updaten die Packages danach.

Nach durchgeführtem Update muss dann natürlich noch der Service Provider registriert. Außerdem – wenn wir oben erwähnte Facade verwenden wollen – muss natürlich auch diese hinzugefügt werden. Dafür registrieren wir beides einfach in der Datei config/app.php.

 

Mit diesen Einstellungen sollten wir nun soweit sein, dass wir die PDF Facade für die Erstellung von PDF Dateien verwenden können.

 

 

Einen View als PDF Datei ausgeben

Mit funktionierendem wkhtmltopdf und eingerichtetem Wrapper können wir nun endlich ein PDF erzeugen (was erfreulicherweise ganz einfach ist). Dafür können wir in einem Controller einfach folgenden Code aufrufen:

Damit erzeugen wir aus dem View invoice.blade.php im Ordner pdf einfach eine fertige PDF Datei und laden diese im Browser automatisch mit dem Namen invoice-123.pdf runter. Natürlich können wir sie auch im Browser selbst anzeigen, dafür verwenden wir einfach die Methode inline() statt download().

 

Und schon ist das Problem gelöst. Mit diesen einfachen Werkzeugen können wir nun zum Beispiel automatisiert Rechnungen erstellen und per E-Mail versenden oder Diagramme als PDF zum Download anbieten. Was hast du bisher für Erfahrungen mit PDF Libraries gemacht? Ich freue mich über jeden Tipp als Kommentar!

3 Kommentare zu “PDFs in Laravel mit wkhtmltopdf erstellen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*