FPDF utf-8-Codierung (HOW-TO)

80

Weiß jemand, wie man die Codierung im FPDF-Paket auf utf-8 setzt? Oder zumindest nach ISO-8859-7 (Griechisch), die griechische Zeichen unterstützen?

Grundsätzlich möchte ich eine PDF-Datei mit griechischen Zeichen erstellen.

Irgendwelche Vorschläge würden helfen. George

Yorgos
quelle
Wenn Sie mehr Sprachen verwenden möchten, benötigen Sie UTF8, sodass Sie tFPDF verwenden können. Schauen Sie sich das Composer-Paket an .
Robsch

Antworten:

117

Verwenden Sie keine UTF-8-Codierung. Standard-FPDF-Schriftarten verwenden ISO-8859-1 oder Windows-1252. Es ist möglich, eine Konvertierung nach ISO-8859-1 durchzuführen mit utf8_decode(): $str = utf8_decode($str); Einige Zeichen wie Euro werden jedoch nicht korrekt übersetzt. Wenn die iconv-Erweiterung verfügbar ist, gehen Sie wie folgt vor: $str = iconv('UTF-8', 'windows-1252', $str);

Michal
quelle
21
Ich denke nicht, dass dies helfen wird. In Ihrer Antwort wird zwar erklärt, wie ein PDF mit ISO-8859-1- oder Windows-1252-Codierung generiert wird. Diese Codierungen funktionieren jedoch nicht für nicht-lateinische Sprachen. Ganz zu schweigen von der Ausgabe mehrsprachiger Texte.
17омица Кораћ
3
@ Rafiq: Verwenden Sie nicht die "alte" FPDF, sondern die neuere UTF8-Version tFPDF als Postett in meiner Antwort.
Tarsis
1
Hinweis: Bei Verwendung von ISO-8859-1 funktioniert das € -Zeichen nicht (der Zeichensatz enthält kein Euro-Zeichen, verwenden Sie stattdessen ISO-8859-15).
BurninLeo
1
@BurninLeo: ISO-8859-15 ist nicht viel besser, alle diese Codierungen haben die gleiche Zeichenbeschränkung, also hat -15 €, fehlt aber ´ oder ½. Die einzige wirkliche Lösung besteht darin, UTF-8 zu verwenden, anstatt es zu vermeiden - wie in meiner Antwort gezeigt.
Tarsis
3
tFPDF unterstützt zwar Unicode, wurde jedoch seit 3 ​​Jahren nicht mehr aktualisiert, da FPDF in jüngerer Zeit aktualisiert wurde und tFPDF veraltet ist. Bitte beachten Sie dies bei der Verwendung von tFPDF.
Agilis
38

Es gibt auch eine offizielle UTF-8-Version von FPDF namens tFPDF http://www.fpdf.org/en/script/script92.php

Sie können einfach vom ursprünglichen FPDF wechseln. Stellen Sie jedoch sicher, dass Sie auch eine Unicode-Schriftart verwenden, wie im Beispiel im obigen Link oder in meinem Code gezeigt:

<?php

//this is a UTF-8 file, we won't need any encode/decode/iconv workarounds

//define the path to the .ttf files you want to use
define('FPDF_FONTPATH',"../fonts/");
require('tfpdf.php');

$pdf = new tFPDF();
$pdf->AddPage();

// Add Unicode fonts (.ttf files)
$fontName = 'Helvetica';
$pdf->AddFont($fontName,'','HelveticaNeue LightCond.ttf',true);
$pdf->AddFont($fontName,'B','HelveticaNeue MediumCond.ttf',true);

//now use the Unicode font in bold
$pdf->SetFont($fontName,'B',12);

//anything else is identical to the old FPDF, just use Write(),Cell(),MultiCell()... 
//without any encoding trouble
$pdf->Cell(100,20, "Some UTF-8 String");

//...
?>

