web-dev-qa-db-fra.com

TCPDF UTF-8. Les symboles lituaniens n'apparaissent pas

J'utilise la dernière version de TCPDF (5.9). Mais avez des problèmes étranges avec l'encodage. J'ai besoin de symboles en langue lituanienne comme: ąčęėįšųūž. Mais n'en obtenez que peu. D'autres restent comme ????? Donc qu'est ce que je devrais faire ? J'utilise la police Times par défaut (elle est livrée avec le téléchargement TCPDF).

Toute aide serait appréciée.

25
Bounce

Met le $unicode paramètre du constructeur TCPDF sur false et $encoding paramètre à 'ISO-8859-1' ou une autre carte de caractères.

This vous aidera:

Valeur par défaut pour unicode UTF-8:

$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

Exemple de constructeur pour le jeu de caractères européen:

$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, false, 'ISO-8859-1', false);
14
Elisa

TCPDF est assez délicat avec utf8. La meilleure façon d'atteindre ce que vous voulez est d'incorporer la police dans le fichier généré PDF lui-même. Vous pouvez utiliser la police freeserif du package TCPDF, elle contient tous les symboles utf8, montre absolument n'importe quel caractère de n'importe quel mais ajoute ~ 700 Ko au fichier de sortie. C'est probablement le moyen le plus simple d'obtenir les symboles dont vous avez besoin si la taille du fichier n'a pas d'importance.

Vous pouvez également créer votre propre police à intégrer, contenant les caractères dont vous avez besoin. C'est probablement la meilleure solution, en la gardant universelle et de petite taille, mais c'est plus complexe.

Alternativement, vous pouvez relayer sur les polices de base, qui sont extraites du système et, si elles ne sont pas trouvées, remplacées par un substitut. Cela rend le fichier de sortie extrêmement léger, mais ajoute la nécessité d'un sous-ensemble de polices pour obtenir des caractères exotiques. Personnellement, je n'ai pas eu de succès avec cela, donc je pense toujours que l'incorporation de polices est la meilleure solution, qui se trouve également être plus universelle ..

30
squirrely

il y a une police incluse dans les polices de base CPDF - dejavusans, elle montre tous les caractères lituaniens. Ajoutez simplement ce qui suit:

$pdf->setHeaderFont(Array('dejavusans', '', 10, '', false));
$pdf->setFooterFont(Array('dejavusans', '', 8, '', false));
$pdf->SetFont('dejavusans', '', 10, '', false);
12

Réglez la police sur freeserif si cela fonctionnera. J'ai testé.

$pdf->SetFont('freeserif', '', 14, '', true);
9
Truongnq

Je viens de découvrir cette même situation en essayant de rendre le texte roumain en utilisant la police Helvetica par défaut. En faisant quelques recherches, j'ai trouvé que la bibliothèque tcpdf traite ses polices par défaut (appelées polices "de base") comme des caractères Latin1, donc même si vous lui dites d'utiliser le codage UTF-8 et de définir l'indicateur unicode, il traduira littéralement votre texte en équivalents Latin1 avant le rendu. Le comportement par défaut de la bibliothèque est, si elle trouve un équivalent Latin1, de traduire chaque caractère pour lequel elle peut trouver un équivalent, sinon elle traduit le caractère par "?".

Cela peut être trouvé à l'intérieur de la classe TCPDF dans la chaîne de méthodes suivante: Write() -> Cell() -> getCellCode() -> _escapetext().

À l'intérieur de _escapetext() vous pouvez voir qu'il vérifie $this->isunicode Puis vérifie la police sélectionnée pour voir si son type est core | TrueType | Type1. Si c'est le cas, il prendra la chaîne et la "latinisera" pour vous par la méthode UTF8ToLatin1(). C'est là que le '?' des traductions sont en cours.

Ma recommandation serait d'utiliser une police Unicode personnalisée (comme Deja Vu Sans) similaire à la police par défaut que vous recherchez. Cela a fonctionné pour moi dans ma situation actuelle.

9
RobertGonzalez

