本文目录导读:

是的,Laravel 中生成 PDF 确实经常使用 Snappy(特别是 barryvdh/laravel-snappy 包),它底层调用 wkhtmltopdf 工具,是目前最流行的 Laravel PDF 方案之一。
根据你的需求(中文支持、性能、或 Laravel 版本),还有一些其他选择,以下是详细对比和使用建议:
为什么选择 Snappy?
优点:
- ✅ 成熟稳定:Laravel 生态中历史最久的 PDF 包之一,社区支持强
- ✅ HTML 转 PDF 质量高:基于 WebKit 引擎,CSS 支持好(比 DomPDF 强)
- ✅ 支持页眉页脚、目录、TOC:通过
wkhtmltopdf原生支持 - ✅ 支持远程图片:无需特殊处理
缺点:
- ❌ 需要安装系统依赖:必须安装
wkhtmltopdf二进制文件(服务器端) - ❌ 中文字体问题:需要额外配置中文字体(否则中文显示空白/乱码)
- ❌ 体积较大:wkhtmltopdf 约 50MB+
- ❌ 新项目已停止更新(2023年归档),但依然可用
基本使用示例
安装
composer require barryvdh/laravel-snappy
配置(config/snappy.php)
'binary' => env('WKHTMLTOPDF_BINARY', '/usr/local/bin/wkhtmltopdf'),
'options' => [
'enable-javascript' => true,
'no-stop-slow-scripts' => true,
'javascript-delay' => '1000',
// 中文字体路径(服务器上需安装中文字体)
'font-family' => 'SimSun',
],
生成 PDF
use Barryvdh\Snappy\Facades\SnappyPdf;
$pdf = SnappyPdf::loadView('pdf.invoice', $data);
return $pdf->download('invoice.pdf');
// 或
return $pdf->inline('invoice.pdf'); // 浏览器预览
解决中文乱码
在 Blade 模板中强制指定中文字体:
<style>
body { font-family: 'SimSun', 'Microsoft YaHei', sans-serif; }
/* 或使用 Google 字体(在线) */
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC&display=swap');
body { font-family: 'Noto Sans SC', sans-serif; }
</style>
服务器端安装中文字体(Linux):
# 安装文泉驿或思源字体 apt-get install fonts-wqy-zenhei fonts-wqy-microhei
其他常用 Laravel PDF 方案对比
| 方案 | 是否需要系统依赖 | 中文支持 | CSS 支持 | 性能 | 推荐场景 |
|---|---|---|---|---|---|
| Snappy (wkhtmltopdf) | 是(需安装二进制) | 需配置字体 | 优秀 | 中等 | 复杂布局、已有项目 |
| DomPDF | 否(纯 PHP) | 内置支持 UTF-8 | 较好(但 CSS3 有限) | 慢(内存大) | 简单报表、中文友好 |
| MPDF | 否(纯 PHP) | 优秀 | 良好 | 中等 | 中文文档、出版物 |
| Browsershot (Puppeteer) | 是(需 Node.js) | 原生支持 | 完美 | 较快 | 现代项目、自定义强 |
| TCPDF | 否(纯 PHP) | 需额外处理 | 较差 | 慢 | 老项目、低要求 |
现代替代方案推荐(2025 年)
推荐方案 A:Browsershot + Puppeteer
composer require spatie/browsershot # 需要 Node.js 和 npm install puppeteer
使用: 调用 Chrome Headless 渲染,PDF 质量最高,中文完美。
推荐方案 B:MPDF(纯 PHP,中文友好)
composer require mpdf/mpdf
简单示例:
$mpdf = new \Mpdf\Mpdf();
$mpdf->WriteHTML('<h1>你好,世界</h1>');
$mpdf->Output('file.pdf', 'D'); // D = download
总结建议
- 如果你已在使用 Snappy 且中文问题已解决 → 继续使用,稳定可靠
- 新项目且中文为主 → 推荐 MPDF(无系统依赖、中文完美)
- 需要最高质量 PDF(复杂 CSS/JS) → Browsershot
- 简单 PDF、不想安装任何额外依赖 → DomPDF
你的项目具体情况是什么?(如:中文使用量、Laravel 版本、服务器环境、PDF 复杂度)我可以帮你推荐最适合的方案。