Ich denke, es ist viel eleganter, dies zu verwenden, anstatt überall utf8_decode () zu spammen, und die Möglichkeit, .ttf-Dateien direkt in AddFont () zu verwenden, ist ebenfalls ein Vorteil.

Jede andere Antwort hier ist nur eine Möglichkeit, das Problem zu vermeiden oder zu umgehen, und das Vermeiden von UTF-8 ist keine echte Option für ein aktuelles Projekt.

Es gibt auch Alternativen wie mPDF oder TCPDF (und andere), die auf FPDF basieren, aber erweiterte Funktionen bieten, UTF-8-Unterstützung bieten und HTML-Code interpretieren können (natürlich eingeschränkt, da es keine direkte Möglichkeit gibt, HTML in PDF zu konvertieren). Der größte Teil des FPDF-Codes kann direkt in diesen Bibliotheken verwendet werden, sodass die Migration des Codes recht einfach ist.

https://github.com/mpdf/mpdf http://www.tcpdf.org/

Tarsis
quelle
1
Keine der Iconv- und Decodierungslösungen funktioniert für die außergewöhnlicheren Zeichen (♠ ♥ ☺äκόσμος). Wenn Sie jedoch nur Ihre Datei fpdf.php durch die Datei tpdf.php ersetzen, funktioniert alles nur und Ihre Dateien werden als zusätzlicher Bonus kleiner. Großartige Lösung.
Sebastian
1
Sind FPDF und tFPDF getrennte Zweige? Kennt jemand den Grund, warum tFPDF auf der FPDF-Seite so gut versteckt ist? Gibt es irgendwelche Nachteile, die man vor dem Wechsel kennen sollte?
BurninLeo
1
Ich bin mir nicht sicher, warum sie es nicht zur Standard-FPDF-Version gemacht haben, aber es ist direkt auf der Hauptseite fpdf.org verlinkt und wie dort erwähnt, wurden die Funktionen von tFPDF ursprünglich für mPDF entwickelt. Ich habe tFPDF für viele PDFs in einer produktiven Umgebung verwendet und ich denke, dass es neben UTF-8 und Schriftartenänderungen zu 100% gleich ist. Hatte nie irgendwelche Probleme.
Tarsis
1
tFPDF ist ein Skript oder eine Erweiterung von FPDF. Es gilt als veraltet (vor 3 Jahren aktualisiert), da FPDF kürzlich aktualisiert wurde. Der Autor von tFPDF behält es nicht bei und der mit tFPDF verknüpfte GitHub wurde nicht berührt. Siehe: github.com/rev42/tfpdf
Agilis
Solange Sie nicht mehr Funktionen benötigen, sehe ich kein Problem darin, übrigens war das letzte (kleinere) Update erst vor 4 Monaten - immer noch besser als UTF-8 nicht zu unterstützen. In beiden Fällen würde ich TCPDF oder mPDF bevorzugen, die beide auf FPDF basieren, aber erweiterte Funktionen bieten und auch HTML-Code unterstützen.
Tarsis
28

Für dieses Problem gibt es eine wirklich einfache Lösung.

Gehen Sie in der Datei fpdf.php zu der Zeile mit der Aufschrift:

