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
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);
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.
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
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.
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)
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);
}
}
Il existe une extension de FPDF appelée mPDF qui autorise les polices Unicode.
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))
.
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;
}
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:
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:
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);
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 :)
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?
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();
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.
Vous pouvez appliquer cette fonction sur votre texte:
$yourtext = iconv('UTF-8', 'windows-1252', $yourtext);
Merci
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:
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');
Pour ceux-ci, je viens de laisser htmlentities()
appeler. Exemple:
$s = html_entity_decode("Treasurer/Tré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.
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.