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
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);
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.
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
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.
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)
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);
}
}
Es gibt eine Erweiterung von FPDF mit der Bezeichnung mPDF, die Unicode-Schriftarten ermöglicht.
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.
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;
}
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:
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:
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);
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 :)
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?
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();
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.
Sie können diese Funktion auf Ihren Text anwenden:
$yourtext = iconv('UTF-8', 'windows-1252', $yourtext);
Vielen Dank
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:
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');
Für diese habe ich einfach htmlentities()
angerufen. Beispiel:
$s = html_entity_decode("Treasurer/Tré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.
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.