if($txt!=='')
{

Es ist Zeile 648 in meiner Version von fpdf. Fügen Sie die folgende Codezeile ein:

$txt = iconv('utf-8', 'cp1252', $txt);

(über der Codezeile)

if($align=='R')

Dies funktioniert für alle deutschen Sonderzeichen und sollte auch für griechische Sonderzeichen funktionieren. Andernfalls ersetzen Sie einfach cp1252 durch das gewünschte Alphabet. Sie können alle unterstützten Zeichen hier sehen: http://en.wikipedia.org/wiki/Windows-1252

Ich habe die Lösung hier gesehen: http://fudforum.org/forum/index.php?t=msg&goto=167345 Bitte verwenden Sie meinen obigen Beispielcode, da der ursprüngliche Autor vergessen hat, einen Bindestrich zwischen utf und 8 einzufügen.

Hoffe das obige war hilfreich.

Daan

Daan
quelle
Perfekt, dies funktioniert immer noch oder wird benötigt, nachdem FPDF auf eine Version aktualisiert wurde, die PHP7 unterstützt, um Sonderzeichen korrekt anzuzeigen.
Aren
1
Dieser Befehl funktioniert für mich, $ txt = iconv ('utf-8', 'cp1252', $ txt); Thks
Patrick Arguello
Einfach erstaunliche Simpel-Lösung. Schade, dass es an einem dunklen Ort im Stackoverflow versteckt ist :)
Pieter-Jan Casteels
Dies hat etwas an meinem Abstand geändert - einige Linien brechen jetzt früher. Aber zumindest scheint es zu funktionieren - bevor der türkische Brief für mich überhaupt nicht funktioniert hat, sehe ich jetzt zumindest etwas.
Cold_Class
9

Sie müssen zuerst eine Schriftart generieren. Sie müssen das MakeFontim FPDF-Paket enthaltene Dienstprogramm verwenden. Ich habe unter Linux dieses etwas erweiterte Skript aus der Demo verwendet:

<?php
// Generation of font definition file for tutorial 7
require('../makefont/makefont.php');

$dir = opendir('/usr/share/fonts/truetype/ttf-dejavu/');
while (($relativeName = readdir($dir)) !== false) {
    if ($relativeName == '..' || $relativeName == '.')
        continue;
    MakeFont("/usr/share/fonts/truetype/ttf-dejavu/$relativeName",'ISO-8859-2');
}
?>

Dann habe ich generierte Dateien in das fontVerzeichnis meines Webs kopiert und Folgendes verwendet:

$pdf->Cell(80,70, iconv('UTF-8', 'ISO-8859-2', 'Buňka jedna'),1);

(Ich habe an einem Tisch gearbeitet.) Das hat für meine Sprache funktioniert ( Buňka jedna ist tschechisch für Zelle eins ). Die tschechische Sprache gehört zu den mitteleuropäischen Sprachen, auch ISO-8859-2. Leider ist der Benutzer von FPDF gezwungen, die Vorteile der UTF-8-Codierung zu verlieren. Sie können dies nicht in Ihrem PDF erhalten:

Městečko Fruens Bøge

Der dänische Buchstabe øwird řin ISO-8859-2.

Lösungsvorschlag: Sie müssen eine griechische Schriftart erhalten, die Schriftart mit der richtigen Codierung (ISO-8859-7) generieren und iconvmit derselben Zielcodierung verwenden, mit der die Schriftart generiert wurde.

Theodor Keinstein
quelle
4

Keine der oben genannten Lösungen wird funktionieren.

Versuche dies:

function filter_html($value){
    $value = mb_convert_encoding($value, 'ISO-8859-1', 'UTF-8');
    return $value;
}
Ankit Shukla
quelle
4

Sie können eine Klasse erstellen, um FPDF zu erweitern, und dies hinzufügen:

class utfFPDF extends FPDF {

function Cell($w, $h=0, $txt="", $border=0, $ln=0, $align='', $fill=false, $link='')
{
    if (!empty($txt)){
        if (mb_detect_encoding($txt, 'UTF-8', false)){
            $txt = iconv('UTF-8', 'ISO-8859-5', $txt);

        }
    }
    parent::Cell($w, $h, $txt, $border, $ln, $align, $fill, $link);

} 

}}

Alejandro Aranda
quelle
4

Ich wollte dies für alle beantworten, die aus irgendeinem Grund nicht auf TFPDF umgestellt haben (Framework-Integration usw.).

Gehen Sie zu: http://www.fpdf.org/makefont/index.php

