web-dev-qa-db-ja.com

dompdf文字エンコードUTF-8

私は正しい文字でpdfを作成しようとしていますが、「?」があります文字。私はテスト用のphpファイルを作成しました。ここで、最良の解決策を試そうとしています。ブラウザでHTMLを開くと、OKのように見える

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

しかし、私がpdfを見ると、私はこれを見る

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

ここに私のすべてのコードがあります:

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

何が悪いの?私は見つけた多くの多くのオプションを試しました:(アイデアはありますか?

13
lostika

nicode How-to をもう一度お読みください。主な問題は、キャラクターをサポートするフォントを指定しないことです。そのドキュメントのフォント例を使用しているため、ハウツーを読んだようです。ただし、この例はドキュメントにグローバルに適用することを意図したものではなく、dompdfにはデフォルトでfirefly(中国語の文字フォント)またはVerdanaは含まれていません。

フォントを指定しない場合、dompdfは、Windows ANSIエンコーディングのみをサポートするコアフォント(Helvetica、Times Roman、Courier)のいずれかにフォールバックします。したがって、Unicodeエンコーディングをサポートし、表示する必要がある文字を含むフォントでテキストを常にスタイル設定してください。

Dompdf 0.6.0では、付属のDeja Vuフォントを使用できます。したがって、次のように動作するはずです(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>
31
BrianS

この組み合わせでUTF-8文字が機能するようになりました。 htmlをDOMpdfに渡す前に、これを使ってエンコードを隠します:

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

CSSでDejaVuフォントを使用する

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

HTMLでutf-8エンコーディングを設定していることを確認してください<head> 鬼ごっこ

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

現在、すべての特殊文字が機能しています。「ľščťžýáíé」

25
Frantisek

追加のみ

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

</head>それは私のために働いています。

9
Prasant Kumar

utf8_decode()は、äやüなどのドイツ語の翻訳をいくつか使って、私のためにトリックをしてくれました。

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

Dompdfはフォールバックフォントをサポートしていないため、文字をサポートしていない場合はお気に入りのフォントを使用できません。また、droid sans fallbackなどの文字のフォールバックフォントとして別のフォントを設定することもできません。

代わりにできることは、正規表現のユニコードスクリプト範囲を利用することです。 https://www.regular-expressions.info/unicode.html テキストのブロックをスパンにラップし、フォールバックフォントを与える。

例:

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

関連: https://github.com/dompdf/dompdf/issues/1508

1
Timo Huovinen

言及された答えのうち、何も私を助けませんでした。数時間の苦労の末、私は niklasravnsborg/laravel-pdf に切り替えましたが、構文と使用方法はほぼ同じで、すべて正常に機能しています。

1
Fusion

文字セットが1つだけでも構わない場合は、dompdf_font_family_cache.dist.phpのすべての文字セットを変更できます

と同じように

<?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'
    )
)
?>

私はそれが最善の方法ではないことを知っていますが、それは多くの時間を節約します

0
David Škarda

私は同じ問題を抱えていて、とても簡単に解決しました。 HTMLを生成するときに使用されるCSSファイルに、必要な言語サブセットを含むGoogleフォントをインポートするだけです。 HTMLファイルでutf-8を指定すると動作します...

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

中国語の文字が時々問題を引き起こしています。重要な部分は良いフォントを持つことです here はダウンロード可能なリストです。

ここでは、最初に「Kai Bold Font」という名前を選択しました ダウンロードページ

次に、ホスティングサービスのパブリックフォルダーに配置します。私はそれを入れました

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

これが私の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。このセットが必要になる可能性が少しあります。

ini_set("allow_url_fopen", true);
0