ionicons-v5-a Blog

Die Erstellung individueller PDF-Dokumente ist eine sehr zeitaufwändige Aufgabe in Projekten. Um diesen Prozess zu verbessern, gibt es verschiedene Ansätze – einer der gängigsten ist die Erstellung eines HTML-Dokuments, das in eine PDF-Datei konvertiert wird. Aber diese Lösung ist nicht immer die beste, da jedes neue PDF-Dokument zunächst erneut als HTML-Dokument implementiert werden muss.

Intro

Im Internet findet man nur wenige Lösungen für die Bearbeitung von Word-Dokumentvorlagen mit PHP. Die beliebtesten sind PHP Word, phpdocx und LiveDocx. Da PHP Word die einzige kostenlose Lösung ist, haben wir das getestet.

Die Autoren von PHP Word sagen über PHP Word: „PHPWord ist eine in reinem PHP geschriebene Bibliothek, die eine Reihe von Klassen zum Schreiben und Lesen verschiedenen Dokumentdateiformaten bietet. Die aktuelle Version von PHPWord unterstützt Microsoft Office Open XML (OOXML oder OpenXML), OASIS Open Document Format for Office Applications (OpenDocument oder ODF), Rich Text Format (RTF), HTML, und PDF”1.

Die getestete Version ist v0.12.1. Die unterstützten Formate sind, eher bekannt durch ihre Dateiendungen, Office Open XML – .docx und .docm, Open Document – .odt und .fodt.

Obwohl PHP Word sowohl auf  CodePlex und GitHub zu finden ist, ist es vor einiger Zeit zu GitHub migriert. Die Dokumentation ist hier zu finden .

Für den Fall, dass jemand eine kostenlose Lösung für die Bearbeitung von Tabellen benötigt, verfügt dasselbe Team (das PHP Office) über eine PHP-Excel-Bibliothek. Im Folgenden möchten wir Ihnen erklären, wie Sie PHP Word zur Bearbeitung von .docx-Vorlagen einrichten und verwenden können.

PHP Word Setup

In diesem Kapitel zeigen wir Ihnen, wie man PHP Word einrichtet. Wir beginnen mit einer Liste von Voraussetzungen und erklären, wie man PHP Word auf einem Linux-Server installiert und wie man es nutzt.

Voraussetzungen

Bevor wir mit den verschiedenen Schritten beginnen, müssen wir prüfen, welche Voraussetzungen notwendig sind. Zunächst müssen Sie in der Lage sein, PHP Word auf Ihrem Linux-Webserver einzurichten. Dazu benötigt man:

Installation

Der empfohlene Weg PHP Word zu installieren, ist die Verwendung eines Composers. Wenn Sie lieber keinen Composer verwenden möchten, können Sie das Projekt bei GitHub herunterladen oder klonen.

„Composer ist ein Tool zur Verwaltung von Abhängigkeiten in PHP. Es erlaubt Ihnen, Bibliotheken, von denen Ihr Projekt abhängt, zu deklarieren und zu verwalten (installieren/aktualisieren).“ „Er arbeitet mit ‚Paketen‘ oder Bibliotheken, verwaltet sie aber projektbezogen und installiert sie in einem Verzeichnis (z.B. vendor) innerhalb Ihres Projekts. Standardmäßig installiert es nichts global². Der Composer verwendet die Datei composer.json um zu erkennen, welche Pakete oder Bibliotheken er herunterladen muss.

Um PHP Word mittels Composer zu installieren, müssen Sie „phpoffice/phpword“ ergänzen: Fügen Sie „dev-master“ zu Ihrer composer.json Datei unter dem require key hinzu. Wenn Sie keine composer.json Datei haben, erstellen Sie einfach eine in Ihrem Projektstamm mit folgendem Inhalt:

{
"require": {
"phpoffice/phpword": "dev-master"
}
}


In beiden Fällen geben Sie nach dem Speichern der Datei composer.json den Befehl composer install im terminal des Verzeichnisses ein, in dem Sie die Datei abgelegt haben.

PHP Word in Ihr spezifisches Projekt einbinden

Um PHP Word in Ihr Projekt einzubinden, müssen Sie die PHP Word Autoloader.php aus dem Ordner src/PHPWord aufrufen und registrieren:

require_once 'src/PhpWord/Autoloader.php';
\PhpOffice\PhpWord\Autoloader::register(); 

Templates bearbeiten