Verwenden ein .ttf kompatible Schriftart für die Sprache, die Sie verwenden möchten. Stellen Sie sicher, dass Sie die für Ihre Sprache korrekte Codierungsnummer auswählen. Laden Sie die Dateien herunter und fügen Sie sie in Ihr aktuelles FPDF-Schriftverzeichnis ein.

Verwenden Sie diese Option, um die neue Schriftart zu aktivieren: $pdf->AddFont($font_name,'','Your_Font_Here.php');

Dann können Sie $pdf->SetFontnormal verwenden.

Verwenden Sie in der Schriftart selbst iconv, um in UTF-8 zu konvertieren. Wenn Sie beispielsweise Hebräisch verwenden, würden Sie dies tun iconv('UTF-8', 'windows-1255', $first_name).

Ersetzen Sie die Windows-Codierungsnummer durch Ihre Sprachcodierung.

Für rechts nach links macht eine schnelle Lösung so etwas wie strrev(iconv('UTF-8', 'windows-1255', $first_name)).

rozick
quelle
4

Bearbeiten Sie einfach die Funktionszelle in der Datei fpdf.php und suchen Sie nach der Zeile, die so aussieht

function cell ($w, $h = 0, $txt = '', $border = 0, $ln = 0, $align = '', $fill = false, $link = '')
{ 

nach dem Finden der Linie

schreibe nach dem {,

$txt = utf8_decode($txt);

Speichern Sie die Datei und fertig, die Akzente und die utf8-Codierung funktionieren :)

R. Costa
quelle
3

Wie erstelle ich PDFs in FPDF, die Chinesisch, Japanisch, Russisch usw. unterstützen?

(Schnappschüsse des unten verwendeten Codes)

Ich möchte Folgendes bereitstellen: eine Zusammenfassung des Problems, die Lösung, ein Github-Projekt mit dem Arbeitscode und ein Online-Beispiel mit dem erwarteten, resultierenden PDF.

Das Problem :

  1. Tauschen Sie, wie von Tarsis angegeben, FPDF gegen TFPDF aus.
  2. Sie benötigen tatsächlich eine Schriftart, die die von Ihnen verwendeten UTF-8-Zeichen unterstützt.

    IE, nur Helvetica zu verwenden und zu versuchen, Japanisch anzuzeigen, wird nicht funktionieren. Wenn Sie Font Forge oder ein anderes Schriftwerkzeug verwenden, können Sie zu den chinesischen Schriftzeichen der Schrift scrollen und feststellen, dass diese leer sind.

    Google hat eine Schriftart ( Noto-Schriftart ), die alle Sprachen enthält, und sie ist 20 MB groß. Dies sind normalerweise mehrere Faktoren für die Größe Ihres Textes. Sie können also sehen, warum viele Schriftarten einfach nicht jede einzelne Sprache abdecken.

Die Lösung :

Ich verwende die Schriftpakete round-mgenplus-20140828.ttf und ZCOOL_QingKe_HuangYou.ttf für Japanisch und Chinesisch, die Open Source sind und in vielen Open Source-Projekten enthalten sind. In tFPDF selbst oder einer neuen vererbenden Klasse davon class HTMLtoPDF extends tFPDF {...}tun Sie dies wie folgt ...

$this->AddFont('japanese', '', 'rounded-mgenplus-20140828.ttf', true);
$this->SetFont('japanese', '', 14);
$this->Write(14, '日本語');

Sollte nichts mehr dran sein!

Code-Paket auf GitHub:

https://github.com/HoldOffHunger/php-html-to-pdf

Arbeiten, Online-Demo von Japanisch:

https://www.earthfluent.com/privacy.pdf?language=ja

HoldOffHunger
quelle
1

Für Nachkommen.

Wie ich es geschafft habe, fpdf auf meinem Linux-Computer mit russischer Sprache zu versehen:

1) Gehen Sie zu http://www.fpdf.org/makefont/ und konvertieren Sie Ihre ttf-Schriftart (z. B. AerialRegular.ttf) mit der ISO-8859-5-Codierung in 2 Dateien : AerialRegular.php und AerialRegular.z

