2013-05-05 99 views
7

我试图用正确的字符创建pdf,但有“?”字符。 我创建了一个测试php文件,我试图找到最好的解决方案。如果即时通信开放在浏览器的HTML我看起来像OKdompdf字符编码UTF-8

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> 

什么我做错了?我尝试了很多很多的选项,我发现:(任何想法?)

+0

大多数库不允许您以不同的编码加载数据,而不是您明确告诉要加载的库的数据。这通常会导致问题标记。所以我真的不知道为什么你真的认为用DOMPDF这应该是不同的?也可以尝试通过所有选项来玩游戏,但如果该游戏不能快速提供任何结果,则需要找到一种不同的策略来了解正在发生的事情。 – hakre 2013-05-05 13:11:28

+0

我做了几个选项,因为它是很难找出它是如何工作的,字符集ISO-8859-2没有任何关于它的可用信息,我GOOGLE了很多,我想UTF-8,其中每一个字符是确定! – lostika 2013-05-05 14:11:03

+1

是的,如果您想支持所有(在计算机系统上)已知字符,UTF-8是一个不错的选择。但是,在上面的代码中,您可以在* same *字符串中执行多种编码。这永远不会奏效。相反,最好找出你的字符串最初有哪些编码。然后用特定的编码转换成UTF-8。你应该只在这里做一次重新编码。这个答案也许会让你感觉很舒服:http://stackoverflow.com/a/5159071/367456 – hakre 2013-05-05 14:13:59

回答

25

你应该再读一遍Unicode How-to。主要问题是你没有指定一个字体来支持你的角色,看起来你已经读过因为您使用的是该文档中的字体示例,但该示例并不意味着全局应用于任何文档,dompdf默认不包含萤火虫(中文字体)或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> 
+0

没有用 - 在创作过程中€符号丢失了。 – 2014-11-17 13:28:56

+0

dompdf的哪个版本? DejaVu字体只包含0.6.x开头。而且,多件事情会影响输出。例如,你的文档实际上应该被编码为UTF-8,并且在标题中指定该编码。 – BrianS 2014-11-20 14:29:12

+0

版本是0.6.1 ''和字体设定withing CSS和身体标记:'字体家庭: Helvetica,“Times New Roman”,serif;' – 2014-11-21 08:53:54

-1

我有类似的问题,结束了使用TCPDF。希望这会有所帮助。 http://www.tcpdf.org/
问题是我正在使用的字体。我能够使用这个字体'freeserif'得到正确的输出。我想用dompdf可能会得到相同的输出。

$pdf->SetFont('freeserif', '', 12); 

这是我用过的样品。 tcpdf utf-8 sample

<?php 
header('Content-type: text/html; charset=UTF-8') ;//chrome 
require_once('tcpdf_include.php'); 

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

$pdf->setFontSubsetting(true); 

$pdf->SetFont('freeserif', '', 12); 

$pdf->AddPage(); 

$utf8text = ' 
<html><head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body> 
<b>Ponuka číslo € černý Češký </b></br> 
සිංහල </br> 
<u>தேமல </u> </br> 
</body></html>'; 

$pdf->SetTextColor(0, 63, 127); 

$pdf->writeHTML($utf8text, true, 0, true, true); 

$pdf->Output('example_008.pdf', 'I'); 

?> 
20

我UTF-8字符,这个组合的工作。 之前你通过HTML到DOMPDF,使这个编码秘密:

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

使用DejaVu字体在你的CSS

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

确保您已设置UTF-8编码的HTML <head>标签

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

现在所有的特殊字符都可以正常工作“

+0

对于我指定''工作 – 2017-01-12 13:06:54

4

只添加这是为我工作

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

之前</head>

+0

也成立 DEF( “DOMPDF_ENABLE_HTML5PARSER”,假); 至 def(“DOMPDF_ENABLE_HTML5PARSER”,true); 在dompdf_config.inc.php文件中。 – 2018-02-21 06:59:46

0

没有出来提及的答案帮助了我。经过几个小时的努力,我切换到niklasravnsborg/laravel-pdf几乎完全相同的语法和用法,一切工作都很好。

0

如果你不介意的话只有一个字符集,你可以改变每个字符集在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' 
    ) 
) 
?> 

我知道这是不是最好的方式,但它可以节省大量的时间