最靠谱的是mpdf/mpdf:PHP 7.4+用composer require mpdf/mpdf,7.2用^8.1;需手动注册NotoSansSC等中文字体,预处理HTML、外链图片、调大内存并RFC 5987编码中文文件名。

composer install 什么 PDF 库最靠谱
PHP 生态里真正能稳定跑 HTML 转 PDF 的,就两个选择:dompdf 和 mpdf。前者轻量、够用,后者功能全、兼容性好,但体积大一点。别碰 tcpdf——文档反人类,中文支持要手动配字体,出错时连错误信息都像谜语。
推荐直接装 mpdf/mpdf:它原生支持 CSS3、页眉页脚、中文断行,而且 Composer 安装后开箱即用。
-
composer require mpdf/mpdf(PHP 7.4+ 推荐) - 如果项目还卡在 PHP 7.2,用
composer require mpdf/mpdf:^8.1(v8.1 是最后一个支持 7.2 的版本) - 别加
--dev,PDF 生成是运行时行为,不是开发依赖
HTML 转 PDF 时中文显示成方块或空白
这不是插件问题,是字体没加载对。mpdf 默认不带中文字体,simsum.ttf 或 msyh.ttf 这类 Windows 字体在 Linux 服务器上根本不存在。
- 下载一个开源中文字体(比如
noto-sans-sc),放项目里:./fonts/NotoSansSC-Regular.ttf - 初始化时显式注册:
$mpdf = new \Mpdf\Mpdf([ 'fontDir' => [__DIR__ . '/fonts'], 'fontData' => [ 'notosanssc' => [ 'R' => 'NotoSansSC-Regular.ttf', ] ], 'default_font' => 'notosanssc' ]); - HTML 中别写
font-family: "Microsoft YaHei"—— 服务器没这个字体,写了也白写
生成 PDF 时内存溢出或超时
大 HTML(尤其含大量 inline CSS/JS 或 base64 图片)会让 mPDF 在解析阶段吃光内存。不是配置问题,是它本身设计如此。
立即学习“前端免费学习笔记(深入)”;
- 用
ob_start()+ob_get_clean()预处理 HTML,删掉注释、空格、无用 script 标签 - 把图片转成外链(
<img src="https://xxx.com/a.png">),别用data:image/png;base64,... - 调大限制前先试这个:
$mpdf->setAutoTopMargin = 'stretch'; $mpdf->setAutoBottomMargin = 'stretch';——能避免因分页失败反复重排导致的卡死 - CLI 下执行记得加
-d memory_limit=-1,Web 环境则要在php.ini改memory_limit,光改ini_set()没用
怎么让生成的 PDF 文件名带中文、不乱码
HTTP 响应头里的 Content-Disposition 对中文支持极差,不同浏览器解码逻辑还不一样。
- 别用
iconv('UTF-8', 'GB2312', $name)这种老办法,IE 都不认 - 用 RFC 5987 格式编码:
$filename = '订单_202405.pdf'; $header = 'Content-Disposition: inline; filename*=UTF-8\'\'' . rawurlencode($filename); header($header);
- 如果必须用
attachment(强制下载),注意 Chrome 和 Safari 对inline更友好,调试时先用inline看内容是否正常
字体、路径、编码这三块不抠细,PDF 不是生成不出来,是生成出来没法用。特别是生产环境换服务器后,字体路径和内存限制最容易被忽略。










