web-dev-qa-db-ger.com

FPDF-UTF-8-Kodierung (HOW-TO)

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

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

Alle Vorschläge würden helfen ... George

67
yorgos

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 mit utf8_decode(): $str = utf8_decode($str);.__ durchzuführen. Einige Zeichen, z. Wenn die iconv-Erweiterung verfügbar ist, führen Sie die folgenden Schritte aus: $str = iconv('UTF-8', 'windows-1252', $str);

97
Michal

Es gibt auch eine offizielle UTF-8-Version von FPDF mit dem Namen tFPDF http://www.fpdf.org/de/script/script92.php

Sie können problemlos von der ursprünglichen FPDF wechseln. Stellen Sie nur 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 überall zu verwenden, anstatt utf8_decode () zu spammen, und die Möglichkeit, .ttf-Dateien direkt in AddFont () zu verwenden, ist auch ein Vorteil.

Jede andere Antwort hier ist nur eine Möglichkeit, das Problem zu umgehen oder umzugehen, und die Vermeidung von UTF-8 ist keine wirkliche 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 (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. Daher ist es sehr einfach, den Code zu migrieren.

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

28
Tarsis

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

In der Datei fpdf.php gehen Sie zu der Zeile, die sagt:

if($txt!=='')
{

In meiner Version von fpdf ..__ ist es Zeile 648. 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 entsprechende 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 Strich zwischen utf einzufügen und 8.

Hoffe das oben war hilfreich.

Daan

14
Daan

Sie müssen zuerst eine Schrift generieren. Sie müssen das im FPDF-Paket enthaltene Dienstprogramm MakeFont verwenden. Ich habe dieses etwas erweiterte Skript aus der Demo unter Linux 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 die generierten Dateien in das font-Verzeichnis 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 funktionierte für meine Sprache (Buňka jedna ist tschechisch für Cell one). 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 benötigen eine griechische Schrift, erstellen die Schrift mit der richtigen Kodierung (ISO-8859-7) und verwenden iconv mit derselben Zielkodierung, mit der die Schrift erstellt wurde.

9
K. T. Schnikow

Diese Antwort funktionierte nicht für mich, ich musste HTML-Decodierung auch auf der Zeichenfolge ausführen. Sehen

iconv('UTF-8', 'windows-1252', html_entity_decode($str));

Requisiten gehen von html_entity_decode in FPDF auf emfi (mit tFPDF-Erweiterung)

4
Joel Small

Sie können eine Klasse zum Erweitern von FPDF erstellen und Folgendes 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);

} 

}

4

Es gibt eine Erweiterung von FPDF mit der Bezeichnung mPDF, die Unicode-Schriftarten ermöglicht.

http://www.mpdf1.com/mpdf/index.php

4
Jon Winstanley

Ich wollte dies für alle beantworten, die aus irgendeinem Grund nicht zu TFPDF gewechselt haben (Integration des Rahmens usw.).

Gehe zu: http://www.fpdf.org/makefont/index.php

Verwenden Sie eine .ttf-kompatible Schriftart für die Sprache, die Sie verwenden möchten. Stellen Sie sicher, dass Sie die für Ihre Sprache korrekte Kodierungsnummer 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 normalerweise $pdf->SetFont verwenden.

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

Ersetzen Sie die Sprachkodierung durch die Windows-Kodierungsnummer.

Für rechts nach links führt eine schnelle Korrektur so etwas wie strrev(iconv('UTF-8', 'windows-1255', $first_name)) aus.

3
rozick

Keine der oben genannten Lösungen funktioniert.

Versuche dies:

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

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

(Momentaufnahmen des verwendeten Codes unten)

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. Wie von Tarsis angegeben, tauschen Sie FPDF gegen TFPDF aus.
  2. Sie benötigen tatsächlich eine Schriftart, die die von Ihnen verwendeten UTF-8-Zeichen unterstützt.

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

    Google hat eine Schriftart ( Noto font ), die alle Sprachen enthält, und es ist 20 MB, was in der Regel mehrere Faktoren für die Größe Ihres Textes ist. Sie sehen also, warum viele Schriftarten 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 erbenden Klasse davon, wie class HTMLtoPDF extends tFPDF {...}, werden Sie dies tun ...

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

Sollte nichts mehr dran sein!

Codepaket auf GitHub:

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

Arbeiten, Online-Demo von Japanisch:

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

2
HoldOffHunger

Für Nachwuchs.

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

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

2) Legen Sie diese 2 Dateien in das Verzeichnis fpdf/font

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);
1
ryzhak

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 = '')
{ 

nachdem Sie die Linie gefunden haben

schreibe nach dem {,

$txt = utf8_decode($txt);

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

1
R.Costa

Anstelle dieser iconv-Lösung:

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

Sie könnten Folgendes verwenden:

$str = mb_convert_encoding($str, "UTF-8", "Windows-1252");

Siehe: Wie konvertiert man Windows-1252-Zeichen in Werte in PHP?

1
Theo

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 in meinem PDF keine kroatischen Zeichen anzeigen konnte. Erstens habe ich FPDF verwendet, aber ich denke, es unterstützt kein Unicode. Was schließlich mein Problem 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();
0
NutCracker

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

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

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

0
niente1

Sie können diese Funktion auf Ihren Text anwenden:

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

Vielen Dank

0
gounane

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

  1. Zeichenfolge may enthält UTF-8-Zeichen.

Für diese habe ich es zuerst mit htmlentities() in html-Entitäten codiert und dann in iso-8859-1 decodiert. 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 einfach htmlentities() angerufen. Beispiel:

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

Dann habe ich $s an FPDF übergeben, 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/de/function.html-entity-decode.php

Hoffentlich hilft das.

0

Es gibt eine Erweiterung des FPDF mit dem Namen UFDPF http://acko.net/blog/ufpdf-unicode-utf-8-extension-for-fpdf/

Aber imho ist es besser, mpdf zu verwenden, wenn Sie die Klasse wechseln können.

0
sr9yar