PDF ist das Portable Document Format. Es wurde von der Firma Adobe entwickelt und hat sich als weit verbreitetes Format für den elektronischen Austausch von Dokumenten etabliert. Adobe PDF ermöglicht den Austausch von Dokumenten im originalen Layout unabhängig von der zur Darstellung genutzen Plattform. Zur Anzeige benötigt man den kostenlosen Adobe Acrobat Reader .
Ja. Es gibt für die Erstellung von PDF-Dateien mit PHP zwei Bibliotheken: die PDFlib von Thomas Merz und FastIO's ClibPDF . Für die kommerzielle Nutzung brauchst du aber eine spezielle Lizenz für die von dir verwendete Bibliothek. Details für die kommerzielle Nutzung von PDFlib findest du unter http://www.pdflib.com/pdflib/business.html . Den Lizenzvertrag zur Nutzung von ClibPDF findest du unter http://www.fastio.com/licensePlain.html .
Da das Erstellen von PDF-Dateien durch pixelgenaues Layouten sehr umständlich ist, hat Alexander Wirtz die Klassenbibliothek PC4P geschrieben, die die PDFLIB-Funktionen nutzt und mit der es wesentlich einfacher ist, Rahmen/Textblöcke etc. auf einem PDF-Dokument zu platzieren. Mit PC4P arbeitet man objektorientiert auf dem PDF-Dokument.
Eine weitere Variante PDF-Dateien zu erstellen ist die Verwendung einer der in PHP geschriebenen Klassen zur Generierung von PDF-Dateien wie FPDF , PDF-Klasse von RO&S oder der phppdflib . Diese Klassen bieten im Vergleich zu PDFlib und ClibPDF nur eingeschränkte - für viele Zwecke aber trotzdem ausreichende - Möglichkeiten.
Man kann PDF-Dateien aber auch ohne diese Bibliotheken oder Klasse erstellen - PDF-Dateien sind Text-Dateien, die bestimmte Steuersequenzen enthalten. Diese Steuersequenzen sind durch Adobe veröffentlicht worden und können wie normaler Text in eine Datei geschrieben werden. Adobe veröffentlicht die Details zum PDF-Format im Rahmen des Adobe Solutions Network (ASN) . Die Referenz ist auch in Buchform erhältlich. In Zusammenarbeit mit Adobe sind im Addison-Wesley-Verlag bisher folgende Bücher erschienen:
Im PDF-Format ist die Verwendung der LZW-Kompression möglich. Diese ist durch das US-Patent No. 4,558,302 geschützt, welches der Firma Unisys Corporation gehört. Man benötigt also bei Erstellung von PDF-Dateien auf Basis der Datei-Spezifikationen eine Lizenz von Unisys, oder muss auf Komprimierung verzichten.
Laut PHP-Manual sind alle Längen- und Koordinatenangaben in Postscript-Punkten gemessen. Für gewöhnlich entsprechen 72 PostScript-Punkte 1 Inch (72 dpi, 1 Inch = 2,54cm), was jedoch von der Auflösung des Ausgabegeräts abhängt (Drucker verwenden meist 300 oder 600dpi).
Die Spezifikation von Adobe überläßt die Wahl der Maßeinteilung dem Entwickler. Eine PDF-Seite ist immer im Format DIN A4, also 297 Millimeter hoch und 210 Millimeter breit. Beim Anlegen einer neuen PDF-Seite muss eine Höhe und eine Breite in Punkten angegeben werden. Diese Angaben bilden dann den Maßstab für das Koordinatensystem.
Dieser berechnet sich wie folgt: Punktanzahl durch Kantenlänge (in Millimetern). Definiert man also die Breite der Seite mit 2100 Punkten, so ergibt sich ein Maßstab von 10 Punkten pro Millimeter (2100 Punkte geteilt durch 210 mm).
Ja. Dies ist aber nicht zu empfehlen, da für die verzerrungsfreie Darstellung von Quadraten und Kreisen die unterschiedlichen Maßstäbe erst auf eine gemeinsame Basis gebracht werden müssen.
Jein, nicht in jedem Fall. Ob sich PDF-Dateien als Template eignen, hängt von verschiedenen Faktoren ab. Zum ersten kann man mittels Adobe Acrobat ein PDF optimieren (siehe Kapitel F der PDF-Referenz). Dabei wird das PDF in seiner Struktur verändert und zum Teil komprimiert. Zum anderen sind für PDF-Dateien einige Sicherheitseinstellungen möglich, die die nachträgliche Veränderung nicht erlauben. Ein nicht optimiertes und ungeschütztes PDF läßt sich aber als Template verwenden.
Antwort von Thomas Weinert:Das Beispiel liest eine PDF-Datei ein und ersetzt vordefinierte Inhalte in Formularfeldern. Die Inhalte müssen dazu dem Schema [[$variable]] entsprechen.
Das Array $pdf_vars kann nach Bedarf gefüllt werden. Im Beispiel wird der Inhalt [[$foobar]] durch dclp-faq ersetzt.
<?php
//PDF-Datei mit Forumarfeldern
$pdffile = "sample_form.pdf";
//Variablen
$pdf_vars = array(
'foobar'=>'dclp-faq'
);
//Funktion zum Ersetzen
function replace_pdf_var($match){
if (isset($GLOBALS['pdf_vars'][$match[1]])) {
return $GLOBALS['pdf_vars'][$match[1]];
} else {
return $match[1];
}
}
if(file_exists($pdffile)){
//Das Template binär öffnen
if ($fp = fopen($pdffile, 'rb')) {
$template = fread ($fp, filesize ($pdffile));
fclose ($fp);
//auf das Template einen Regex anwenden.
$pdf = preg_replace_callback('#\[\[\$([^\]]+)\]\]#',
'replace_pdf_var', $template);
//HTTP-Header ausgeben
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$pdffile\"");
header("Content-type: application/pdf");
//das fertige PDF ausgeben
echo $pdf;
}
}
?>
Ja. Adobe hat die Verschlüsselung von PDF-Dokumenten mittels einer Kombination aus MD5-Hashes und RS4 vorgesehen. Näheres findet sich in der PDF-Referenz: 3.5 Encryption.
Ja, allerdings gibt es nur zwei verschiedene Rollen. Es wird zwischen dem Besitzer und dem Benutzer unterschieden. Beide Benutzer verwenden unterschiedliche Passwörter. Der Besitzer hat nach Eingabe seines Passwortes volle Zugriffsrechte (einschließlich aller Veränderungen), die Rechte des Benutzers regeln die Einstellungen der Sicherheitsoptionen.
Die Details zur Vergabe der Rechte und die Generierung der Passwörter findest du in der PDF-Referenz: 3.5.2 Standard Security Handler.
Nein. Du kannst zwar den Inhalt der Variable $HTTP_ACCEPT prüfen, diese enthält aber nicht unbedingt die richtigen Werte. Eine Angabe wie Accept: */* (alle MIME-Types werden unterstützt) hilft nicht weiter.
Du solltest deine User darauf hinweisen, das sie den Adobe Acrobat Reader brauchen und ihnen eine Downloadquelle anbieten.
Der korrekte MIME-Type für PDF-Dateien lautet "application/pdf". Du kannst ihn mittels header("Content-type: application/pdf") an den Browser senden.
Zur Laufzeit kannst du die Funktion extension_loaded() verwenden, um zu testen, ob die von dir benötigte Bibliothek zur Verfügung steht. Desweiteren kannst du Ausgabe von phpinfo() durchschauen.
Wenn du deine PHP-Installation selbst kompiliert hast, dann lies bitte unter Komplette Liste der Konfigurationsoptionen nach, welche Optionen du für configure verwenden musst.
Desweiteren gibt es in der PHP-FAQ ein ganzes Kapitel zum Thema: install .
Internet Explorer achtet in vielen Bereichen (fälschlicherweise) auf Dateienedungen statt auf den MIME-Typ. Bei Verwendung eines GET-Requests, insbesondere aber bei einem POST-Request kann es dazu kommen, dass nur eine leere Seite dargestellt wird. Folgende Möglichkeiten gibt es, diesen Bug zu umgehen:
Umbenennen der Dateiendung in .pdf und Konfigurieren des Servers, dass .pdf-Dateien durch PHP geparsed werden, z.B. durch die Apache-direktiven AddType oder ForceType .
Bei GET ohne Parameter: Anhängen der Zeichenkette /.pdf an die URL. Beispiel: /pdf.php/.pdf . Über diese Methode kann auch ein Dateiname spezifiziert werden, für den Fall, dass die Datei abgespeichert wird und der betreffende Browser die Content-Disposition -Direktive nicht kennt.
Alternativ: Anhängen der Zeichenkette ?.pdf an die URL. Beispiel: /pdf.php?.pdf .
Bei GET mit Parametern: Anhängen der Zeichenkette &.pdf an die URL. Beispiel: /pdf.php?file=termine&.pdf .
Bei POST: Schreiben des Ergebnisses in eine temporäre Datei mit der Endung .pdf und Weiterleitung per header() auf die Datei.
Alternativ bei kleinen PDF-Dateien (siehe sessions-datenmenge ): Die PDF-Datei in die Session schreiben und Weiterleitung auf eine PHP-Datei, die den Dateiinhalt aus der Session ausgibt, mit den oben beschriebenen GET-Methoden.
Das Umschreiben der URL auf der Serverseite, z.B. durch das Apache-Modul mod_rewrite .