Я пытаюсь создать pdf с правильными символами, но есть ли?? символы. Я создал тестовый php-файл, где Im пытался скрыть лучшее решение. Если я открываю в браузере 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>
Что я делаю неправильно? Я попробовал много вариантов, которые нашел 🙁 Любая идея?
Вы должны снова прочитать инструкцию Unicode . Основная проблема заключается в том, что вы не указываете шрифт, который поддерживает ваши символы. Похоже, вы прочитали инструкцию, потому что вы используете пример шрифта из этого документа. Однако этот пример не предназначен для применения в глобальном масштабе к любому документу, 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>
У меня есть символы UTF-8, работающие с этой комбинацией. Прежде чем передать html в DOMpdf, сделайте кодировку скрытой:
$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
Использовать шрифт DejaVu в вашем css
*{ font-family: DejaVu Sans; font-size: 12px;}
Убедитесь, что вы установили кодировку utf-8 в <head>
HTML <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Теперь все специальные персонажи работают «ľ š č ť ž ý á í é»,
Добавить только
<style> *{ font-family: DejaVu Sans !important;} </style>
перед </head>
Это работает для меня.
Ничто из упомянутых ответов не помогло мне. После нескольких часов борьбы я переключился на niklasravnsborg / laravel-pdf, имеет почти точно такой же синтаксис и использование, и все работает отлично.
Если вы не против иметь только одну кодировку, вы можете изменить каждую кодировку в 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' ) ) ?>
Я знаю, что это не лучший способ, но это экономит много времени
У меня была аналогичная проблема, и я закончил использовать tcpdf. Надеюсь, это может быть полезно. http://www.tcpdf.org/
Проблема заключалась в использовании шрифта, который я использовал. Мне удалось получить правильный результат, используя этот шрифт «freeserif». Возможно, можно получить тот же результат, используя этот шрифт с dompdf .
$pdf->SetFont('freeserif', '', 12);
Вот пример, который я использовал. Пример 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'); ?>