核心问题是PDF引擎中文字体未正确配置:mpdf需显式注册simkai.ttf等字体文件并指定fontDir和fontdata映射,禁用flex/fixed等CSS属性,页眉页脚用标签,表格边框须用border="1",CSS须内联或嵌入,不可引用Web路径。

Yii框架生成PDF内容乱码,核心问题不在Yii本身,而在于底层PDF引擎(如mpdf、dompdf、FPDF)对中文字符和字体的支持不足。解决关键不是换框架,而是配字体、调配置、控HTML结构。
mpdf中文字体必须显式注册
mpdf默认不带中文字体,即使HTML里写了font-family: "SimSun",也会显示方块。必须做两件事:
- 把中文字体文件(如
simkai.ttf或msyh.ttf)复制到项目@app/fonts/目录下 - 在mpdf配置中明确指定路径和映射:
'fontDir' => '@app/fonts','fontdata' => ['kai' => ['R' => 'simkai.ttf']] - 生成PDF时用
$mpdf->SetFont('kai'),而不是系统字体名
避免CSS导致渲染失效
mpdf对现代CSS支持有限,很多写法会直接忽略或错位:
- 禁用
flex、float、position: fixed等属性 - 页眉页脚必须用
和标签,不能靠@page伪类 - 表格边框要写
border="1"或style="border: 1px solid #000;",仅靠border-collapse不生效 - CSS尽量内联或放在
标签里,不要通过引用——mpdf读不到Web路径
yii2-export扩展要用对配置
用yii2-export省事,但容易踩坑:
- 安装后必须手动配置
exportConfig启用mpdf:'pdf' => ['class' => 'kartik\export\lib\MpdfExport'] - 别只装扩展不配字体,否则导出全是方块
- 大数据量(如超5000行)导出易内存溢出,需绕过ExportMenu,改用手动分页查库+循环拼HTML喂给mpdf实例
dompdf和FPDF的补充处理
若用dompdf,需在CSS中显式声明字体:@font-face { font-family: "SimHei"; src: url("fonts/simhei.ttf"); }
并在元素上写font-family: "SimHei"。
若用FPDF,必须先用ttf2pt1工具转换TTF字体为AFM+PHP格式,再通过MakeFont()生成simhei.php和simhei.z,最后require('chinese.php')并调用AddGBFont()。











