FPDF encodage utf-8 (COMMENT)
est-ce que quelqu'un sait comment configurer l'encodage dans le paquet FPDF à utf-8? Ou au moins à la norme ISO-8859-7 (en grec) qui supporte les caractères grecs?
Fondamentalement, je veux créer un fichier pdf contenant des caractères grecs.
toute suggestion serait utile. George
16 réponses
N'utilisez pas L'encodage UTF-8. Les polices FPDF standard utilisent ISO-8859-1 ou Windows-1252. Il est possible d'effectuer une conversion EN ISO-8859-1 avec utf8_decode()
:
$str = utf8_decode($str);
Mais certains caractères comme Euro ne seront pas traduits correctement. Si l'extension iconv est disponible, la bonne façon de le faire est la suivante::
$str = iconv('UTF-8', 'windows-1252', $str);
il y a aussi une Version officielle UTF-8 de FPDF appelée tFPDF http://www.fpdf.org/en/script/script92.php
vous pouvez facilement passer du FPDF original, assurez-vous juste que vous utilisez aussi une police unicode comme indiqué dans l'exemple dans le lien ci-dessus ou mon code:
<?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");
//...
?>
je pense qu'il est beaucoup plus élégant d'utiliser ceci au lieu d'utiliser utf8_decode() partout et la capacité d'utiliser .fichiers ttf directement dans AddFont() est à la hausse.
N'importe quelle autre réponse ici est juste un moyen d'éviter ou de travailler autour du problème, et éviter UTF-8 n'est pas une option réelle pour un projet à jour.
il y a aussi des alternatives comme mPDF ou TCPDF (et autres) qui se basent sur FPDF mais offrent des fonctions avancées, ont le Support UTF-8 et peuvent interpréter le Code HTML (limité bien sûr car il n'y a pas de moyen direct de convertir HTML en PDF). La plupart du code FPDF peut être utilisé directement dans ces bibliothèques, donc son assez facile de migrer le code.
il y a une solution très simple pour ce problème.
dans le fichier fpdf.php aller à la ligne qui dit:
if($txt!=='')
{
c'est la ligne 648 dans ma version de fpdf. Insérer la ligne de code suivante:
$txt = iconv('utf-8', 'cp1252', $txt);
(au-dessus de la ligne de code)
if($align=='R')
cela fonctionne pour tous les caractères spéciaux allemands et devrait également fonctionner pour les caractères spéciaux Grecs. Sinon, il suffit de remplacer cp1252 par respectifs de l'alphabet dont vous avez besoin. Vous pouvez voir tous les caractères supportés ici: http://en.wikipedia.org/wiki/Windows-1252
j'ai vu la solution ici: http://fudforum.org/forum/index.php?t=msg&goto=167345 Veuillez utiliser mon exemple de code ci-dessus, car l'auteur original a oublié d'insérer un tiret entre utf et 8.
Espère que le ci-dessus a été utile.
Daan
vous devez d'abord générer une police. Vous devez utiliser l'utilitaire MakeFont
inclus dans le paquet FPDF. J'ai utilisé sur Linux ce script un peu étendu de la démo:
<?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');
}
?>
puis j'ai copié des fichiers générés dans le répertoire font
de mon web et j'ai utilisé ceci:
$pdf->Cell(80,70, iconv('UTF-8', 'ISO-8859-2', 'Buňka jedna'),1);
(je travaillais sur une table.) Qui a fonctionné pour ma langue ( Buňka jedna est Tchèque pour Cell one ). La langue tchèque appartient aux langues d'Europe centrale, également ISO-8859-2. Malheureusement, L'utilisateur de FPDF est forcé de perdre les avantages de L'encodage UTF-8. Vous ne pouvez pas obtenir cela dans votre PDF:
Městečko Fruens Bøge
la lettre danoise ø
devient ř
dans la norme ISO-8859-2.
Suggestion de solution: vous devez obtenir une police grecque, générer la police en utilisant le codage approprié (ISO-8859-7) et utiliser iconv
avec la même cible encodage comme celui avec lequel la police a été générée.
il y a une extension de FPDF appelée mPDF qui permet les polices Unicode.
cette réponse n'a pas fonctionné pour moi, j'ai dû lancer le décodage html sur la chaîne de caractères aussi. Voir
iconv('UTF-8', 'windows-1252', html_entity_decode($str));
Props aller à emfi de html_entity_decode dans FPDF(à l'aide de tFPDF extension)
vous pouvez faire une classe pour étendre FPDF et ajouter ceci:
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);
}
}
Aucune des solutions ci-dessus va travailler.
essayez ceci:
function filter_html($value){
$value = mb_convert_encoding($value, 'ISO-8859-1', 'UTF-8');
return $value;
}
je voulais répondre à cela pour tous ceux qui n'ont pas basculé sur TFPDF pour quelque raison que ce soit (intégration de cadre, etc.)
passer à: http://www.fpdf.org/makefont/index.php
utilisez une police compatible .ttf
pour la langue que vous souhaitez utiliser. Assurez-vous de choisir l'encodage nombre qui est correct pour votre langue. Télécharger les fichiers et les coller dans votre police FPDF actuelle répertoire.
utilisez ceci pour activer la nouvelle police: $pdf->AddFont($font_name,'','Your_Font_Here.php');
, Alors vous pouvez utiliser $pdf->SetFont
normalement.
sur la police elle-même, utilisez iconv pour convertir en UTF-8. Donc, si par exemple vous utilisez l'Hébreu, vous feriez iconv('UTF-8', 'windows-1255', $first_name)
.
remplacez le numéro d'encodage windows pour votre encodage de langue.
de droite à gauche, une correction rapide fait quelque chose comme strrev(iconv('UTF-8', 'windows-1255', $first_name))
.
pour offsprings.
comment j'ai réussi à ajouter le Russe à fpdf sur ma machine Linux:
1) passer à http://www.fpdf.org/makefont / et convertissez votre police ttf(par exemple AerialRegular.ttf) en 2 fichiers utilisant L'encodage ISO-8859-5 : AerialRegular.php et AerialRegular.z
2) Mettez ces 2 fichiers dans fpdf/police répertoire
3) Utilisez - le dans votre 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);
il y a une extension à FPDF appelé UFDPF http://acko.net/blog/ufpdf-unicode-utf-8-extension-for-fpdf/
mais, imho, il est préférable d'utiliser mpdf si vous êtes il est possible pour vous de changer de classe.
Vous pouvez appliquer cette fonction sur votre texte :
$yourtext = iconv('UTF-8', 'windows-1252', $yourtext);
Merci
J'utilise FPDF pour ASP, et la fonction iconv n'est pas disponible. Il semble étrange, par j'ai résolu le problème UTF-8 par ajoutant une fausse image (un jpeg 1x1px) au pdf, juste après la fonction AddPage ():
pdf.Image "images/fpdf.jpg",0,0,1
de cette façon, les caractères accentués sont correctement ajoutés à mon pdf, ne me demandez pas pourquoi mais cela fonctionne.
Je ne suis pas sûr qu'il fasse pour le grec, mais j'ai eu le même problème pour les Caractères portugais Brésiliens et ma solution était d'utiliser des entités html. J'avais essentiellement deux cas:
- Chaîne peut contiennent des caractères UTF-8.
pour ceux-ci, je l'ai d'abord encodé en entités html avec htmlentities()
puis les ai décodé en iso-8859-1
. Exemple:
$s = html_entity_decode(htmlentities($my_variable_text), ENT_COMPAT | ENT_HTML401, 'iso-8859-1');
- Chaîne fixe avec des entités html:
pour ceux-ci, je viens de laisser htmlentities()
appeler. Exemple:
$s = html_entity_decode("Treasurer/Trésorier", ENT_COMPAT | ENT_HTML401, 'iso-8859-1');
puis j'ai passé $s
à FPDF, comme dans cet exemple:
$pdf->Cell(100, 20, $s, 0, 0, 'L');
Note: ENT_COMPAT | ENT_HTML401
est la valeur standard du paramètre #2, comme dans http://php.net/manual/en/function.html-entity-decode.php
Espère que ça aide.
je sais que cette question Est ancienne mais je pense que ma réponse aiderait ceux qui n'ont pas trouvé de solution dans d'autres réponses. Donc, mon problème était que je ne pouvais pas afficher les Caractères croates dans mon PDF. Premièrement, J'ai utilisé FPDF mais, je pense, il ne supporte pas Unicode. Enfin, ce qui a résolu mon problème est tFPDF qui est la version de FPDF qui supporte Unicode. C'est l'exemple qui a fonctionné pour moi:
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();
au lieu de cette solution iconv:
$str = iconv('UTF-8', 'windows-1252', $str);
vous pouvez utiliser ce qui suit:
$str = mb_convert_encoding($str, "UTF-8", "Windows-1252");
voir: comment convertir Windows-1252 caractères en valeurs en php?