FAQ

Häufige Fragen und Antworten

1. Ist eine Lizensierung notwendig? Gibt es Nutzungsbeschränkungen?


FPDF ist Freeware (ist zu Beginn im Quellcode des FPDF Scripts vermerkt). Es gibt keine Nutzungsbeschränkungen. FPDF kann nach Belieben in Applikationen (kommerziell oder privat) verwendet werden, mit oder ohne Modifikationen am Quellcode.

2. Wenn ich ein PDF Dokument erzeuge werden wirre Zeichen ausgegeben. Warum?


Diese "wirren" Zeichen sind der tatsächliche Inhalt des PDF Dokuments der durch den Acrobat Reader interpretiert und dargestellt wird. Dieses Verhalten ist ein Bug im Internet Explorer. Wenn der Internet Explorer unter ein und derselben URL zuerst ein HTML Dokument und danach ein PDF Dokument erhält, wird dieses direkt, ohne den Acrobat Reader zu starten ausgegeben. Dieses Verhalten tritt meistens während der Entwicklung eines Script auf: Das Script hat einen Fehler und eine Fehlermeldung des Parseres wird als HTML an den Browser gesendet. Nachdem der Fehler behoben wurde und das Script ausgeführt wird, sendet dieses ein PDF Dokument und der obige Sachverhalt tritt ein. Um dieses Problem zu lösen kann ein Neustart des Internet Explorers vorgenommen werden, oder vor dem nächsten Aufruf eine andere URL geöffnet werden. Um dieses Verhalten zu umgehen, sollte das PDF Dokument während der Entwicklung als Datei erzeugt werden die dann geöffnet werden kann.

3. Ich versuche ein PDF Dokument zu erzeugen und der Internet Explorer zeigt eine leere Seiten an. Wieso?


Zuerst sollte sichergestellt werden, dass keine Ausgabe erfolgt, nachdem das PDF Dokument an den Browser gesendet wurde (nicht einmal ein Leerzeichen, Zeilenumbruch oder ähnliches). Um dieses sicherzustellen kann eine exit() Anweisung unmittelbar nach der dem Aufruf der Output() Methode verwendet werden um die Skriptausführung direkt nach der Ausgabe zu beenden.

