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
相关产品推荐
相关产品推荐