Sie benötigen wahrscheinlich verschiedene Vorlagen mit unterschiedlichen Inhalten für jeden Benutzer, jede Quittung etc. Das dafür ist PHP Word sehr nützlich und wird Ihre Arbeit einfacher machen.

Die einzige Voraussetzung ist , dass das Dokument mit der Endung .docx gespeichert wird. Platzhalter für Variablen oder Arrays in der Vorlage werden auf die gleiche Weise definiert: ${variableName} oder ${arrayName}. Der Platzhalter für ein Array MUSS sich in einer Tabellenzelle befinden, damit es später geklont werden kann. So können Sie später programmatisch beliebig viele Einträge in einen Platzhalter einfügen.

Um die Platzhalter durch Ihre Variablen zu ersetzen, müssen Sie:

1. Template öffnen:
$template = new\PhpOffice\PhpWord\TemplateProcessor(‚folder/file.docx‘);

2. Platzhalter durch Ihre Variablen ersetzen:
$template->setValue(‚variableName‘, ‚MyVariableValue‘);

3. Platzhalter durch Ihre Arrays ersetzen:
3a: Zuerst müssen Sie Ihren Array-Platzhalter entsprechend der Anzahl Ihrer Arrays klonen
3b: $template->cloneRow(‚arrayName‘, count($array));
3c: dann müssen Sie ihnen allen einen Wert geben
3d: for($number = 0; $number < count($array); $number++) {
    $template->setValue(‚arrayName#‘.($number+1), htmlspecialchars($array[$number], ENT_COMPAT, ‚UTF-8‘));
}

4. geänderte Datei speichern:
$template->saveAs(‚folder/result.docx‘);

In PDF konvertieren

Es gibt die Möglichkeit, dompdf in PHP Word zu integrieren, um eine Datei nach der Bearbeitung des Templates in eine PDF-Datei umzuwandeln. Das Ergebnis wird jedoch nicht ein erwartetes gut formatiertes Dokuments sein. Wenn Sie die bestmöglichen Ergebnisse erreichen wollen, ist es am einfachsten LibreOffice auf Ihrem Server zu installieren.Wenn Sie auf einem Shared Hosting-Server arbeiten, können Sie das wahrscheinlich nicht tun.  Dann benötigen Sie entweder einen Virtual Private Server (VPS) oder ein dediziertes Hosting. VPS-Hosting ist heutzutage nicht mehr allzu teuer.  Wenn Sie Dateien in PDF konvertieren möchten, müssen Sie es beschaffen und einrichten. Sollten Sie beim Versuch, mit LibreOffice zu konvertieren auf Probleme stoßen, gibt es immer noch ein großartiges Backup – unoconv.

Universal Office Converter (unoconv) ist ein Befehl für die Kommandozeile zur Konvertierung jedes beliebigen Dokumentformats, das LibreOffice importieren kann, in jedes andere beliebige Dokumentformat, das LibreOffice exportieren kann. Es nutzt die UNO-Bindungen von LibreOffice für die nicht-interaktive Konvertierung von Dokumenten.

Nachdem Sie LibreOffice auf Ihrem Server installiert haben, können Sie wie folgt überprüfen, ob es funktioniert: Navigieren Sie zum Ordner, in dem sich einige Ihrer Dokumente befinden, und geben Sie folgenden Befehl ein:

libreoffice --headless --convert-to pdf /path/to/document/file --outdir /desired/output/directory

oder wenn Sie es mit PHP ausgeben wollen:

shell_exec('libreoffice --headless --convert-to pdf /path/to/document/file --outdir /desired/output/directory');

Wenn Sie nach diesem Befehl ein PDF erhalten, sind Sie startklar und alles funktioniert. Es gibt zwei mögliche Fehler.

Der erste Fehler ist:

“[Java framework] Error in function createSettingsDocument (elements.cxx).javaldx failed!

Warning: failed to read path from javaldx”

Dieser kann gelöst werden. Sie müssen den Ordner .config im Home-Verzeichnis Ihres Apache-Nutzers erstellen. Für CentOS, Debian und Ubuntu ist es /var/www. Sie müssen diesen Benutzer mit sudo-Rechten (oder Root-Nutzer-Rechten, was aber nicht empfohlen wird) verwenden, um die erforderlichen Befehle nutzen zu können. Navigieren Sie zum gewünschten Ordner

cd /var/www

und erstellen Sie dort den Ordner:

mkdir .config    

Danach muss der Apache-Benutzer und -Gruppe zum Besitzer des neu erstellten Ordners ernannt werden. Apache-Benutzer und -Gruppe sind apache für CentOS und www-data für Ubuntu und Debian. Für CentOS

sudo chown -R apache:apache /var/www/.config

oder für Debian/Ubuntu:

sudo chown -R www-data:www-data /var/www/.config


Die zweite Fehlermeldung beginnt mit:

“Error: Please verify input parameters…”

Für dieses Problem fanden wir keine funktionierende Lösung, auch wenn es online einige Vorschläge gibt. Sollten Sie eine Lösung finden, freuen wir uns über Ihren Kommentar zu diesem Artikel.

Sollten Sie mit LibreOffice kein Glück gehabt haben, können Sie unoconv mit nur wenigen weiteren Anpassungen verwenden, um das selbse Ergebnis zu erhalten.

Nach der Installation müssen Sie dem Apache-Benutzer und der Apache-Gruppe sudo-Rechte für unoconv (nur für unoconv!) gewähren, da sudo-Rechte ausgeführt werden müssen. Auch hier ist folgender Befehl mit einem Benutzer mit sudo-Rechten auszuführen:

sudo visudo

Wenn es sich öffnet, scrollen Sie nach unten und suchen Sie die folgende eine Zeile:

root ALL=(ALL:ALL) ALL

Darunter sollten Sie für CentOS Folgendes hinzufügen:

apache ALL=NOPASSWD:/usr/bin/unoconv
%apache ALL=NOPASSWD:/usr/bin/unoconv

oder für Debian/Ubuntu:

www-data ALL=NOPASSWD:/usr/bin/unoconv
%www-data ALL=NOPASSWD:/usr/bin/unoconv

Dadurch kann Ihr Apache-Benutzer und Ihre Gruppe nur unoconv mit sudo-Rechten ausführen, ohne dass ein Passwort erforderlich ist.

Wenn das erledigt ist, aktivieren Sie unoconv mit diesem Befehl:

sudo unoconv -f pdf /path/to/input/file

Dieser Befehl konvertiert die Eingabedatei in eine PDF-Datei und speichert sie im aktuellen Ordner. Oder falls Sie PHP verwenden wollen, führen Sie es einfach mit shell_exec aus:

shell_exec('sudo unoconv -f pdf /path/to/input/file');

Resultate

Als Ergebnis dieses ganzen Prozesses erhalten wir ein pixelgenaues PDF-Dokument, das wir an unsere Kunden senden können.

Der größte Vorteil dieser Lösung besteht darin, dass sie stundenlange Entwicklungsarbeit erspart. Jeder, der eine beliebige PDF-Datei mit einer beliebigen Lösung erstellt hat – entweder mit einer Lösung, die direkt in PDF schreibt (oder zeichnet), oder mit einer zuerst erstellen HTML-Vorlage, die dann in PDF umgewandelt wurde – wird wissen, wie viel Zeit das kostet, und dass die Ergebnisse nicht immer unseren Erwartungen entsprechen. Ganz zu schweigen von der Zeit, die Sie bereits mit der PDF-Erstellung verbracht haben bevor der Kunde einige Änderungen wünscht. Mit dieser Lösung können Sie Kunden ihre eigene Vorlage erstellen lassen und sie jederzeit problemlos und schnell ändern.

Auch wir haben früher viel Zeit mit dem Bearbeiten von PDFs verloren. Doch nun haben wir diesen Service teamweit eingerichtet. Alle unsere zukünftigen Projekte können wir unsere gesparte Zeit nutzen, um Wichtigeres zu tun – denn alles ist besser, als Stunden mit der Erstellung von PDFs zu verschwenden.

Wir hoffen, dieses Tutorial hilft Ihnen, Ihre PDF-Erstellung in PHP zu optimieren. Wenn Sie Fragen haben, zögern Sie nicht, uns zu kontaktieren und uns eine Nachricht zu hinterlassen.

Wenn es darüber hinaus Dinge gibt, die Sie für dieses Tutorial für wichtig halten, lassen Sie es uns bitte wissen.

1 https://github.com/PHPOffice/PHPWord

2 https://getcomposer.org/doc/00-intro.md3

3 https://github.com/dagwieers/unoconv

Newsletter

Erhalten Sie relevante Updates, wertvolle Informationen und kein Spam.