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

Windows+XAMPP环境下Spatie Browsershot无法运行,遇多类错误求助

Windows下XAMPP环境运行Spatie Browsershot的问题排查与解决

操作流程与遇到的问题

  • 全局安装puppeteer:

    npm install -g puppeteer
    
  • 最初尝试直接输出PDF到浏览器,控制器代码:

    use Spatie\Browsershot\Browsershot;
    
    public function createPDFWithBrowsershot(Request $request)
    {
        Browsershot::html('<h1>Test</h1>')->pdf();
    }
    

    出现错误:

    The command "node "C:\xampp\htdocs\my_project\vendor\spatie\browsershot\src/../bin/browser.js^ ..."

  • 设置setNodeBinary('PATH %~dp0;%PATH%;')后,错误消失但页面空白

  • 改为保存PDF到文件,代码:

    public function createPDFWithBrowsershot(Request $request)
    {
        $save_to_file = 'C:/pdfs/file.pdf';
        Browsershot::html('<h1>Test</h1>')->setNodeBinary('PATH %~dp0;%PATH%;')->savePdf($save_to_file);
    }
    

    新错误:

    For some reason Chrome did not write a file at C:/pdfs/file.pdf. Command ======= [] Output ======

    尝试多种路径(如C:\pdfs\file.pdf、storage_path('pdfs/file.pdf'))均报错

  • 尝试卸载全局puppeteer并本地安装,甚至安装chromium:

    npm install puppeteer
    
    npm install chromium
    

    所有尝试无效,求问题原因与解决方法


问题原因与解决步骤

1. Node路径配置错误

你用setNodeBinary('PATH %~dp0;%PATH%;')完全错误,这个方法是用来指定node.exe的实际路径,不是设置环境变量。

先找到本地node.exe的位置(默认在C:\Program Files\nodejs\node.exe),修改代码:

->setNodeBinary('C:/Program Files/nodejs/node.exe')

2. Puppeteer与Chrome路径问题

全局安装puppeteer易导致路径识别异常,建议本地安装后指定Chrome路径:

  • 项目根目录执行本地安装:
    npm install puppeteer --save-dev
    
  • 找到puppeteer自带的Chrome路径,格式类似:你的项目路径/node_modules/puppeteer/.local-chromium/win64-xxxx/chrome-win/chrome.exe(xxxx为版本号)
  • 在Browsershot中指定Chrome路径:
    Browsershot::html('<h1>Test</h1>')
        ->setNodeBinary('C:/Program Files/nodejs/node.exe')
        ->setChromePath('项目根目录/node_modules/puppeteer/.local-chromium/win64-xxxx/chrome-win/chrome.exe')
        ->savePdf(storage_path('pdfs/file.pdf'));
    

3. 权限与路径问题

  • 保存PDF的目录必须存在且有写入权限:
    • 用storage_path('pdfs')的话,先手动创建storage/pdfs文件夹,右键文件夹→属性→安全→给Apache用户或Everyone添加写入权限
    • 避免用C盘根目录文件夹,权限限制多,优先用项目storage目录

4. 输出PDF到浏览器的正确写法

之前的->pdf()需要返回响应,正确代码:

public function createPDFWithBrowsershot(Request $request)
{
    $pdfContent = Browsershot::html('<h1>Test</h1>')
        ->setNodeBinary('C:/Program Files/nodejs/node.exe')
        ->setChromePath('你的Chrome路径')
        ->pdf();

    return response($pdfContent)
        ->header('Content-Type', 'application/pdf')
        ->header('Content-Disposition', 'inline; filename="test.pdf"');
}

5. 调试技巧

用->dumpCommand()查看实际执行的命令,复制到CMD中运行,直接看具体报错:

Browsershot::html('<h1>Test</h1>')
    ->setNodeBinary('C:/Program Files/nodejs/node.exe')
    ->setChromePath('你的Chrome路径')
    ->dumpCommand()
    ->savePdf(storage_path('pdfs/file.pdf'));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:15:15