不需要额外 php 扩展,但 dompdf 依赖 mbstring(必需)和 gd(仅图片/字体渲染时需);php ≥ 8.1 用 v3.x,否则需指定 ^2.11;禁用外部 css、闭合标签、内联样式、设置中文字体、避免 flex/grid;调试先 output() 存文件,排查 bom、提前输出或响应头问题。

Composer 安装 dompdf 是否需要额外扩展?
不需要额外 PHP 扩展,但 dompdf 依赖 mbstring 和 gd(后者仅在处理图片/字体渲染时才真正用到)。如果 phpinfo() 中看不到 mbstring,composer require dompdf/dompdf 会成功,但运行时调用 Dompdf::render() 可能直接报 Fatal error: Call to undefined function mb_strlen()。确认方式很简单:
php -m | grep mbstring。没启用就去
php.ini 解开 ;extension=mbstring 这行注释,重启 PHP 服务。
安装命令与版本选择要注意什么?
dompdf/dompdf 的主干分支已从 v2.x 升级到 v3.x(截至 2024 年),新版本强制要求 PHP ≥ 8.1,且移除了对旧版 fontlib 的兼容逻辑。如果你项目还在用 PHP 7.4 或 8.0,必须显式指定旧版本:
composer require dompdf/dompdf:^2.11。否则 Composer 会默认拉取
v3.0+,导致 Class 'Dompdf\Dompdf' not found 或命名空间解析失败。顺带一提,barryvdh/laravel-dompdf 是 Laravel 封装包,非 Laravel 项目别装它——它会额外引入框架相关依赖,纯 PHP 项目直接用原生 dompdf/dompdf 更轻量。
加载 HTML 后生成 PDF 时常见崩溃点
最常踩的坑不是语法错,而是 DOM 解析阶段就挂掉:比如 HTML 里含未闭合的 <table>、嵌套错误的 <code><div>、或用了 <code>flex/grid 布局(dompdf 对现代 CSS 支持极弱)。遇到空白 PDF 或 Allowed memory size exhausted,先用 file_get_contents() 把 HTML 存成临时文件,再用浏览器打开看是否能正常渲染。实操建议:
- 禁用所有外部 CSS,内联关键样式(
<style>body{font-size:12px}</style>) - 避免
background-image,改用 base64 内联小图 - 表格务必写全
<thead></thead> <tbody>,<code><tr> 不能直接挂在 <code><table> 下<li>中文需显式设置字体:<code>$dompdf->set_option('defaultFont', 'sans-serif');,并确保系统有对应字体或使用dompdf-fonts包
生成 PDF 后怎么调试输出问题?
别急着调 stream() 或 download(),先用 output() 获取原始二进制数据,再存为文件检查内容:
$pdf = $dompdf->output(); file_put_contents('debug.pdf', $pdf); 如果文件打不开,用命令行查 PDF 结构:pdfinfo debug.pdf。若提示
Not a PDF or corrupted,大概率是 HTML 中混入了 PHP 输出(比如 echo、var_dump)、BOM 头、或响应头已被发送。检查点:- PHP 文件开头有没有空格或 UTF-8 BOM(用 VS Code 右下角编码显示确认)
- 是否在
require 'vendor/autoload.php'前有echo或 HTML 输出 -
Dompdf实例化后,不要在loadHtml()前调用任何可能输出内容的函数