If it still doesn't work, it means you're a victim of the "blank page syndrome". IE used in conjunction with the Acrobat plug-in suffers from numerous bugs, in all versions. You should test your application with as many IE versions as possible (at least if you're on the Internet). The problem occurs mostly with the POST method, so it is h2ly advised to avoid it (all the more that it causes other problems, see the next question). The GET works better but may fail when the URL becomes too long: don't use a query string with more than 45 characters. However, a tip exists to exceed this limit: end the URL with .pdf, which tricks IE. If you use a form, you can add a hidden field at the last position:

<INPUT TYPE="HIDDEN" NAME="ext" VALUE=".pdf">


The usage of PHP sessions also often causes trouble (avoid using HTTP headers preventing caching). See question 5 for a workaround.

To avoid all these problems in a reliable manner, two main techniques exist:

- Disable the plug-in and use Acrobat as a helper application. To do this, launch Acrobat; in the File menu, Preferences, General, uncheck the option "Web Browser Integration" (for Acrobat 5: Edit, Preferences, Options, "Display PDF in Browser"). Then, the next time you load a PDF in IE, it displays the dialog box "Open it" or "Save it to disk". Uncheck the option "Always ask before opening this type of file" and choose Open. From now on, PDF files will open automatically in an external Acrobat window.
The drawback of the method is that you need to alter the client configuration, which you can do in an intranet environment but not for the Internet.

- Use a redirection technique. It consists in generating the PDF in a temporary file on the server and redirect the client on it (by using JavaScript, not the Location HTTP header which also causes trouble). For instance, at the end of the script, you can put the following:

//Determine a temporary file name in the current directory $file=basename(tempnam(getcwd(),'tmp')); //Save PDF to file $pdf->Output($file); //JavaScript redirection echo "<HTML><SCRIPT>document.location='getpdf.php?f=$file';</SCRIPT></HTML>";


Then create the getpdf.php file with this:

<?php $f=$HTTP_GET_VARS['f']; //Check file (don't skip it!) if(substr($f,0,3)!='tmp' or strpos($f,'/') or strpos($f,'\\')) die('Incorrect file name'); if(!file_exists($f)) die('File does not exist'); //Handle special IE request if needed if($HTTP_SERVER_VARS['HTTP_USER_AGENT']=='contype') { Header('Content-Type: application/pdf'); exit; } //Output PDF Header('Content-Type: application/pdf'); Header('Content-Length: '.filesize($f)); readfile($f); //Remove file unlink($f); exit; ?>


This method works in most cases but IE6 can still experience trouble. The "ultimate" method consists in redirecting directly to the temporary file. The file name must therefore end with .pdf:

//Determine a temporary file name in the current directory $file=basename(tempnam(getcwd(),'tmp')); rename($file,$file.'.pdf'); $file.='.pdf'; //Save PDF to file $pdf->Output($file); //JavaScript redirection echo "<HTML><SCRIPT>document.location='$file';</SCRIPT></HTML>";


This method turns the dynamic PDF into a static one and avoids all troubles. But you have to do some cleaning in order to delete the temporary files. For instance:

function CleanFiles($dir) { //Delete temporary files $t=time(); $h=opendir($dir); while($file=readdir($h)) { if(substr($file,0,3)=='tmp' and substr($file,-4)=='.pdf') { $path=$dir.'/'.$file; if($t-filemtime($path)>3600) @unlink($path); } } closedir($h); }


This function deletes all files of the form tmp*.pdf older than an hour in the specified directory. You may call it where you want, for instance in the script which generates the PDF.

Remark: it is necessary to open the PDF in a new window, as you can't go backwards due to the redirection.

4. Ich sende Parameter mittels der POST Methode, jedoch werden die Werte nicht im PDF Dokument angezeigt


Dieses Verhalten tritt bei verschiedenen Versionen der Internet Explorers auf (insbesondere beim ersten 5.5 Release). Zur Lösung des Problems, folgen Sie bitte den Anweisungen in 3.

5. Wenn ich eine PHP Session gestartet habe, zeigt der Internet Explorer das Dokument nicht an, fordert aber zum Herunterladen auf


Dieses ist ein Problem das bei verschiedenen Versionen des Internet Explorers auftritt. Um dieses zu Umgehen sollte die folgende Anweisung vor session_start() ausgeführt werden

session_cache_limiter('private');


oder eine Weiterleitung wie in 3 erfolgen.

6. Wenn ich eine SSL Verbindung verwende, kann der Internet Explorer das PDF Dokument nicht öffnen


Das Problem kann durch die folgende Anweisung behoben werden:

Header('Pragma: public');

7. Wenn ich ein Script ausführe erhalte ich die Meldung "FPDF error: Don't alter the locale before including class file".


Durch einen Bug in mehreren PHP Versionen, werden bei der Umstellung des Dezimaltrennzeichens in ein Komma vor dem includen eines Scripts darauffolgend alle Nachkommastellen abgeschnitten. Demnach sollte kein setlocale() ausgeführt werden bevor das FPDF Script includiert wurde. Auf Unix Systemen sollte die LC_ALL Umgebungsvariable ebenfalls nicht gesetzt werden, da dieses einem Aufruf von setlocale() entspricht.

8. Wenn ich eine PNG Grafik in einem Dokument verwende, meldet Acrobat den Fehler "There was an error processing a page. A drawing error occurred".


Der Adobe Acrobat Reader 5 hat einen Bug und ist nicht in der Lage transparente, monochrome Grafiken anzuzeigen (bsp. schwarz/weiß mit 1 Bit pro Pixel). Um dieses zu umgehen sollte die Grafik ohne Transparenz mit 16 Farben oder mehr gespeichert werden.

9. Wenn ich ein PDF Dokument erzeuge, erhalte ich die Warnmeldung "Warning: Cannot add header information - headers already sent by (output started at script.php:X)

"
Diese Warnmeldung wird ausgegeben, wenn mittels der header() Funktionen HTTP Headerinformationen an den Client gesendet werden sollen, jedoch bereits Daten an den Client und somit auch die Header gesendet wurden. Es ist darauf zu achten, das vor der Ausgabe des PDF Dokument keine Ausgabe erfolgt.

10. Ich versuche eine Variable in der Header() Methode zu verwenden aber der Wert wird nicht ausgegeben

Die Variable die ausgegeben werden soll muss sich innerhalb des Gültigkeitsbereich befinden (in diesem Fall innerhalb der Methode). Ist dieses nicht so, kann eine globale Variable mittels einer globale Deklaration in den Gültigkeitsbereich der Methode übernommen werden und steht dann auch dort zur Verfügung. Beispiel:

function Header() { global $title; $this->SetFont('Arial','B',15); $this->Cell(0,10,$title,1,1,'C'); }

11. Ich eine Header() und Footer() Methode in meiner erweiterten PDF Klasse definiert aber diese werden nicht ausgeführt


Um eine erweiterte FPDF Klasse zu verwenden muss ein Objekt der erweiterten Klasse, nicht der FPDF Klasse erzeugt werden:

class myPDF extends FPDF { // ...... } $pdf=new myPDF();

12. Zeilenumbrüche werden nicht vorgenommen, obwohl der String ein '\\n' Zeichen enthält ich MultiCell() verwende

Die Zeichenfolge muss in doppelten Anführungszeichen " übergeben werden, nicht in einfachen Anführungszeichen '.

13. Ich versuche das Euro-Symbol auszugeben, aber es funktioniert nicht

In den Standardschriftarten hat das Euro-Symbol den Ordinalwert 128. Zur Vereinfachung sollte das Euro-Symbol definiert werden. Beispiel:

define('EURO',chr(128)); $pdf->Cell(10, 10, "Summe: 527 ".EURO);


Hinweis: Das Euro-Symbol kann nur vom Acrobat Reader 4 und höher dargestellt werden.

14. Ich habe einen Rahmen mit präzisen Dimensionen gezeichnet, die aber beim Drucken nicht eingehalten werden

Um die exakten Dimensionen für die Darstellung zu verwenden muss die Option "An Seitengröße anpassen" im Drucken-Dialog deaktiviert werden.

15. Ich möchte den gesamten Seitenbereich verwenden, aber beim Drucken habe ich immer noch Seitenränder

Jeder normale Drucker hat technisch bedingt physikalische Seitenränder die je nach Modell unterschiedlich ausfallen können. Demnach ist es nicht möglich ein gesamtes Blatt zu bedrucken.

16. Wie groß darf eine mit FPDF erzeugte PDF Datei maximal sein?


Es gibt kein festgelegtes Limit für die Grö0e einer zu erzeugenden Datei, jedoch sollten folgende Dinge beachtet werden:

  • Die Größe hängt unter anderem vom konfigurierten maximalen Speicherplatz für die Ausführung von PHP Scripts ab, der standardmäßig auf 8MB festgelegt ist. Bei sehr großen Dokumenten, besonders bei Verwendung von Grafiken, kann dieser Speicherplatz recht schnell aufgebraucht werden, da das Dokument im Speicher erzeugt wird. Der maximale zulässige Speicherplatz kann in der php.ini eingestellt werden.
  • Standardmäßig ist die maximale Ausführungszeit pro Script auf 30 Sekunde begrenzt. Dieses Limit kann je nach Dokumentgröße erreicht werden. Die maximale Ausführungszeit wird in der php.ini definiert und kann ggf. dynamisch durch die Funktion set_time_limit() geändert werden.
  • Browser haben meist einen 5 Minuten Time-Out. Wenn das Dokument direkt an den Browser gesendet werden soll und das Zeitlimit überschritten wird, ist das Dokument verloren. Es wird empfohlen sehr große Dokumente als Datei zu erzeugen und die Verbindung zum Browser durch Senden von Daten (bsp. "Seiten 1 erzeugt", "Seite 2 erzeugt") unter Verwendung von flush() aufrecht zu halten. Wenn die PDF Datei erzeugt wurde, kann eine Weiterleitung zur PDF Datei erfolgen oder ein Link ausgegeben werden. Hinweis: Selbst wenn der Browser einen Time-Out meldet, läuft das Script unter Umständen noch weiterhin auf dem Server.

17. Kann ich PDF Dokumente mit FPDF bearbeiten?

Nein.

18. Ich möchte eine Suchmaschine in PHP programmieren und PDF Dokumente indizieren? Kann ich hierfür FPDF verwenden?

Nein, aber es existiert jedoch ein Tool namens pdftotext (unter der GNU Public License / GPL bereitgestellt) das in der Lage ist, den Textinhalt eines PDF Dokuments zu extrahieren und ist in Xpdf enthalten:

http://www.foolabs.com/xpdf/index.html

19. Kann ich mit FPDF HTML Dateien und PDF konvertieren?


Nein aber es existieren diverse Tools die in der Lage sind HTML Dateien in PDF Dokumente zu konvertieren. Bsp.:

html2ps and html2pdf
HTML 2 FPDF

20. Kann ich mehrere PDF Dateien mit FPDF in eine Datei zusammenführen?


Nein aber es existiert jedoch ein kostenloses Tool namens mbtpdfAsm das in der Lage ist PDF Dateien zusammenzuführen.

http://thierry.schmit.free.fr/spip/spip.php?article15&lang=en