fpdf
PHP powered
home was ist fpdf? downloads & add-ons dokumentation faq forum impressum links kontakt
 

Häufig gestellte 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.

Sollte es danach immer noch nicht funktionieren, liegt dieses an einigen Bugs des Internet Explorer in Verbindung mit dem Acrobat Plug-In. Der Scriptaufruf sollte mit so vielen Internet Explorer Versionen wie möglich getestet werden. Das Problem tritt meist bei der Verwendung der POST Methode für den Seitenaufruf auf, demnach sollte dieses vermieden werden. Des weiteren werden durch POST Aufrufe weitere Probleme verursacht, wie beispielsweise in der folgenden Frage 4. Die GET Methode ist empfehlenswerter, kann jedoch aufgrund der möglichen resultierenden Länge der URL nicht immer angewandt werden. Um dieses Limit zu umgehen, kann ein ".pdf" an das Ende der URL angeführt werden um den Internet Explorer austzutricksen. Bei der Verwendung eines Formulars, kann dieses mittels eines versteckten Formularfeldes am Ende des Formulars vorgenommen werden:


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

Die Verwendung von Sessions in PHP kann ebenfalls Probleme verursachen, ebenso sollten HTTP Header die ein Caching verhindern, vermieden werden. Dieses Problem wird in Frage 5 behandelt.

Um dieses Problem mit einem vertretbaren Aufwand zu umgehen, können zwei Techniken angewendet werden:

  • Das Acrobat Reader Plug-In deaktivieren und Acrobat als Anwendung nutzen um das Dokument zu öffnen. Hierzu führen Sie bitte folgendes aus:
    • Acrobat Reader starten
    • Öffnen von "Datei -> Einstellungen -> Allgemein" und deaktivieren der Option "Web Browser Integration"
    • bei Acrobat Reader 5 und höher "Bearbeiten -> Grundeinstellungen ... -> Optionen" die Option "PDF in Browser anzeigen" deaktivieren
    Beim nächsten Öffnen eines PDF Dokuments im Internet Explorer wird die Aufforderung zum "Speichern unter ..." oder "Öffnen" angezeigt. Die Option "Vor dem Öffnen dieses Dateityps immer bestätigen" sollte deaktiviert werden. Danach auf "Öffnen" klicken. Von jetzt an wird jedes PDF Dokument immer in einer eigenen Acrobat Reader Instanz in einem separaten Fenster angezeigt. Der Nachteil dieser Methode ist, das die Clients entsprechend konfiguriert werden müssen, was in einem Intranet ein geringeres Problem ist, jedoch bei öffentlicher Verwendung im Internet nicht praktikabel ist.
  • Die Technik zur Verwendung einer Weiterleitung basiert darauf, ein PDF Dokument in einer temporären Datei auf dem Server zu erzeugen und den Browser auf diese erzeugte Datei weiterzuleiten um sie zu öffnen. Die Weiterleitung kann bsp. durch durch Javascript oder einem META Tag erfolgen (der HTTP Header Location verursacht ebenfalls Probleme im Internet Explorer). Beispielsweise kann am Ende des Scripts für die Dokumenterzeugung folgendes angefügt werden:


    //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>";

    Erstellen Sie im Anschluss die Datei getpdf.php mit folgendem Inhalt:


    <?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;
    ?>

    Diese Methode funktioniert in den meisten Fällen, jedoch können auch hier beim Internet Explorer 6 Probleme verursacht werden. Die beste Methode ist die direkte Weiterleitung auf die PDF Datei:


    //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>"; 

    Diese Methode wandelt die temporäre Datei in eine statische PDF Datei um und vermeidet damit jegliche Probleme. Jedoch sollte hierbei darauf geachtet werden, dass die erzeugen PDF Dateien auch wieder gelöscht werden. Beispiel:


    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);
    }

    Diese Funktion löscht alle Datei deren Dateiname der Form tmp*.pdf entspricht und die älter als eine Stunde sind aus dem angegebenen Verzeichnis. Der Aufruf dieser Funktion kann zeitgesteuert, oder bei jedem Aufruf des Skripts zur Dokumenterzeugung erfolgen.

    Hinweis: Es ist sinnvoll, das PDF Dokument in einem neuen Fenster zu öffnen, da ein Zurückspringen durch die Weiterleitung nicht möglich sein wird.


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/


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/dev/mbtPdfAsm/enMbtPdfAsm2.html
 






 
         
         
 
 
fpdf.de © Copyright 2004-2006 carrib internet solutions - Beachten Sie bitte die Nutzungsbedingungen
Eine Verwendung der auf fpdf.de befindlichen Inhalte (Texte, Grafiken) ist nur mit Zustimmung des Betreibers zulässig.