使用FPDF写入中文字体失败的技术求助
解决FPDF/FPDI写入中文显示异常的问题
核心原因
原生FPDF默认仅支持ISO-8859-1编码,对中文UTF-8字符兼容性差;同时直接使用系统字体文件而非FPDF专用字体格式,会导致字符无法正确渲染。
解决步骤
1. 安装支持UTF-8的FPDF分支
通过Composer安装兼容UTF-8的FPDI扩展包,替代原生FPDF:
composer require setasign/fpdi-fpdf-utf8
2. 生成FPDF兼容的中文字体文件
FPDF无法直接识别系统TTF字体,需将TTF文件转换为FPDF专用的.php和.z格式:
- 下载目标中文字体的TTF文件(如微软雅黑
msyh.ttf、宋体simsun.ttf) - 下载FPDF官方的
makefont.php工具,将TTF文件与该工具放在同一目录 - 访问
makefont.php页面,选择TTF文件,编码选择UTF-8,点击生成得到对应字体文件 - 将生成的
.php和.z文件放入项目的fonts目录(无则新建)
3. 修改代码实现正确渲染
替换原有代码,确保字体引入、编码设置正确:
<?php use setasign\Fpdi\Fpdi; require_once('vendor/autoload.php'); $pdf = new Fpdi(); $pdf->AddPage(); $pdf->setSourceFile("src/registration-form.pdf"); $tplId = $pdf->importPage(1); $pdf->useTemplate($tplId, 10, 10, 200); // 引入生成好的中文字体,第四个参数true指定UTF-8编码 $pdf->AddFont('msyh', '', __DIR__ . '/fonts/msyh.php', true); $pdf->SetFont('msyh', '', 10); $pdf->SetTextColor(255, 0, 0); $pdf->SetXY(50, 59); // 确保字符串为UTF-8编码(PHP文件需保存为UTF-8无BOM格式) $pdf->Write(0, '林夕夕'); $pdf->Output();
关键注意事项
- PHP文件必须保存为UTF-8无BOM格式,避免字符串编码混乱
- 优先选择常用中文字体(微软雅黑、宋体等),避免使用兼容性差的"通用编码字体"
- 若字体文件未放在FPDF默认字体目录,需在
AddFont中指定完整路径
内容的提问来源于stack exchange,提问作者Ahsan Zameer
相关产品推荐
相关产品推荐

