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

65
demandé sur Aristos 2011-06-13 21:49:17

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

92
répondu Michal 2012-01-30 03:02:52

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.

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

28
répondu Tarsis 2016-04-13 07:40:20

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

12
répondu Daan 2014-02-04 14:43:48

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.

9
répondu K. T. Schnikow 2012-04-11 10:40:27

il y a une extension de FPDF appelée mPDF qui permet les polices Unicode.

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

4
répondu Jon Winstanley 2013-07-26 15:56:59

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)

4
répondu Joel Small 2017-05-23 12:03:08

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

} 

}

4
répondu Alejandro Aranda 2017-02-16 11:05:53

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;
}
3
répondu Ankit Shukla 2016-03-25 13:06:04

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)) .

2
répondu rozick 2017-10-26 15:35:23

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);
1
répondu ryzhak 2016-10-26 16:34:09

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.

0
répondu sr9yar 2014-06-05 22:19:53

Vous pouvez appliquer cette fonction sur votre texte :

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

Merci

0
répondu gounane 2015-08-25 23:28:09

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.

0
répondu niente1 2015-12-11 13:31:06

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:

  1. 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');
  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&eacute;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.

0
répondu Alexandre Schmidt 2016-02-05 20:31:30

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();
0
répondu PeMaCN 2016-05-07 07:59:13

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?

0
répondu Theo 2018-07-25 10:08:35