web-dev-qa-db-fra.com

codage de caractères dompdf UTF-8

J'essaie de créer un pdf avec les caractères corrects, mais il y a "?" J'ai créé un fichier test php, où je cherche la meilleure solution. Si je suis ouvert dans le navigateur le html je ressemble à ok

UTF-8 --> UTF-8 : X Ponuka číslo € černý Češký 

Mais quand je regarde dans le pdf je vois ceci 

UTF-8 --> UTF-8 : X Ponuka ?íslo € ?erný ?ešký 

Voici mon tout code:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>č s š Š</title>
</head>
<body>
<?php 

require_once("dompdf/dompdf_config.inc.php");
$tab = array("UTF-8", "ASCII", "Windows-1250", "ISO-8859-2", "ISO-8859-1", "ISO-8859-6", "CP1256"); 
$chain = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <style></style><title>č s š Š</title></head><body>';
foreach ($tab as $i) 
    { 
        foreach ($tab as $j) 
        { 
            $chain .= "<br> $i --> $j : ".iconv($i, $j, 'X Ponuka číslo € černý Češký <br>'); 
        } 
    } 
$chain .= '<p style="font-family: firefly, verdana, sans-serif;">??????X Ponuka číslo € černý Češký <br></p></body></html>';
echo $chain; 
echo 'X Ponuka číslo € černý Češký <br>'; 

$filename = 'pdf/_1.pdf';
$dompdf = new DOMPDF();
$dompdf->load_html($chain, 'UTF-8');
$dompdf->set_paper('a4', 'portrait'); // change these if you need to
$dompdf->render();
file_put_contents($filename, $dompdf->output());

?> 
</body>
</html>

Qu'est-ce que je fais mal? J'ai essayé beaucoup de nombreuses options que j'ai trouvées :( Une idée?

11
lostika

Vous devriez relire le Unicode How-to . Le problème principal est que vous ne spécifiez pas une police compatible avec vos caractères. Il semble que vous ayez lu le guide pratique, car vous utilisez l'exemple de police de ce document. Toutefois, l’exemple n’était censé s’appliquer à aucun document, dompdf n’incluant pas firefly (police de caractères chinoise) ni Verdana par défaut.

Si vous ne spécifiez pas de police, dompdf revient à l’une des polices principales (Helvetica, Times Roman, Courier) qui ne prend en charge que le codage ANSI Windows. Veillez donc toujours à styler votre texte avec une police prenant en charge le codage Unicode et contenant les caractères à afficher.

Avec dompdf 0.6.0, vous pouvez utiliser les polices Deja Vu incluses. Donc, ce qui suit devrait fonctionner (seulement le HTML):

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style>
  body { font-family: DejaVu Sans, sans-serif; }
</style>
<title>č s š Š</title>
</head>
<body>
  <p>??????X Ponuka číslo € černý Češký <br></p>
</body>
</html>
29
BrianS

Des caractères UTF-8 ont été utilisés avec cette combinaison ..__ Avant de passer le code HTML à DOMpdf, faites de l’encodage une opération secrète:

$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');

Utilisez la police DejaVu dans votre css

*{ font-family: DejaVu Sans; font-size: 12px;}

Assurez-vous d'avoir défini le codage utf-8 dans la balise HTML <head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Désormais, tous les caractères spéciaux fonctionnent "š è ť ã"

25
Frantisek

Seulement ajouter

  <style>
    *{ font-family: DejaVu Sans !important;}
  </style>

avant </head>Il travaille pour moi.

7
Prasant Kumar

utf8_decode () a fait le tour pour moi avec des traductions allemandes comme ä et ü.

echo utf8_decode('X Ponuka číslo € černý Češký <br>');
2
Dirk de Boer

Rien sur les réponses mentionnées ne m'a aidé. Après des heures de lutte, je suis passé à niklasravnsborg/laravel-pdf a presque exactement la même syntaxe et le même usage, et tout fonctionne correctement.

1
Fusion

Dompdf ne prend pas en charge les polices de secours, vous ne pouvez donc pas utiliser votre police préférée s'il ne prend pas en charge vos caractères, et vous ne pouvez pas non plus définir une autre police comme police de secours pour ces caractères tels que droid sans fallback.

Ce que vous pouvez faire à la place, c’est tirer parti des plages de scripts regex unicode: https://www.regular-expressions.info/unicode.html pour envelopper ces blocs de texte en plages et leur attribuer la police de remplacement.

Exemple:

$body = 'test 简化字 彝語/彝语 test číslo € černý Češký';

$cjk_scripts = 'Bopomofo|Han|Hiragana|Katakana';
$cjk_scripts = preg_replace('/[a-zA-Z_]+/', '\\p{$0}', $cjk_scripts);

// wrap the CJK characters into a span with it's own font
$body = preg_replace("/($cjk_scripts)+/isu", '<span class="cjk">$0</span>', $body);

// a font that supports CJK characters
$cjk_font_path = APP_PATH.'/fonts/DroidSansFallbackFull.ttf';

$html = <<<HTML
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style type="text/css">
@font-face {
    font-family: 'DroidSansFallbackFull';
    font-style: normal;
    font-weight: 400;
    src: url('$cjk_font_path') format('truetype');
}
body {
    font-family: DejaVu Sans, sans-serif;;
}
.cjk {
    font-family: DroidSansFallbackFull, sans-serif;
}
</style>
</head>
<body>$body</body>
</html>
HTML;

$dompdf = new \DOMPDF();
$dompdf->set_paper('A4');
$dompdf->load_html($html);
$dompdf->render();

$dompdf->stream('test.pdf', ['Attachment'=>0]);

Connexes: https://github.com/dompdf/dompdf/issues/1508

0
Timo Huovinen

