一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何在 Dompdf 中正确显示中文文本:支持 UTF-8 与中文字体

时间:2026-06-06 10:26:52 编辑:袖梨 来源:一聚教程网

dompdf 默认不支持中文,需显式配置中文字体路径、启用 unicode、设置兼容字体(如 notosanscjk),并确保 html 编码与字体文件加载一致,否则中文会显示为方块。

dompdf 默认不支持中文,需显式配置中文字体路径、启用 unicode、设置兼容字体(如 notosanscjk),并确保 html 编码与字体文件加载一致,否则中文会显示为方块。

在使用 Dompdf(v0.8.0+)生成含中文内容的 PDF 时,常见问题表现为:HTML 页面中中文正常渲染,但导出 PDF 后全部变为“□”方块。这并非编码错误,而是 Dompdf 缺乏内置中文字体支持,且默认字体(如 DejaVu Sans)虽支持部分 Unicode,但不包含汉字字形

✅ 正确解决方案(四步到位)

1. 准备支持中文的 TrueType 字体(TTF)

推荐使用 Google 开源字体 Noto Sans CJK(含简/繁/日/韩),例如:

  • NotoSansCJKtc-Regular.ttf(繁体中文)
  • NotoSansCJKsc-Regular.ttf(简体中文)

将字体文件统一存放于项目目录(如 assets/fonts/),确保路径可被 PHP 读取且无权限限制

2. 显式配置字体目录与默认字体

require 'vendor/autoload.php'; // 或你的 dompdf autoload 路径// ⚠️ 关键:定义字体存储目录(必须是绝对路径!)define('DOMPDF_FONT_DIR', __DIR__ . '/assets/fonts/');$options = new Options();$options->set('fontDir', DOMPDF_FONT_DIR);     // 指定字体搜索路径$options->set('defaultFont', 'NotoSansCJKtc-Regular'); // 设置默认中文字体(不含 .ttf 后缀)$options->set('isPhpEnabled', false);           // 生产环境建议关闭 PHP 执行(安全起见)$options->set('isRemoteEnabled', true);        // 如需加载远程 CSS/字体资源(谨慎开启)$dompdf = new Dompdf($options);

? 注意:defaultFont 值应为字体的 PostScript 名称或文件名前缀(非 CSS font-family 名)。可通过 ttx 工具或字体查看器确认;若不确定,直接使用 NotoSansCJKtc-Regular(对应 NotoSansCJKtc-Regular.ttf)通常有效。

3. HTML 内容编码与结构规范

  • 确保 HTML 声明 UTF-8:
    <meta charset="UTF-8">
  • 无需手动 @font-face(Dompdf v0.8+ 不解析 CSS @font-face 加载外部字体);
  • 可保留 font-family 声明用于 fallback,但实际生效的是 defaultFont 配置:
    body {  font-family: 'NotoSansCJKtc-Regular', sans-serif;  font-size: 14px;}

4. 安全编码处理(防乱码)

$html = $this->load->view('view_view', $data, TRUE);// 统一转为 UTF-8 实体(兼容旧版 Dompdf 对 UTF-8 处理的缺陷)$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');$dompdf->loadHtml($html);$dompdf->setPaper('A4', 'landscape');$dompdf->render();$dompdf->stream("Report.pdf", ['Attachment' => false]);

⚠️ 常见陷阱与排查清单

  • ❌ 错误:DOMPDF_FONT_DIR 为相对路径 → 导致字体无法加载 → 全部显示方块
    ✅ 修复:始终使用 __DIR__ 或 realpath() 构建绝对路径
  • ❌ 错误:字体文件名与 defaultFont 值不匹配(如写成 'NotoSansCJKtc' 但文件是 'NotoSansCJKtc-Regular.ttf')
    ✅ 修复:保持名称严格一致(推荐用完整前缀)。
  • ❌ 错误:未调用 $options->set('fontDir', ...) → Dompdf 忽略自定义字体目录
    ✅ 修复:fontDir 必须显式设置,不可依赖 DOMPDF_FONT_DIR 宏(后者仅作常量,v0.8+ 已不自动读取)。
  • ❌ 错误:服务器禁用 allow_url_fopen 且启用了 isRemoteEnabled → 字体加载失败
    ✅ 修复:关闭远程加载,本地托管字体。

✅ 验证是否成功

首次运行后,Dompdf 会自动将 TTF 文件解析为 .ufm 和 .php 字体缓存(位于 DOMPDF_FONT_DIR 下)。检查该目录是否生成了类似 notosanscjktc-regular.ufm 的文件 —— 若存在,说明字体注册成功;若仍为方块,请检查 PHP 错误日志,确认是否有 file_get_contents() 权限或路径错误。

通过以上配置,Dompdf 即可稳定输出清晰、可选中的中文 PDF,适用于报表、合同、多语言文档等生产场景。

热门栏目