PDFs generieren mit dem Zend-PHP-Framework

heise Developer hat am 29.12.2008 einen Artikel zum Thema „PDFs generieren mit dem Zend-PHP-Framework“ veröffentlicht.

Das Zend-Framework unterstützt den PDF-Standard in der Version 1.4, entsprechend Adobes Acrobat 5. In den Dokumenten lassen sich Seiten hinzufügen oder entfernen, außerdem kann man die Sortierung und Dokumenteigenschaften (Autor, Titel u.Ä.) ändern. In die Dokumente lassen sich Texte, einfache Grafikelemente (Linien, Rechtecke, Polygone, Kreise und Ellipsen) sowie Bilder im JPG-, PNG- oder TIFF-Format zeichnen.

In dem Artikel wird mit einfachen Beispielen die Nutzung von Zend_Pdf veranschaulicht.

PHP Locale/Zeitzone setzen

Folgende Codes wurde unter PHP 5.2.x getestet.

Setzen der Standard Zeitzone:
date_default_timezone_set('Europe/Berlin');

Ausgeben aller installierten Locales:
ob_start();
system('locale -a');
$str = ob_get_contents();
ob_end_clean();
var_dump(split("\\n", trim($str)));

Setzen einer Locale:
setlocale(LC_ALL, 'de_DE.ISO8859-15', 'de_DE.ISO8859-1', 'de_DE');
setlocale(LC_ALL, 'de_DE.UTF-8');

Ob nun UTF-8 oder UTF8 gesetzt werden muss, scheint abhängig vom eingesetzten Server zu sein.
In meinem Test musste UTF-8 gesetzt werden. Weitere Infos unter: http://de.php.net/de/setlocale

neues Zend Framework Rewrite

Seit einiger Zeit findet sich im Quickstart Tutorial (englisch) des Zend Frameworks eine neue verbesserte RewriteRule:

Wird das mod_rewrite Modul unter Apache verwendet, wird empfohlen, eine .htaccess Datei mit folgendem Inhalt im Hauptverzeichnis der Domain (DocumentRoot) abzulegen:

# public/.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]

Was passiert hier nun?

Die Umgebungsvariable REQUEST_FILENAME beinhaltet laut Apache-Dokumentation den vollen Pfad zur Datei oder zum Script entsprechend der Anfrage (z.B. /var/www/domain.tld/public/css/style.css).

Die drei Bedingungen (RewriteCond) prüfen nun, ob diese/s Datei/Script eine tatsächlich existierende Datei (s), symbolischer Link (l) oder ein Verzeichnis (d) sind. Wenn ja: leite die Anfrage unverändert durch und beachte keine weiteren Regeln ([L] = Last/Letzte Regel), also kein Rewrite und Ende der Prüfung. Wenn nein: Schreibe die Anfrage zu /index.php um. Das NC bewirkt, dass nicht zwischen Klein- und Großschreibung unterschieden wird (NC = no case-sensitive).

Besonderheit bei Deklaration der Rewrite Bedingungen/Regeln innerhalb eines VirtualHost
Die zuvor aufgezeigten Bedingungen gelten für die Deklaration innerhalb einer .htaccess Datei. Gleichermaßen kann das Rewriting natürlich auch innerhalb einer VirtualHost Definition deklariert werden.

Jedoch ist bei einer Deklaration innerhalb eines VirtualHosts zu beachten, dass die Umgebungsvariable REQUEST_FILENAME hier nicht den vollen, sondern den relativen Pfad vom DomainRoot beinhaltet.

In den Bedingungen muss daher die Umgebungsvariable DOCUMENT_ROOT zusätzlich vorangestellt werden!
Der Rest bleibt erhalten.

# innerhalb VirtualHost Deklaration
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -s [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -l [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]