You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel项目使用spatie/laravel-pdf生成PDF时Puppeteer未找到求助

Laravel spatie/laravel-pdf 1.5 生成PDF时Puppeteer相关错误解决

问题背景

使用spatie/laravel-pdf ^1.5从HTML生成PDF时,遇到一系列Puppeteer相关错误:Node命令未识别、方法调用不存在、临时目录找不到等,全局安装Puppeteer也无法解决。

解决方案

1. 优先安装本地Puppeteer

全局安装Puppeteer容易引发路径识别问题,直接在Laravel项目根目录执行:

npm install puppeteer --save-dev

将Puppeteer安装到项目本地node_modules,确保Browsershot能正确定位。

2. 正确配置Node与Puppeteer路径

spatie/laravel-pdf 1.x版本不支持直接在PdfBuilder调用setNodeBinary,必须通过withBrowsershot闭包配置,同时解决临时目录问题:

方式一:全局配置(推荐)

发布配置文件:

php artisan vendor:publish --provider="Spatie\LaravelPdf\LaravelPdfServiceProvider"

编辑config/pdf.php,添加Browsershot相关配置:

return [
    // 保留原有配置...
    'browsershot' => [
        'node_binary' => 'C:\\Program Files\\nodejs\\node.exe', // Windows路径需转义,或用正斜杠"C:/Program Files/nodejs/node.exe"
        'puppeteer_path' => base_path('node_modules/puppeteer/lib/esm/puppeteer/puppeteer.js'),
        'temporary_path' => storage_path('app/temp'), // 指定可读写的临时目录
    ],
];

创建临时目录(若不存在):

mkdir storage/app/temp

方式二:代码内动态配置

在生成PDF的逻辑中直接设置:

use Spatie\Browsershot\Browsershot;
use Spatie\LaravelPdf\Facades\Pdf;

// 确保临时目录存在并有权限
$tempDir = storage_path('app/temp');
if (!is_dir($tempDir)) {
    mkdir($tempDir, 0755, true);
}

$pdf = Pdf::html($html)->withBrowsershot(function (Browsershot $browsershot) use ($tempDir) {
    $browsershot->setNodeBinary("C:\\Program Files\\nodejs\\node.exe")
                ->setPuppeteerPath(base_path('node_modules/puppeteer/lib/esm/puppeteer/puppeteer.js'))
                ->setTemporaryPath($tempDir);
})->save('output.pdf');

3. Windows系统额外注意事项

  • Node路径使用双反斜杠或正斜杠,避免转义错误
  • 确保临时目录(如storage/app/temp)具备读写权限,不要依赖系统默认临时目录

4. 环境验证

执行以下命令确认环境配置正确:

# 查看Node安装路径
where node
# 确认本地Puppeteer存在
dir node_modules\puppeteer

内容的提问来源于stack exchange,提问作者fulgur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:42:45