简体   繁体   English

dompdf 字符编码 UTF-8

[英]dompdf character encoding UTF-8

Im trying to create pdf with correct characters, but there are "?"我试图用正确的字符创建pdf,但有“?” chars.字符。 I created a test php file, where Im trying to fing the best solution.我创建了一个测试 php 文件,我试图在其中找到最佳解决方案。 If Im open in the browser the html I looks like ok如果我在浏览器中打开 html 我看起来没问题

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

But when I look into the pdf I see this但是当我查看pdf时,我看到了这个

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

Here is my all 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>

What Im doing wrong?我做错了什么? I tried many many options which I found :( Any idea?我尝试了很多我发现的选项:(知道吗?

You should read over the Unicode How-to again.您应该再次阅读Unicode How-to The main problem is that you don't specify a font that supports your characters.主要问题是您没有指定支持您的字符的字体。 It looks like you've read the how-to, because you're using the font example from that document.看起来您已经阅读了操作指南,因为您使用的是该文档中的字体示例。 However the example was not meant to apply globally to any document, dompdf doesn't include firefly (a Chinese character font) or Verdana by default.然而,该示例并不打算全局应用于任何文档,dompdf 默认不包含萤火虫(一种汉字字体)或 Verdana。

If you do not specify a font then dompdf falls back to one of the core fonts (Helvetica, Times Roman, Courier) which only support Windows ANSI encoding.如果您不指定字体,则 dompdf 将退回到仅支持 Windows ANSI 编码的核心字体之一(Helvetica、Times Roman、Courier)。 So always be sure to style your text with a font that supports Unicode encoding and has the characters you need to display.因此,请务必使用支持 Unicode 编码并具有您需要显示的字符的字体来设置文本样式。

With dompdf 0.6.0 you can use the included Deja Vu fonts.使用 dompdf 0.6.0,您可以使用包含的 Deja Vu 字体。 So the following should work (just the HTML):所以以下应该工作(只是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>

I got UTF-8 characters working with this combination.我得到了使用这种组合的 UTF-8 字符。 Before you pass html to DOMpdf, make encoding covert with this:在将 html 传递给 DOMpdf 之前,请使用以下代码进行编码:

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

Use DejaVu font in your css在你的 css 中使用 DejaVu 字体

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

Make sure you have set utf-8 encoding in HTML <head> tag确保在 HTML <head>标签中设置了 utf-8 编码

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

Now all special characters are working "ľ š č ť ž ý á í é"现在所有特殊字符都可以使用“ľ š č ť ž ý á í é”

Only Add只添加

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

before </head> It is working for me.之前</head>它对我有用。

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

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

Dompdf does not support fallback fonts, so you can't use your favorite font if it does not support your characters, and you also can't set another font to be the fallback font for those characters like droid sans fallback . Dompdf 不支持后备字体,因此如果它不支持您的字符,您就不能使用您喜欢的字体,并且您也不能将其他字体设置为这些字符的后备字体,例如droid sans fallback

What you can do instead is take advantage of regex unicode script ranges: https://www.regular-expressions.info/unicode.html to wrap those blocks of text into spans and give them the fallback font.您可以做的是利用正则表达式 unicode 脚本范围: https : //www.regular-expressions.info/unicode.html将这些文本块包装到跨度中并为它们提供后备字体。

Example:例子:

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

Related: https://github.com/dompdf/dompdf/issues/1508相关: https : //github.com/dompdf/dompdf/issues/1508

Nothing out of mentioned answers helped me.提到的答案中没有任何帮助我。 After hours of struggle I switched to niklasravnsborg/laravel-pdf has nearly exactly the same syntax and usage, and everything is working allright.经过数小时的努力,我切换到niklasravnsborg/laravel-pdf具有几乎完全相同的语法和用法,并且一切正常。

If you don't mind having only one charset you can change every charset in dompdf_font_family_cache.dist.php如果您不介意只有一个字符集,您可以更改dompdf_font_family_cache.dist.php每个字符集

just like就像

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

I know it's not the best way, but it saves lot of time我知道这不是最好的方法,但它节省了很多时间

Chinese characters are causing problems sometimes.中文字符有时会引起问题。 The important part is to have good font here is a list you can download.重要的部分是要有好的字体,这里有一个你可以下载的列表。

I chose first named "Kai Bold Font" here is a download page我选择了第一个命名为“Kai Bold Font” 这里是一个下载页面

Then put it on your hosting service in a public folder.然后将它放在您的托管服务上的公共文件夹中。 I put it into我把它放进

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

and here is my html example这是我的 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.附注。 there is a little chance you might need this set:您可能需要此套装的可能性很小:

ini_set("allow_url_fopen", true);

I had similar problem and ended up using tcpdf .Hope this could be helpful.我遇到了类似的问题并最终使用了tcpdf 。希望这会有所帮助。 http://www.tcpdf.org/ http://www.tcpdf.org/
Problem was the font i was using.I was able to get the correct output using this font 'freeserif'.I guess it might be possible to get the same output using this font with dompdf .问题是字型我是using.I能得到使用这种字体“freeserif'.I猜测有可能获得使用该字体与DOMPDF相同的输出正确的输出。

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

Here is the sample i have used.这是我使用过的示例。 tcpdf utf-8 sample tcpdf utf-8 示例

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

?>

I had the same problem and I solved it very simple.我遇到了同样的问题,我很简单地解决了它。 Just import google fonts with required language subset in your CSS file which is used when generating HTML.只需在生成 HTML 时使用的 CSS 文件中导入具有所需语言子集的谷歌字体。 Specify utf-8 in your HTML file and it's working...在您的 HTML 文件中指定 utf-8 并且它正在工作...

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

Lots of answers here, struggled to get any to provide cross-language support reliably.这里有很多答案,很难找到可靠地提供跨语言支持的答案。 I believe that for those of us making distributed software, there is also server-setting blocks which stop some functionality such as @import and src:url() in pdfdom automatically working to embed a font.我相信对于我们这些制作分布式软件的人来说,还有一些服务器设置块可以阻止某些功能,例如 pdfdom 中的@importsrc:url()自动嵌入字体。

The following solution has worked across many servers & locally hosted sites, and requires no command line access:以下解决方案适用于许多服务器和本地托管站点,并且不需要命令行访问:

  1. Retrieve font you want to use as a .ttf (for language support including Cyrillic, Greek, Devanagari, Latin, and Vietnamese, we used Noto Sans with all optional languages checked)检索要用作 .ttf 的字体(为了支持包括西里尔文、希腊文、梵文、拉丁文和越南文在内的语言,我们使用了Noto Sans,并选中了所有可选语言)
  2. Run/build-in the following script and fire PDFBuilder_install_font_family() ONCE only (singular install)运行/内置以下脚本并仅触发 PDFBuilder_install_font_family() 一次(单一安装)

Gist for PDFBuilder_install_font_family() : https://gist.github.com/woodyhayday/f8dc36cc7ec922bc1894f33eb2b0e928 PDFBuilder_install_font_family()要点: https : PDFBuilder_install_font_family()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM