dompdf 是 php 中最易上手的 pdf 生成方案,适合 html 页面导出;需确保 utf-8 编码、显式声明中文字体与本地绝对路径资源、禁用现代 css 特性、合理调优内存与超时配置。

Dompdf 是目前 PHP 生成 PDF 最容易上手、调试成本最低的选择,尤其适合已有 HTML 页面需要导出的场景。别一上来就啃 tcpdf 的文档或折腾 mpdf 的字体配置——90% 的日常需求(如报表、发票、通知单),用 Dompdf 加一点 HTML 降级就能跑通。
Dompdf 渲染失败时先查这三件事
常见现象是输出空白 PDF、中文显示为方块、图片不加载、或者直接报内存耗尽。
-
loadHtml()传入的 HTML 字符串必须包含<meta charset="UTF-8">,且整个字符串本身是 UTF-8 编码(不能是 GBK) - 所有 CSS 中用到的字体,必须通过
@font-face显式声明,且src: url(...)必须是服务器上的绝对路径,例如/var/www/fonts/simhei.ttf;HTTP URL 或相对路径一律无效 - 图片路径同理:只认本地绝对路径,
https://地址会被忽略;若必须用远程图,得先用file_get_contents()下载并保存为临时文件再引用
HTML 和 CSS 必须“降级”写
Dompdf 不支持现代前端那套东西,它本质是个简化版 HTML/CSS 渲染器,不是浏览器。
- 禁用
flex、grid、position: sticky、@media print—— 这些要么被忽略,要么导致布局错乱 - 替代方案:用
<table> 控制对齐和宽度,或用 <code>display: inline-block+ 固定width模拟栅格 - 中文段落必须显式设置
style="font-family: simhei;"在最外层容器上,否则默认字体不支持中文 - 避免嵌套过深的
<div>,DOM 层级超过 12 层可能触发解析异常 <h3>内存和超时问题怎么调</h3> <p>不是代码写错了,而是默认配置扛不住真实业务数据量。</p> <ul> <li>PDF 内容含大表格或高清图时,<code>Allowed memory size exhausted很常见;在脚本开头加ini_set('memory_limit', '256M');,线上环境建议设为512M - 生成耗时长(比如渲染 20 页带图表的报表),容易触发
max_execution_time超时;加set_time_limit(300);(5 分钟)更稳妥 - 启用远程资源加载需显式配置:
$dompdf = new Dompdf(['enable_remote' => true]);,否则img[src]即使是本地路径也可能被拦截 - 调试阶段可先用
file_put_contents('/tmp/debug.html', $html);把最终传给loadHtml()的 HTML 保存下来,用浏览器打开确认样式是否正常——这是最快定位问题是出在 HTML 还是Dompdf渲染上的方法











