You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

解决方法

结合相关技术问题的解决方案,通过以下步骤修复:

  1. 修正字体文件路径
    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;
    }
    
  2. 移除不必要的编码转换
    dompdf 0.8.x已原生支持UTF-8编码的HTML,mb_convert_encoding转换为HTML-ENTITIES可能破坏字体识别逻辑,需注释或删除该行:

    // $html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
    
  3. 将默认字体设置为中文字体
    将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 03:32:50