Martin Müller: Zeichenkodierung in PDF Dokument, das durch FPDF erzeugt wurde

Hallo alle beisammen.
Ich stehe derzeit vor einem Rätsel, dass sich mir nicht ganz erklärlich ist. Und zwar teste ich wie man mit FPDF (www.fpdf.de) über PHP PDF Dateien generiert. Es läuft bisher, nur die Zeichenkodierung nimmt mich irgendwie auf die Schippe.

Also habe ich bisschen rumgesurft, gegoogelt und einiges gefunden, was ich schon wusste wie z.B. http://forum.de.selfhtml.org/archiv/2007/2/t147115/

Natürlich kannte ich mb_detect_encoding schon und wenn ich es auf die Methoden der FPDF anwende, z.B.:

...  
$pdf->Write(10, mb_detect_encoding('Viele liebe Grüße aus NRW'));  
...

Dann erhalte ich als Ergebnis: UTF-8. Schreibe ich aber hingegen:

...  
$pdf->Write(10, 'Viele liebe Grüße aus NRW');  
...

bekomme ich als Ergebnis Viele liebe Grüße aus NRW. Das zu der Nachricht. Vernachlässige ich es einfach mal, die PDF Datei im Browser auszugeben, und schreibe nur mittels echo 'Viele liebe Grüße aus NRW'; in die PHP Datei, in der das PDF generiert wird, wird es wiederrum richtig angezeigt. Also in der PHP Datei ist alles UTF-8, aber sobald ein PDF durch diese PHP Datei generiert wird, ist es kein UTF-8 mehr.

Um das PDF Dokument zu erzeugen, schicke ich aber folgende Header:

header('Content-type: application/pdf; charset=utf-8');  
header('Content-disposition: inline; filename="'. $filename .'"');  
header('Cache-control: private, max-age=0, must-revalidate');  
header('Pragma: public');

$filename wird vorher durch time() ersetzt.

Also auch UTF-8. In meiner Verzweiflung habe ich schon UTF-8 groß geschrieben und sogar bei content-type verschiedene groß und kleinschreibungen probiert, weil es mir einfach nicht klar wird, warum das nicht funktioniert. Im Apache habe ich auch AddDefaultCharset UTF-8 stehen.

Nun könnte ich via utf8_decode das ganze richtig stellen, aber dann funktionieren so Sachen wie das Euro Zeichen nicht mehr, das zu einem Fragezeichen wird.

In meiner Blindheit übersehe ich etwas oder ich weiß es wirklich nicht. Weiß jemand Rat um mir die Augen zu öffen?

Vielen Dank!

  1. hi,

    In meiner Blindheit übersehe ich etwas oder ich weiß es wirklich nicht. Weiß jemand Rat um mir die Augen zu öffen?

    Guck mal mit einem Editor/Dateibetrachter in eine PDF-Datei, welche mit Acrobat-Reader die Umlaute richtig anzeigt, welche Byte-Sequenze da zu drinsteht.

    Hotti

  2. Tach!

    Um das PDF Dokument zu erzeugen, schicke ich aber folgende Header:
    header('Content-type: application/pdf; charset=utf-8');

    Das erzeugt kein PDF-Dokument, das sagt lediglich dem Browser, dass ein PDF-Dokument kommt. Außerdem sind PDF-Dokumente ein Ökosystem für sich. Mir ist nicht bekannt, dass man dem PDF-Reader von außen mitteilen kann (oder dies müsste), welche Zeichenkodierung in dem Dokument verwendet wurde. Das wäre auch kontraproduktiv, weil PDF-Dokuemnte auch über andere Wege als HTTP verteilt werden und dabei keine externen Informationen zur Zeichenkodierung zur Verfügung stehen. Das heißt, dass die Zeichenkodierungthematik innerhalb des PDF-Dokuments gelöst werden muss.

    Nun kommt dein PHP ins Spiel. Du musst als erstes herausfinden, die dein PDF-Generator mit dem Thema Zeichenkodierung umgeht, wie man ihm sagen kann, welche Zeichenkodierung man gern sprechen möchte oder ob er auf eine bestimmte unveränderlich festgelegt ist. Der Rest ist einfach: verwende diese Zeichenkodierung für die Daten, die du ihm übergibst.

    dedlfix.

  3. Hallo,

    eine Suche nach fpdf und utf8 findet Lösungen für dein Problem. FPDF kann kein UFT8, du mußt deine Strings umwandeln. Wie das geht steht z.B. hier oder hier