Dompdf кодировка символов UTF-8
Я пытаюсь создать pdf с правильными символами, но есть ли?? символы.
Я создал тестовый php файл, где Im пытался скрыть лучшее решение. Если Im открыть в браузере 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>
Что я делаю неправильно? Я попробовал много вариантов, которые я нашел:( Любая идея?
Ответы
Ответ 1
Вы снова должны прочитать Unicode How-to. Основная проблема заключается в том, что вы не указываете шрифт, который поддерживает ваши символы. Похоже, вы прочитали инструкцию, потому что вы используете пример шрифта из этого документа. Однако этот пример не предназначен для применения в глобальном масштабе к любому документу, dompdf не включает в себя firefly (шрифт китайского символа) или Verdana по умолчанию.
Если вы не укажете шрифт, то dompdf возвращается к одному из основных шрифтов (Helvetica, Times Roman, Courier), который поддерживает только кодировку ANSI Windows. Поэтому всегда будьте уверены, чтобы стиль вашего текста был шрифтом, который поддерживает кодировку 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>
Ответ 2
У меня есть символы 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" />
Теперь все специальные символы работают "ľ š č ť ž ý á í é"
Ответ 3
Добавить только
<style>
*{ font-family: DejaVu Sans !important;}
</style>
до </head>
Он работает для меня.
Ответ 4
utf8_decode() помог мне с некоторыми немецкими переводами, такими как ä и ü.
echo utf8_decode('X Ponuka číslo € černý Češký <br>');
Ответ 5
Ничто из упомянутых ответов не помогло мне. После нескольких часов борьбы я переключился на niklasravnsborg/laravel-pdf имеет почти то же синтаксис и использование, и все работает нормально.
Ответ 6
Dompdf не поддерживает резервные шрифты, поэтому вы не можете использовать свой любимый шрифт, если он не поддерживает ваши символы, и вы также не можете установить другой шрифт в качестве резервного шрифта для таких символов, как droid sans fallback
.
Вместо этого вы можете воспользоваться преимуществами диапазонов сценариев регулярных выражений Unicode: 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 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
Ответ 7
Если вы не против иметь только одну кодировку, вы можете изменить каждую кодировку в 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'
)
)
?>
Я знаю, что это не лучший способ, но это экономит много времени
Ответ 8
Китайские иероглифы иногда вызывают проблемы. Важно иметь хороший шрифт, вот список, который вы можете скачать.
Я выбрал первое имя "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 - [email protected]#$%^&* -=- € <br><br>
<br>
Hebrew (iw)<br><br>
דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה<br>
<br>
</body>
</html>
EOT;
PS. есть небольшой шанс, что вам может понадобиться этот набор:
ini_set("allow_url_fopen", true);
Ответ 9
У меня была та же проблема, и я решил ее очень просто. Просто импортируйте шрифты Google с необходимым языковым подмножеством в ваш файл CSS, который используется при создании HTML. Укажите utf-8 в вашем HTML файле, и он работает...
@import url('https://fonts.googleapis.com/css?family=Roboto:400,700&subset=latin-ext');
body {font-family: 'Roboto', sans-serif;}
Ответ 10
У меня есть проблемы, как вы, и я решил таким образом
https://blog.kongnir.com/2017/11/28/laravel-dompdf-custom-font-to-support-simplified-chinese/
Ответ 11
У меня была аналогичная проблема и в итоге я использовал 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');
?>