PHP Dompdf中文字符显示异常的解决方案

PHP Dompdf中文字符显示异常的解决方案
最新回答
折磨已成瘾゛

2023-12-11 06:29:01

解决PHP Dompdf中文字符显示异常的问题,核心在于正确配置中文字体支持。以下是系统化的解决方案:

1. 字体文件准备
  • 下载中文字体:推荐使用开源字体(避免版权问题)

    思源黑体/宋体(Google Noto字体)

    文泉驿微米黑(适合Linux环境)

    微软雅黑(需确保使用权限)

  • 存放路径:将字体文件(如simsun.ttc或NotoSansSC-Regular.otf)放入项目目录的fonts/文件夹
2. 代码配置(关键步骤)require_once 'dompdf/autoload.inc.php';use DompdfDompdf;// 初始化配置$dompdf = new Dompdf();$dompdf->set_option('isHtml5ParserEnabled', true);$dompdf->set_option('isFontSubsettingEnabled', true); // 启用字体子集化// 字体目录设置(两种方式任选其一)// 方式1:直接设置字体目录$dompdf->set_option('fontDir', __DIR__.'/fonts/');// 方式2:通过set_option设置(Dompdf 2.0+推荐)$dompdf->setOptions([ 'fontDir' => __DIR__.'/fonts/', 'fontCache' => __DIR__.'/fonts/cache/', // 建议设置字体缓存目录 'defaultFont' => 'Noto Sans SC' // 设置默认字体]);// 注册字体(重要!)$fontMetrics = $dompdf->getFontMetrics();$fontMetrics->registerFont([ 'family' => 'Noto Sans SC', 'weight' => 'normal', 'style' => 'normal', 'source' => __DIR__.'/fonts/NotoSansSC-Regular.otf']);3. HTML模板优化<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <style> @font-face { font-family: 'Noto Sans SC'; src: url('fonts/NotoSansSC-Regular.otf') format('opentype'); } body { font-family: 'Noto Sans SC', sans-serif; font-size: 12pt; } </style></head><body> <h1>中文测试标题</h1> <p>这是一段包含中文的测试文本,用于验证PDF生成效果。</p></body></html>4. 常见问题排查
  • 乱码问题

    检查HTML头部是否声明UTF-8编码

    确认字体文件是否完整(可通过字体预览工具验证)

    使用file -i 字体文件命令检查文件编码

  • 字体不生效

    确保字体目录有写入权限(缓存目录需755权限)

    清除Dompdf字体缓存(删除font_cache目录)

    检查字体名称是否匹配(区分大小写)

  • 性能优化

    对生产环境使用isFontSubsettingEnabled减少PDF体积

    预加载常用字体避免重复注册

5. 高级配置(Dompdf 2.0+)$options = new DompdfOptions();$options->set([ 'fontDir' => '/path/to/fonts', 'fontCache' => '/path/to/cache', 'tempDir' => '/path/to/temp', 'defaultFont' => 'Noto Sans SC', 'isRemoteEnabled' => true, // 如需加载远程资源 'chroot' => realpath(__DIR__) // 安全限制]);$dompdf = new Dompdf($options);6. 替代方案(当上述方法无效时)
  • 使用<link>引入网络字体(需启用远程资源):<link href="
    https://fonts.googleapis.com/css2?family=Noto+Sans+SC&display=swap"
    rel="stylesheet">
  • 通过CSS指定备用字体栈:body { font-family: 'Noto Sans SC', 'Microsoft YaHei', 'SimSun', sans-serif; }
注意事项
  1. 字体文件路径需使用绝对路径或相对于执行脚本的路径
  2. 生产环境建议使用.ttf/.otf格式(比.ttc更稳定)
  3. 中文PDF生成建议字体大小≥10pt以保证清晰度
  4. 复杂排版可考虑先生成HTML预览,确认无误后再转PDF

通过以上步骤,99%的中文显示问题均可解决。如遇特殊情况,建议检查服务器PHP环境是否完整(需包含mbstring、iconv等扩展)。