web-dev-qa-db-fra.com

FPDF utf-8 encoding (HOW-TO)

Quelqu'un sait-il comment définir le codage dans le paquet FPDF sur utf-8? Ou du moins à ISO-8859-7 (grec) qui supporte les caractères grecs?

En gros, je veux créer un fichier pdf contenant des caractères grecs.

Toutes les suggestions aideraient . George

67
yorgos

N'utilisez pas le codage UTF-8. Les polices FPDF standard utilisent ISO-8859-1 ou Windows-1252. Il est possible d'effectuer une conversion au format ISO-8859-1 avec utf8_decode(): $str = utf8_decode($str); Cependant, certains caractères tels que Euro ne seront pas traduits correctement. Si l'extension iconv est disponible, la méthode appropriée consiste à procéder comme suit: $str = iconv('UTF-8', 'windows-1252', $str);

97
Michal

Il existe également une version officielle UTF-8 de FPDF appelée tFPDF http://www.fpdf.org/en/script/script92.php

Vous pouvez facilement basculer du fichier FPDF d'origine. Assurez-vous également que vous utilisez également une police Unicode, comme indiqué dans l'exemple du lien ci-dessus ou dans 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 que c'est beaucoup plus élégant d'utiliser ceci au lieu de spammer utf8_decode () partout et la possibilité d'utiliser des fichiers .ttf directement dans AddFont () est également un avantage.

Toute autre réponse ici n’est qu’un moyen d’éviter ou de contourner le problème, et éviter UTF-8 n’est pas une véritable option pour un projet à jour.

Il existe également des alternatives telles que mPDF ou TCPDF (et d’autres) basées sur FPDF mais offrant des fonctions avancées, supportant UTF-8 et pouvant interpréter le code HTML (limité bien sûr, car il n’existe aucun moyen de convertir HTML en PDF) ..__ La plupart du code FPDF peut être utilisé directement dans ces bibliothèques, il est donc très facile de migrer le code.

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

28
Tarsis

il existe une solution très simple à ce problème.

Dans le fichier fpdf.php, allez à 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, remplacez simplement cp1252 par l’alphabet souhaité. 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 l'exemple de code ci-dessus, l'auteur original ayant oublié d'insérer un tiret entre utf et 8.

J'espère que ce qui précède était utile.

Daan

14
Daan

Vous devez d'abord générer une police. Vous devez utiliser l'utilitaire MakeFont inclus dans le package FPDF. J'ai utilisé sur Linux un peu le script 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');
}
?>

Ensuite, j'ai copié les fichiers générés dans le répertoire font de mon site Web et utilisé ceci:

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

(Je travaillais sur une table.) Cela a fonctionné pour ma langue (Buňka jedna est tchèque pour Cell one). La langue tchèque appartient aux langues d'Europe centrale, ainsi qu'à la norme ISO-8859-2. Malheureusement, l'utilisateur de FPDF est obligé de perdre les avantages du codage UTF-8. Vous ne pouvez pas obtenir cela dans votre PDF:

Městečko Fruens Bøge

La lettre danoise ø devient ř dans 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 le même codage cible que celui avec lequel la police a été générée.

9
K. T. Schnikow

Cette réponse n'a pas fonctionné pour moi, je devais aussi exécuter le décodage HTML sur la chaîne. Voir

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

Les accessoires vont à emfi à partir de html_entity_decode en FPDF (avec l’extension tFPDF)

4
Joel Small

Vous pouvez créer 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
Alejandro Aranda

Il existe une extension de FPDF appelée mPDF qui autorise les polices Unicode.

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

4
Jon Winstanley

Je voulais répondre à cette question pour tous ceux qui ne sont pas passés à TFPDF pour une raison quelconque (intégration du framework, etc.)

Allez à: http://www.fpdf.org/makefont/index.php

Utilisez une police compatible avec .ttf pour la langue que vous souhaitez utiliser. Assurez-vous de choisir le numéro de codage qui convient à votre langue. Téléchargez les fichiers et collez-les dans votre répertoire de polices FPDF actuel.

Utilisez ceci pour activer la nouvelle police: $pdf->AddFont($font_name,'','Your_Font_Here.php');

Ensuite, 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)

