最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何在 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,适用于报表、合同、多语言文档等生产场景。
相关文章
- 鬼谷八荒逆天改命会覆盖吗 06-14
- 妄想山海植物分布图 06-14
- 栖云异梦第三章攻略 06-14
- 奥比岛手游烟花盛会活动要怎样玩 06-14
- 米坛社区官网入口-米坛社区app网页版官网登录入口v2.29.28 06-14
- iwara官网入口下载-iwara下载免费官网入口v4.87.8.4.5 06-14