LaravelPDF用Snappy吗

wen PHP项目 6

本文目录导读:

LaravelPDF用Snappy吗

  1. 为什么选择 Snappy?
  2. 基本使用示例
  3. 其他常用 Laravel PDF 方案对比
  4. 现代替代方案推荐(2025 年)
  5. 总结建议

是的,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 复杂度)我可以帮你推荐最适合的方案。

抱歉,评论功能暂时关闭!