dompdf转换HTML为PDF中文显示方块的问题排查与解决
解决dompdf转换含中文HTML为PDF时中文显示方块的问题
问题描述
使用dompdf 0.8.0版本将包含中文的HTML转换为PDF时,网页端中文显示正常,但转换后的PDF中中文仅显示为方块(□)。尝试过设置默认字体、更换楷体粗体、NotoSansCJKtc-Regular等字体,问题反复出现。
原PHP代码
$html = $this->load->view('view_view', $data, TRUE); //echo $html; require("assets/dompdf1/autoload.inc.php"); define("DOMPDF_UNICODE_ENABLED", true); $options = new Options(); $options->set('defaultFont', 'DejaVu Sans'); $dompdf = new Dompdf($options); $html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'); $dompdf->loadHtml($html); // (Optional) Setup the paper size and orientation $dompdf->setPaper('A4', 'landscape'); // Render the HTML as PDF $dompdf->render(); // Output the generated PDF to Browser $dompdf->stream("View.pdf", array("Attachment" => false)); exit(0);
原HTML字体设置
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <style> @page { margin-top: 0.3cm; margin-bottom: 0cm; } @font-face { font-family: 'NotoSansCJK'; src: url('assets/dompdf1/lib/fonts/NotoSansCJKtc-Regular.ttf') format('truetype'); } body { font-family: 'NotoSansCJK', DejaVu Sans, sans-serif; } </style>
解决方法
结合相关技术问题的解决方案,通过以下步骤修复:
修正字体文件路径
dompdf解析路径时以PHP脚本执行位置为基准,而非HTML文件位置。建议使用绝对路径指定字体文件,确保dompdf能正确读取:@font-face { font-family: 'NotoSansCJK'; src: url('/你的项目根路径/assets/dompdf1/lib/fonts/NotoSansCJKtc-Regular.ttf') format('truetype'); font-weight: normal; font-style: normal; }移除不必要的编码转换
dompdf 0.8.x已原生支持UTF-8编码的HTML,mb_convert_encoding转换为HTML-ENTITIES可能破坏字体识别逻辑,需注释或删除该行:// $html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');将默认字体设置为中文字体
将dompdf的默认字体改为引入的中文字体,确保所有文本都使用支持中文的字体渲染:$options->set('defaultFont', 'NotoSansCJK');
修改后的完整代码示例
PHP代码
$html = $this->load->view('view_view', $data, TRUE); require("assets/dompdf1/autoload.inc.php"); define("DOMPDF_UNICODE_ENABLED", true); $options = new Options(); // 设置默认字体为中文字体 $options->set('defaultFont', 'NotoSansCJK'); $dompdf = new Dompdf($options); // 移除编码转换 $dompdf->loadHtml($html); // 设置纸张规格 $dompdf->setPaper('A4', 'landscape'); // 渲染PDF $dompdf->render(); // 输出到浏览器 $dompdf->stream("View.pdf", array("Attachment" => false)); exit(0);
HTML样式
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <style> @page { margin-top: 0.3cm; margin-bottom: 0cm; } @font-face { font-family: 'NotoSansCJK'; src: url('/你的项目根路径/assets/dompdf1/lib/fonts/NotoSansCJKtc-Regular.ttf') format('truetype'); font-weight: normal; font-style: normal; } body { font-family: 'NotoSansCJK', DejaVu Sans, sans-serif; } </style>
内容的提问来源于stack exchange,提问作者namarahasia
相关产品推荐
相关产品推荐

