Debian 6: PDFLib 7.0.5 als PHP 5.4-Erweiterung auf Squeeze installieren

Stefan Keller, den 5. Mai 2012
php-Logo
php-Logo

PDFLib ist eine Programmbibliothek, die es erlaubt, aus beliebigen Programmen heraus PDF-Dateien zu erstellen. Gerne kommt diese Bibliothek als Königslösung für PHP-Scripte zum Einsatz, weil sie ziemlich mächtig ist. Leider ist sie für den kommerziellen Einsatz auch relativ teuer – umso ärgerlicher ist, dass sie in älteren Versionen nicht mehr vom Hersteller angepasst wird. Aber glücklicherweise kann man das Problem selbst lösen.

Zum Ausgangspunkt: Wir befinden uns auf einem Debian-System, das frisch aufgesetzt und aktualisiert wurde. Über die Backports von dotdeb.org wurde PHP 5.4.0 und MySQL 5.5 installiert. Die Aufgabe lautet nun, die relativ alte PDFLib 7.0.5 als PHP-Modul zu installieren.

Probleme über Probleme

Der Hersteller bietet eine Extension für PHP an. Diese funktioniert einwandfrei und muss nur in den extensions-Ordner von PHP kopiert und in der php.ini aktiviert werden. PDFLib 7.0.5 ist aber leider eine alte Version, die nicht mehr gepflegt wird, eine neue Lizenz kostet 795 Euro, ein Upgrade von einer älteren Ausgabe 60% davon, also immer noch 477 Euro.

Problematisch an den Extensions für ältere PHP-Versionen ist, dass eine Erweiterung immer gegen den gleichen API-Level gelinkt werden muss, auf dem PHP läuft. Da für PHP 5 nur Extensions für 5.1, 5.2 und 5.3 mitgeliefert werden, funktionieren diese also nicht.

Installation mit PECL und dessen Bugs

Eine Lösungsmöglichkeit ist es, PDFLib mit PECL (PHP Extension Community Library) nachzurüsten. Diese Möglichkeit geht im Standardfall von einer noch älteren Lite-Version von PDFLib aus, die viele Funktionen (unter anderem Tabellen) nicht bietet, dafür aber im Quellcode vorhanden ist. Mit diesem Paket ist es möglich, PDFLib in seiner C-Implementation als PHP-Extension zu kompillieren. Leider stellen einige Bugs den geneigten root vor schier unlösbare Probleme: Es hagelt deprecated-Meldungen und der Compiler bricht das Unterfangen ab. Mit etwas Frickelarbeit gelingt es dann aber doch.

Zunächst: Was wird gebraucht?

Bevor wir überhaupt starten können, werden ein paar Pakete unbedingt benötigt. Unverzichtbar ist die Möglichkeit, etwas kompillieren zu können. Darum kümmert sich das Meta-Paket „build-essential“, das einen ganzen Rattenschwanz von anderen Paketen hinter sich herzieht – so zum Beispiel den freie C-Compiler gcc. Des Weiteren wird PEAR (PHP Extension and Application Repository) benötigt. Nicht vergessen werden dürfen natürlich noch die Header-Dateien von PHP selbst, diese befinden sich im Paket php5-dev. Alles in allem kann auf einem Debian-System folgende Zeile aufgerufen werden:

apt-get install build-essential php-pear php5-dev

Natürlich sollen Abhängigkeiten dabei aufgelöst und benötigte Pakete installiert werden.

PDFLib 7 installieren

Nun benötigen wir das PDFLib-Paket für C, C++ und Java (http://www.pdflib.com/download/pdflib-family/pdflib-7/) (NICHT das für PHP). Es ist noch auf der Webseite des Herstellers zu finden, genauso wie ältere Versionen übrigens auch. Dieses kann per wget einfach und direkt auf den Server heruntergeladen und mit tar entpackt werden:

wget http://www.pdflib.com/binaries/PDFlib/705/PDFlib-7.0.5-Linux-x86_64.tar.gz
tar xfvz PDFlib-7.0.5-Linux-x86_64.tar.gz

Weiterhin wird das PDFLib-Paket aus dem PECL benötigt (http://pecl.php.net/get/pdflib-2.1.8.tgz) – dieses wird ebenfalls auf den Server geladen und dort entpackt. Wir gehen hierbei von Version 2.1.8 aus, die am 05. Mai 2010 veröffentlicht wurde.

Normalerweise könnte dieses Paket auch einfach mithilfe von

pecl install pdflib

installiert werden, aber weiter oben bin ich bereits auf Fehler eingegangen, die in diesem Paket noch enthalten sind. Deswegen müssen wir uns direkt am Quellcode bedienen und zwei Dateien austauschen. Sie heißen pdf.c und pdf7.c. Sie können über den Befehl „View Source“ dargestellt werden (http://svn.php.net/viewvc/pecl/pdf/trunk/), wenn man auf den Dateinamen klickt, erscheinen alle Commits. Wir nutzen die neuste Revision (pdf.c: 322900, pdf7.c: 323503) und klicken in der entsprechenden Zeile auf „Download“. Beide Dateien müssen mit jene aus dem PECL-Paket ersetzen.

Nun kann das Paket endlich kompilliert werden. Also in den Ordner des PECL-Pakets wechseln (darin befindet sich z. B. eine CREDITS-Datei), und kompillieren:

phpize
./configure
make
make install

Wenn nach dem Pfad zur pdflib-Installation gefragt wird, muss folgendes Muster angegeben werden:

PFAD_ZUM_C_PAKET/bind/c

Stellen wir uns also vor, es ist nach dem Entpacken im home-Ordner von root ein Ordner PDFlib-7.0.5-Linux-x86_64 entstanden, so lautet die Antwort auf diese Frage:

/root/PDFlib-7.0.5-Linux-x86_64/bind/c

Das war es schon beinahe. Jetzt muss nur noch das Kompilat in den Extensions-Ordner kopiert werden. Eigentlich sollte das make-File dies bereits für uns übernehmen, aber in ersten Tests kam es zu nicht nachvollziehbaren Problemen, weshalb wir besser auf Nummer sicher gehen.

cp /root/pdflib-2.1.8/modules/pdf.so /usr/lib/php5/20100525

Abschließend muss nur noch mit dem Text-Editor eures Vertrauens (nano würde reichen) die PHP-Extension in die php.ini eingetragen werden:

nano /etc/php5/apache2/php.ini

Es ist wichtig, dass ihr die richtige php.ini erwischt. Je nach Konfiguration kann sie sich anderswo befinden; phpinfo() gibt euch Auskunft.

An eine geeignete Stelle, beispielsweise vor

[CLI Server]

fügt ihr folgende Zeile ein:

extension=pdf.so

Nun müsst ihr noch abspeichern, nano beenden und den Apache (oder euren favorisierten HTTP-Server) neustarten:

/etc/init.d/apache2 restart

Jetzt seid ihr fertig, könnt euch nun mit dem Befehl

phpinfo();

die Laufzeitkonfiguration ausgeben lassen. Wenn ihr dort den Abschnitt „pdf“ findet, hat alles bestens funktioniert, und ihr habt fast 500 Euro gespart.


Ähnliche Nachrichten