DOMPDF在CodeIgniter中中文乱码需确认三件事:HTML声明UTF-8且无BOM干扰;lib/fonts/下存在对应.ufm字体缓存文件;配置必须通过Dompdf\Options对象设置defaultFont,而非修改已弃用的dompdf_config.inc.php。

DOMPDF在CodeIgniter中加载中文HTML就乱码?先确认三件事
乱码不是DOMPDF“不支持中文”,而是字体链断在了某一个环节。最常踩的坑是:HTML声明了UTF-8,PHP输出也是UTF-8,但DOMPDF根本没加载中文字体文件,它默认只认DejaVu Sans——这个字体虽然带基础CJK字符,但对简体中文(尤其是GB2312常用字、微软雅黑风格字形)覆盖极弱。
- 检查你的HTML模板开头是否包含:
<meta charset="utf-8">,且整个PHP输出未被header()或BOM干扰 - 确认DOMPDF实际加载的字体路径可读:
lib/fonts/目录下是否存在simkai.ufm或source-han-sans-sc.ufm这类缓存文件(不是原始.ttf) - 别直接改
dompdf_config.inc.php——新版DOMPDF(0.8+)已弃用该文件,所有配置必须走Dompdf\Options对象
CodeIgniter里怎么安全调用DOMPDF并传入视图数据
不要手写require_once一堆DOMPDF内部路径,也不要继承Dompdf类搞复杂封装。CI 3.x/4.x统一推荐的做法是:用Composer自动加载 + 独立服务类封装渲染逻辑。
- 安装命令必须带版本约束:
composer require dompdf/dompdf:^2.10(避免v3跳变导致CI 3.x兼容问题) - 在CI控制器中这样调用:
$options = new \Dompdf\Options(); $options->set('defaultFont', 'simkai'); $options->set('isRemoteEnabled', true); $options->set('chroot', FCPATH); // 关键:限制远程图片/资源只能从项目根目录下读取 $dompdf = new \Dompdf\Dompdf($options); $html = $this->load->view('report/invoice', $data, TRUE); $dompdf->loadHtml($html); $dompdf->render(); $dompdf->stream('invoice.pdf'); - 注意
$this->load->view(..., TRUE)的TRUE参数不能漏,否则返回null,DOMPDF会报loadHtml() expects parameter 1 to be string
为什么CSS里的font-family: "SimSun"不生效?字体映射必须手动注册
DOMPDF不会自动扫描系统字体,也不会解析CSS中的字体名别名。你写的"SimSun"它根本不认识——必须把TTF文件名、CSS中用的名字、内部字体族名三者在fonts/installed-fonts.json里显式绑定。
- 下载
simkai.ttf或SourceHanSansSC-Regular.otf,放进vendor/dompdf/dompdf/lib/fonts/ - 执行命令生成度量文件:
php vendor/dompdf/dompdf/load_font.php simkai /path/to/simkai.ttf(路径必须是绝对路径) - 生成后检查
lib/fonts/下是否多出simkai.ufm和simkai.ufm.cache;若没有,说明PHP没权限写入或字体文件损坏 - CSS中必须写成:
body { font-family: "simkai"; }——引号内名字要和load_font.php第一个参数完全一致,大小写敏感
分页、表格跨页断裂、签名区域空白?这些不是Bug是渲染机制
DOMPDF是基于CSS 2.1布局引擎的,它不支持break-inside: avoid等现代分页控制,也不理解Flex/Grid。很多“页面错位”本质是HTML结构没按DOMPDF的流式渲染逻辑组织。
- 强制分页用:
<div style="page-break-before: always;"></div>,而不是<hr style="page-break-after: always">(后者DOMPDF不识别) - 表格跨页断裂?给
<table>加style="page-break-inside: avoid;"无效,改用<thead><tr>...</tr></thead>包裹表头,并确保<tbody>每页内容高度可控 - 用户手写签名Canvas转PDF为空白?DOMPDF不执行JavaScript,也不能渲染Canvas位图。必须前端先用
canvas.toDataURL()转成data:image/png;base64,...再传给CI视图,作为<img src="...">嵌入
chroot路径、字体文件权限、ufm缓存生成失败这三件事,90%的“生成空白PDF”都卡在这里。



