Pour utiliser TCPDF avec des caractères spéciaux comme ฿, 포 ou autres , vous devez utiliser un unicode police:

  1. téléchargez la police ici: ftp://ftp.fu-berlin.de/unix/X11/multimedia/MPlayer/contrib/fonts /arialuni.ttf.bz2

  2. créez un fichier pdf de test et chargez cette police dans l'exemple TCPDF:

    $fontname = $pdf->addTTFfont('/var/www/app/images/fonts/arialuni.ttf', 'TrueTypeUnicode', '', 32);

  3. cela créera les polices comme:

    application/bibliothèques/tcpdf/fonts/arialuni.ctg.z
    application/bibliothèques/tcpdf/fonts/arialuni.php
    application/bibliothèques/tcpdf/fonts/arialuni.z

  4. vous pouvez maintenant définir la nouvelle police avec: $ pdf-> SetFont ('arialuni', '', 10.5);

  5. et maintenant vous pouvez utiliser des caractères Unicode spéciaux comme ฿ et plus ....

Source: http://myridia.com/dev_posts/view/852

8
Ledadu

Vous avez du mal à lire des caractères comme Karnātaka de la base de données et à les afficher comme ceci karn? Taka Je veux dire "?" dont nous ne voulons pas puis faites les choses suivantes:

  1. Définissez le jeu de caractères pour la connexion (mysql_set_charset()):

    $con = mysql_connect("localhost","root","");
    
    if (!$con)
    {
        die('Could not connect: ' . mysql_error());
    }
    mysql_select_db("database_name", $con) or die(mysql_error());
    mysql_set_charset('utf8',$con);
    
  2. Utilisez $pdf->SetFont('DejaVuSerif', '', 10); au lieu de $pdf->SetFont('helvetica', 'B', 12);

    • Pour la bibliothèque TCPDF du caractère PHP lu comme Rājasthān au lieu de R? Jasth? N de la base de données
4
Aki

IIRC, vous pouvez définir un encodage lorsque vous créez une nouvelle police, comme décrit ici . Sinon, vous devez utiliser l'encodage défini lors de la création de la police. Il semble que les polices fournies avec TCPDF utilisent toutes WinAnsiEncoding ... a.k.a. page de codes 1252.

Clunky, mais efficace.

3
Mark Storer

Pour moi, c'était un problème de police. J'ai utilisé la police timeset mes chras locaux multi-octets ne s'afficheraient pas correctement. Quand je l'ai changé en freeserif ils fonctionnaient normalement :)

2
techouse

Avec la police dejavusans, cela fonctionnait bien pour les lettres russes et lettones.

2
JustAMartin

Avec le package TCPDF par défaut testé dejavusans et freeserif et les deux polices fonctionnent avec des caractères lituaniens. J'ai également tapé quelques caractères russes et ils ont aussi fonctionné. J'ai utilisé ce code pour le tester:

$this->pdf = new \TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); 
$this->pdf->AddPage();
$this->pdf->SetFont('dejavusans', 'B', 20); // UTF8 fonts with lithuanian support: freeserif, dejavusans
$this->pdf->Write(0, 'ąžūčšęėųįĄŽŪČŠĘĖŲĮ Превед Кросавчег!', '', 0, 'C', true, 0, false, false, 0);
1
agira
$fontname = $pdf->addTTFfont('C:\xampp\htdocs\copyshop\fonts\07-TH-Sarabun-PSK\THSarabun.ttf', 'TrueTypeUnicode', '', 32);
    $pdf->SetFont($fontname, '', 16,'',FALSE); //Working
0
Donot Don't

changer la police pour afficher normalement les symboles ₹ et lituaniens

$pdf->SetFont('cid0cs', '', 12);
0
Gajarajan K

J'ai eu le même problème avec les caractères roumains et le problème n'était pas l'encodage, LC_CTYPE ou un autre paramètre de [ ~ # ~] tcpdf [~ # ~] , mais la police que j'ai utilisée. Je mentionne que j'ai utilisé TWIG modèle avec la police Courier. Vous pouvez essayer de changer votre police en freeserif

0
Ciprian Virlan

Pour cela, utilisez le code suivant du paramètre constructeur TCPDF

$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, false, 'ISO-8859-1', false);

Cela vous aidera.

0
Anil Kumar