mpdf和tcpdf生成中文pdf需正确嵌入字体:mpdf用msyi.ttf等并显式注册,tcpdf需用工具转换字体;html表格须用语义化标签,避免css布局;大报表应分段写入防内存溢出,图片需base64内嵌,输出后须校验文件是否存在且可读。

直接用 TCPDF 或 mPDF 生成 PDF 报表是可行的,但两者在中文支持、HTML 渲染能力和易用性上差异明显——mPDF 对 UTF-8 中文更友好,TCPDF 更轻量但需手动处理字体嵌入。
中文乱码?先确认字体是否正确加载
默认情况下两个库都不自带中文字体,直接输出中文会变成方块或空白。关键不是“有没有设置字体”,而是“字体文件路径是否可读 + 字体是否真正注册成功”。
-
mPDF推荐用msyi.ttf(微软雅黑)或simkai.ttf(楷体),放在项目目录如./fonts/下,并在初始化时显式指定:$mpdf = new \Mpdf\Mpdf(['fontDir' => __DIR__ . '/fonts/', 'fontdata' => ['chinese' => ['R' => 'msyi.ttf']]));
-
TCPDF必须用addTTFfont()转换字体并生成 PHP 字体描述文件,不能直接传 .ttf 路径;转换命令为:php tcpdf/tools/tcpdf_addfont.php -b -f 0 -t TrueTypeUnicode -q ./fonts/simhei.ttf
,生成的simhei.php和simhei.z必须放在tcpdf/fonts/目录下,再调用setFont('simhei') - 常见错误:字体路径写错、PHP 进程无读取权限、字体名大小写不一致(如
SimHei≠simhei)
HTML 表格渲染错位?别依赖纯 CSS 布局
mPDF 支持大部分 CSS2.1 和部分 CSS3,但 flex、grid、position: fixed 基本无效;TCPDF 的 writeHTML() 更倾向语义化标签,对 float、margin 解析不稳定。
- 表格必须用
<table> + <code><tr> + <code><td>,避免用 <code>div模拟表格 - 单元格宽度优先用
width属性(如<td width="150">),而非 <code>style="width:150px" - 边框统一用
border="1"或内联style="border:1px solid #000",CSS 类中的border可能被忽略 - 长文本自动换行需加
style="word-wrap: break-word; overflow-wrap: break-word",否则可能撑破页面 - 禁用
mPDF的debug模式(默认关闭,但检查构造参数是否含'debug' => true) - 用
$mpdf->WriteHTML()分段写入,每 200 行左右调用一次,避免一次性拼接超长 HTML 字符串 -
TCPDF中避免使用writeHTMLCell()处理整页内容,改用writeHTML()+ 手动分页:$pdf->AddPage(); $pdf->writeHTML($html_chunk);
- 图片务必压缩并转为 base64 内嵌(
mPDF支持data:image/png;base64,...),外链图片在离线环境或权限受限时会失败
导出大报表内存溢出?控制内容分片与缓存
生成含千行数据的 PDF 容易触发 Allowed memory size exhausted,尤其当 HTML 中混有大量内联样式或未压缩的图片时。
最常被跳过的一步:生成后用 file_exists() 和 is_readable() 检查输出文件是否真实落地,而不是只看 Output() 是否没报错——PDF 写入失败时可能静默返回空内容。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