Substituez le numéro de codage Windows à votre codage de langue.

De droite à gauche, une solution rapide consiste à effectuer quelque chose comme strrev(iconv('UTF-8', 'windows-1255', $first_name)).

3
rozick

Aucune des solutions ci-dessus ne fonctionnera.

Essaye ça:

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

Comment créer des fichiers PDF en FPDF prenant en charge le chinois, le japonais, le russe, etc.?

(instantanés du code utilisé ci-dessous)

Je voudrais fournir: un résumé du problème, la solution, un projet github avec le code de travail et un exemple en ligne avec le fichier PDF attendu.

Le problème:

  1. Comme indiqué par Tarsis, remplacez FPDF par TFPDF.
  2. Vous avez réellement besoin d’une police prenant en charge les caractères UTF-8 que vous utilisez.

    I.E., utiliser simplement Helvetica et essayer d’afficher le japonais ne fonctionnera pas. Si vous utilisez Font Forge, ou un autre outil de police, vous pouvez faire défiler les caractères chinois de la police et vérifier qu'ils sont vides.

    Google a une police ( Noto font ) qui contient toutes les langues. Elle fait 20 Mo, ce qui est généralement fonction de la taille de votre texte. Vous pouvez donc voir pourquoi de nombreuses polices ne couvrent tout simplement pas toutes les langues.

La solution:

J'utilise les ensembles de polices rounded-mgenplus-20140828.ttf et ZCOOL_QingKe_HuangYou.ttf pour le japonais et le chinois, qui sont open source et que l'on peut trouver dans de nombreux projets open source. Dans tFPDF lui-même, ou dans une nouvelle classe qui en hérite, telle que class HTMLtoPDF extends tFPDF {...}, vous le ferez ...

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

Ça ne devrait plus être rien!

paquet de code sur GitHub:

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

Démonstration en ligne de travail en japonais:

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

2
HoldOffHunger

Pour les progénitures.

Comment j'ai réussi à ajouter le russe à fpdf sur ma machine Linux:

1) Allez à http://www.fpdf.org/makefont/ et convertissez votre police ttf (par exemple, AerialRegular.ttf) en 2 fichiers en utilisant le codage ISO-8859-5: AerialRegular.php et AerialRegular.z

2) Mettez ces 2 fichiers dans le répertoire fpdf/font

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
ryzhak

modifiez simplement la cellule de fonction dans le fichier fpdf.php, recherchez la ligne qui ressemble à ceci

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

après avoir trouvé la ligne

écrire après le {,

$txt = utf8_decode($txt);

sauvegardez le fichier et prêt, les accents et le codage utf8 fonctionneront :)

1
R.Costa

Au lieu de cette solution iconv:

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

Vous pouvez utiliser les éléments suivants:

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

Voir: Comment convertir des caractères Windows-1252 en valeurs en php?

1
Theo

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, c’est tFPDF, la version de FPDF qui prend en charge l’Unicode. Voici 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
NutCracker

J'utilise FPDF pour ASP, et la fonction iconv n'est pas disponible ..__ Cela semble étrange, j'ai résolu le problème UTF-8 en en ajoutant une fausse image (un fichier jpeg 1x1px), juste après le 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
niente1

Vous pouvez appliquer cette fonction sur votre texte:

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

Merci

0
gounane

Je ne sais pas si cela conviendra au grec, mais le même problème se posait pour les caractères portugais brésiliens et ma solution consistait à utiliser des entités html. J'ai eu essentiellement deux cas:

  1. La chaîne may contient des caractères UTF-8.

Pour ceux-ci, je l'ai d'abord encodé en HTML avec htmlentities(), puis 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');

Ensuite, j'ai passé $s à FPDF, comme dans cet exemple:

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

Remarque: ENT_COMPAT | ENT_HTML401 est la valeur standard du paramètre n ° 2, comme dans http://php.net/manual/en/function.html-entity-decode.php

J'espère que cela pourra aider.

0
Alexandre Schmidt

Il existe une extension à FPDF appelée UFDPF http://acko.net/blog/ufpdf-unicode-utf-8-extension-for-fpdf/

Mais à mon humble avis, il est préférable d’utiliser mpdf si vous pouvez changer de classe.

0
sr9yar