Si cela ne vous dérange pas d'avoir un seul jeu de caractères, vous pouvez changer chaque jeu de caractères dans dompdf_font_family_cache.dist.php

juste comme 

<?php
$distFontDir = $rootDir . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR . 'fonts' . DIRECTORY_SEPARATOR;
return array(
    'sans-serif' =>
    array(
        'bold' => $distFontDir . 'DejaVuSans-Bold',
        'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
        'italic' => $distFontDir . 'DejaVuSans-Oblique',
        'normal' => $distFontDir . 'DejaVuSans'
    ),
    'times' =>
    array(
        'bold' => $distFontDir . 'DejaVuSans-Bold',
        'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
        'italic' => $distFontDir . 'DejaVuSans-Oblique',
        'normal' => $distFontDir . 'DejaVuSans'
    ),
    'times-roman' =>
    array(
        'bold' => $distFontDir . 'DejaVuSans-Bold',
        'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
        'italic' => $distFontDir . 'DejaVuSans-Oblique',
        'normal' => $distFontDir . 'DejaVuSans'
    ),
    'courier' =>
    array(
        'bold' => $distFontDir . 'DejaVuSans-Bold',
        'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
        'italic' => $distFontDir . 'DejaVuSans-Oblique',
        'normal' => $distFontDir . 'DejaVuSans'
    ),
    'helvetica' =>
    array(
        'bold' => $distFontDir . 'DejaVuSans-Bold',
        'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
        'italic' => $distFontDir . 'DejaVuSans-Oblique',
        'normal' => $distFontDir . 'DejaVuSans'
    ),
    'zapfdingbats' =>
    array(
        'bold' => $distFontDir . 'DejaVuSans-Bold',
        'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
        'italic' => $distFontDir . 'DejaVuSans-Oblique',
        'normal' => $distFontDir . 'DejaVuSans'
    ),
    'symbol' =>
    array(
        'bold' => $distFontDir . 'DejaVuSans-Bold',
        'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
        'italic' => $distFontDir . 'DejaVuSans-Oblique',
        'normal' => $distFontDir . 'DejaVuSans'
    ),
    'serif' =>
    array(
        'bold' => $distFontDir . 'DejaVuSans-Bold',
        'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
        'italic' => $distFontDir . 'DejaVuSans-Oblique',
        'normal' => $distFontDir . 'DejaVuSans'
    ),
    'monospace' =>
    array(
        'bold' => $distFontDir . 'DejaVuSans-Bold',
        'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
        'italic' => $distFontDir . 'DejaVuSans-Oblique',
        'normal' => $distFontDir . 'DejaVuSans'
    ),
    'fixed' =>
    array(
        'bold' => $distFontDir . 'DejaVuSans-Bold',
        'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
        'italic' => $distFontDir . 'DejaVuSans-Oblique',
        'normal' => $distFontDir . 'DejaVuSans'
    ),
    'dejavu sans' =>
    array(
        'bold' => $distFontDir . 'DejaVuSans-Bold',
        'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
        'italic' => $distFontDir . 'DejaVuSans-Oblique',
        'normal' => $distFontDir . 'DejaVuSans'
    ),
    'dejavu sans mono' =>
    array(
        'bold' => $distFontDir . 'DejaVuSansMono-Bold',
        'bold_italic' => $distFontDir . 'DejaVuSansMono-BoldOblique',
        'italic' => $distFontDir . 'DejaVuSansMono-Oblique',
        'normal' => $distFontDir . 'DejaVuSansMono'
    ),
    'dejavu serif' =>
    array(
        'bold' => $distFontDir . 'DejaVuSerif-Bold',
        'bold_italic' => $distFontDir . 'DejaVuSerif-BoldItalic',
        'italic' => $distFontDir . 'DejaVuSerif-Italic',
        'normal' => $distFontDir . 'DejaVuSerif'
    )
)
?>

Je sais que ce n'est pas la meilleure façon, mais cela fait gagner beaucoup de temps

0
David Škarda

J'ai eu le même problème et je l'ai résolu très simplement . Importez simplement les polices de Google avec le sous-ensemble de langue requis dans votre fichier CSS qui est utilisé lors de la génération de HTML. Spécifiez utf-8 dans votre fichier HTML et ça marche ...

@import url('https://fonts.googleapis.com/css?family=Roboto:400,700&subset=latin-ext');
body {font-family: 'Roboto', sans-serif;}
0
general666

Les caractères chinois posent parfois des problèmes… L’important est d’avoir une bonne police ici est une liste que vous pouvez télécharger.

J'ai choisi d'abord nommé "Kai Bold Font", voici une page de téléchargement

Ensuite, placez-le sur votre service d'hébergement dans un dossier public. Je l'ai mis dans 

http://192.168.10.10/fonts/pdf/wts11.ttf

et voici mon exemple html

$html = <<<EOT
<!DOCTYPE html>
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
   <style>
    @font-face {
      font-family: chinese;
        src: url('http://192.168.10.10/fonts/pdf/wts11.ttf') format('truetype');
    }
    .chineseLanguage { font-family: chinese; }
      body {font-family: DejaVu Sans, sans-serif;}
   </style>
</head>
<body>
    Chinese
    <div class='chineseLanguage'>
        忠烈祠
        中文 - 这工作<br> 
    </div>
    hello world <br> 
    Russian - русский текст <br>
    Greek - α,β,γ,δ,ε <br>
    chars - !@#$%^&* -=- €   <br><br>
    <br>
    Hebrew (iw)<br><br>
    דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה<br>
    <br>    
</body>
</html>
EOT;

PS. il y a une petite chance que vous ayez besoin de cet ensemble:

ini_set("allow_url_fopen", true);
0
Yevgeniy Afanasyev