2) Setzen Sie diese 2 - Dateien in fpdf / font - Verzeichnis

3) Verwenden Sie es in Ihrem Code:

$pdf = new \FPDI();
    $pdf->AddFont('ArialMT','','ArialRegular.php');
    $pdf->AddPage();
    $tplIdx = $pdf->importPage(1);
    $pdf->useTemplate($tplIdx, 0, 0, 211, 297); //width and height in mms
    $pdf->SetFont('ArialMT','',35);
    $pdf->SetTextColor(255,0,0);
    $fullName = iconv('UTF-8', 'ISO-8859-5', 'Алексей');
    $pdf->SetXY(60, 54);
    $pdf->Write(0, $fullName);
Ryzhak
quelle
0

Sie können diese Funktion auf Ihren Text anwenden:

 $yourtext = iconv('UTF-8', 'windows-1252', $yourtext);

Vielen Dank

gounane
quelle
0

Ich verwende FPDF für ASP und die iconv-Funktion ist nicht verfügbar. Es scheint seltsam, dass ich das UTF-8-Problem gelöst habe, indem ich dem PDF direkt nach der Funktion AddPage () ein gefälschtes Bild (ein 1x1px-JPEG) hinzugefügt habe:

pdf.Image "images/fpdf.jpg",0,0,1

Auf diese Weise werden akzentuierte Zeichen korrekt zu meinem PDF hinzugefügt. Fragen Sie mich nicht warum, aber es funktioniert.

niente1
quelle
0

Ich bin mir nicht sicher, ob es für Griechisch funktioniert, aber ich hatte das gleiche Problem für brasilianisch-portugiesische Schriftzeichen und meine Lösung bestand darin, HTML-Entitäten zu verwenden. Ich hatte im Grunde zwei Fälle:

  1. Die Zeichenfolge kann UTF-8-Zeichen enthalten.

Für diese habe ich es zuerst in HTML-Entitäten mit codiert htmlentities()und dann in dekodiert iso-8859-1. Beispiel:

$s = html_entity_decode(htmlentities($my_variable_text), ENT_COMPAT | ENT_HTML401, 'iso-8859-1');
  1. Feste Zeichenfolge mit HTML-Entitäten:

Für diese habe ich gerade den htmlentities()Ruf verlassen. Beispiel:

$s = html_entity_decode("Treasurer/Tr&eacute;sorier", ENT_COMPAT | ENT_HTML401, 'iso-8859-1');

Dann ging ich $szu FPDF, wie in diesem Beispiel:

$pdf->Cell(100, 20, $s, 0, 0, 'L');

Hinweis: ENT_COMPAT | ENT_HTML401 ist der Standardwert für Parameter 2, wie in http://php.net/manual/en/function.html-entity-decode.php

Hoffentlich hilft das.

Alexandre Schmidt
quelle
0

Ich weiß, dass diese Frage alt ist, aber ich denke, meine Antwort würde denen helfen, die in anderen Antworten keine Lösung gefunden haben. Mein Problem war also, dass ich keine kroatischen Zeichen in meinem PDF anzeigen konnte. Erstens habe ich FPDF verwendet, aber ich denke, es unterstützt Unicode nicht. Was mein Problem schließlich gelöst hat, ist tFPDF, die Version von FPDF, die Unicode unterstützt. Dies ist das Beispiel, das für mich funktioniert hat:

require('tFPDF/tfpdf.php');
$pdf = new tFPDF();
$pdf->AddPage();
$pdf->AddFont('DejaVu','','DejaVuSansCondensed.ttf',true);
$pdf->AddFont('DejaVu', 'B', 'DejaVuSansCondensed-Bold.ttf', true);

$pdf->SetFont('DejaVu','',14);

$txt = 'čćžšđČĆŽŠĐ';
$pdf->Write(8,$txt);

$pdf->Output();
Nussknacker
quelle