选dompdf还是snappy关键看需求:简单轻量免部署用dompdf;高保真、需js支持、中文排版稳、生成快则选snappy。dompdf纯php开箱即用但css/js支持弱,snappy依赖wkhtmltopdf但渲染精准度高。

选 Dompdf 还是 Snappy,关键看项目要什么:简单、轻量、免部署就用 Dompdf;要保真、支持 JS、中文排版稳、生成快,就上 Snappy。
Dompdf:纯 PHP,开箱即用但限制多
Dompdf 不依赖系统命令,装完就能跑,适合内部报表、结构简单的发票或通知单。但它对 CSS 支持较弱——Flexbox、Grid、@media 查询基本不认,JavaScript 完全不执行,复杂表格容易撑破页面甚至崩溃。
- 中文必须手动配字体:把 .ttf 文件(如 Noto Sans CJK SC)放进 storage/fonts/,再通过
dompdf.php配置fontDir和defaultFont - 禁用
@font-face,CSS 中直接写font-family: "Noto Sans CJK SC", sans-serif - 分页靠
page-break-before: always或page-break-after,break-inside: avoid在表格里才有效 - 模板里别引用外部 CSS 文件,全部用内联 style 或
<style></style>标签写死
Snappy:渲染准、功能强,但得搭好环境
Snappy 本质是调用 wkhtmltopdf 命令行工具,用的是 WebKit 引擎,效果几乎和 Chrome 打印一模一样。支持 JavaScript 动态渲染页眉页脚、CSS3 动画、响应式布局,生成速度快、文件体积小,中文字体只要系统有或显式指定路径就能正常显示。
- Linux 上推荐用
apt install wkhtmltopdf(Ubuntu/Debian),别用 npm 装的轻量版,缺库会报QSslSocket错误 - 确认权限:PHP 进程能读取临时 Blade 编译文件(
storage/framework/views/),且 wkhtmltopdf 二进制可执行 - 调试加两句:
->setOption('quiet', false)->setOption('log-level', 3),错误会写进 Laravel 日志 - 页眉页脚建议用 CSS Paged Media:
@page { @top-center { content: "第 " counter(page) " 页"; } },开启 JS 选项才能让动态内容生效
中文字体与乱码:两个引擎都要动手
Dompdf 和 Snappy 默认都不带中文字体,乱码不是配置错,是根本没字库。Dompdf 必须把字体文件复制到 vendor/dompdf/dompdf/lib/fonts/ 并注册;Snappy 则更灵活——可让 wkhtmltopdf 读系统字体(如 Ubuntu 装 fonts-wqy-zenhei),也可在 PDF 模板里用 @font-face 指向 public 下的 .ttf 文件(它支持)。
- Linux 一键装中文字体:
sudo apt install fonts-wqy-zenhei ttf-wqy-zenhei && fc-cache -fv - Blade 模板中避免用
<h1></h1>套文本,优先用<div class="title"> + 内联样式控制字体大小和行高 <li>字体文件路径统一用 <code>public_path('fonts/msyh.ttf'),确保 wkhtmltopdf 能访问
实际怎么选:看这三点
如果项目只需要导出静态数据表、格式固定、服务器不能装额外软件,Dompdf 省心;如果要做合同签署页、带水印的报表、需要 JS 计算页码或动态加载 logo,Snappy 是唯一靠谱选择。多数生产系统倾向 Snappy——它生成的 PDF 更接近用户所见,打印时少翻车,长期维护成本反而更低。











