Php dompdf字符编码UTF-8

Php dompdf字符编码UTF-8,php,utf-8,character-encoding,dompdf,Php,Utf 8,Character Encoding,Dompdf,我正在尝试用正确的字符创建pdf,但是有“?”字符。 我创建了一个测试php文件,在这里我试图找到最好的解决方案。如果我在浏览器中打开html,我看起来很好 UTF-8 --> UTF-8 : X Ponuka číslo € černý Češký 但当我查看pdf时,我看到了这一点 UTF-8 --> UTF-8 : X Ponuka ?íslo € ?erný ?ešký 这是我的全部代码: <html> <head> <meta

我正在尝试用正确的字符创建pdf,但是有“?”字符。 我创建了一个测试php文件,在这里我试图找到最好的解决方案。如果我在浏览器中打开html,我看起来很好

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>

čsšŠ
我做错了什么?我尝试了很多选择,我发现:(有什么想法吗?

您应该重新阅读。主要问题是您没有指定支持字符的字体。看起来您已经阅读了操作指南,因为您使用的是该文档中的字体示例。但是该示例并不适用于任何文档,DOMPF不包括firefly(中文字体)或默认为Verdana

如果未指定字体,则dompdf将退回到仅支持Windows ANSI编码的核心字体之一(Helvetica、Times Roman、Courier)。因此,请始终确保使用支持Unicode编码且具有需要显示的字符的字体来设置文本样式

使用dompdf 0.6.0,您可以使用附带的似曾相识字体。因此,以下内容应该可以使用(仅HTML):


正文{字体系列:无衬线,无衬线;}
čsšŠ
ýX Ponukačsločernýešký


我也遇到了类似的问题,最终使用了tcpdf。希望这能有所帮助。
问题是我使用的字体。我能够使用此字体“freeserif”获得正确的输出。我想使用此字体与dompdf可能获得相同的输出

$pdf->SetFont('freeserif', '', 12);
这是我用过的样品。


我用这个组合使用了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编码

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

现在所有的特殊角色都在“ľťžýáíé”中工作

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

*{字体系列:DejaVu Sans!重要;}

这对我来说很有用。

上述答案对我没有任何帮助。经过数小时的努力,我改用了几乎完全相同的语法和用法,一切正常。

如果你不介意只使用一个字符集,你可以在
dompdf\u font\u family\u 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'
    )
)
?>

我知道这不是最好的方法,但它节省了很多时间

utf8_decode()为我做了一些德语翻译,如ä和ü

echo utf8_decode('X Ponuka číslo € černý Češký <br>');
echo utf8ýu解码('X Ponukačsločernýešký
);
汉字有时会引起问题。 重要的是要有好的字体列表,你可以下载

我选择了第一个名为“楷体”的字体,这里有一个

然后把它放在你的托管服务上的一个公共文件夹中。我把它放在

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;

我也有同样的问题,我解决得很简单。 只需在生成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;}

Dompdf不支持回退字体,因此如果您喜欢的字体不支持您的字符,则无法使用该字体,并且您也无法将其他字体设置为这些字符的回退字体,如
droid sans fallback

相反,您可以做的是利用正则表达式unicode脚本范围:将这些文本块包装成跨距,并为它们提供回退字体

例如:

$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]);
$body='测试简化字 彝語/彝语 测试čsločernýčešký';
$cjk|U脚本='Bopomofo | Han |平假名|片假名';
$cjk_scripts=preg_replace('/[a-zA-Z_]+/','\\p{$0}',$cjk_scripts);
//将CJK字符包装成具有自己字体的跨距
$body=preg_replace(“/($cjk_脚本)+/isu”、“$0”、$body);
//支持CJK字符的字体
$cjk_font_path=APP_path'/fonts/droidansfallbackfull.ttf';
$html=render();
$dompdf->stream('test.pdf',['Attachment'=>0]);

相关:

这里有很多答案,很难找到可靠的跨语言支持。我相信对于我们这些制作分布式软件的人来说,还有一些服务器设置块,它们会阻止一些功能,例如pdfdom中的
@import
src:url()
,自动嵌入字体

以下解决方案已在许多服务器和本地托管站点上运行,不需要命令行访问:

  • 检索要用作.ttf的字体(对于语言支持,包括西里尔文、希腊文、德瓦纳加里文、拉丁文和越南文,我们在选中所有可选语言时使用)
  • 在以下脚本中运行/生成并仅启动一次PDFBuilder_install_font_family()(单数安装)

  • PDFBuilder\u安装\u字体\u系列()的要点

    大多数库不允许您以不同的编码加载数据,而不是您明确告诉库加载的编码。这通常会导致出现问号。所以我真的很想知道,为什么您真的认为使用DOMPDF时应该有所不同?尝试所有选项也可以,但如果是这样的话play不会很快给出任何结果,你需要找到不同的策略来理解正在发生的事情。我做了几个选择,因为很难找到它是如何工作的,字符集ISO-8859-2没有任何可用的信息,我在谷歌上搜索了很多,我想要UTF-8,每个字符都可以!是的,UTF-8是一个很好的选择,如果你想支持它的话端口全部(在计算机系统上)已知字符。但是,在上面的代码中,您在同一个字符串中执行多个编码。这永远不会很好。相反,最好找出字符串最初使用的编码。然后使用特定的编码转换为UTF-8。您应该在此处只执行一次重编码。这个答案可能也会让您感兴趣:什么版本
    ini_set("allow_url_fopen", true);
    
    @import url('https://fonts.googleapis.com/css?family=Roboto:400,700&subset=latin-ext');
    body {font-family: 'Roboto', sans-serif;}
    
    $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]);