5

我已经设置了 Laravel Sail 环境,并且正在尝试使用 puppeteer 将网页另存为 pdf。

我目前正在使用这个包通过 laravel 运行 puppeteer - https://packagist.org/packages/spatie/browsershot

要求部分指定您需要通过 npm 下载 puppeteer。

Laravel Sail 有 npm 设置,所以我安装了 puppeteer 包,但是当我尝试将网页另存为屏幕截图时,出现以下错误

The command "PATH=$PATH:/usr/local/bin NODE_PATH=`npm root -g` node '/var/www/html/vendor/spatie/browsershot/src/../bin/browser.js' '{"url":"https:\/\/google.com","action":"screenshot","options":{"type":"png","path":"\/var\/www\/html\/storage\/app\/public\/screenshot.png","args":[],"viewport":{"width":800,"height":600}}}'" failed. Exit Code: 1(General error) Working directory: /var/www/html/public Output: ================ Error Output: ================ Error: Could not find expected browser (chrome) locally. Run `npm install` to download the correct Chromium revision (856583). at ChromeLauncher.launch (/var/www/html/node_modules/puppeteer/lib/cjs/puppeteer/node/Launcher.js:80:27) at async callChrome (/var/www/html/vendor/spatie/browsershot/bin/browser.js:69:23)

它基本上说它找不到我的本地版本的铬,我不知道如何解决这个问题,如果它不是通过 docker 运行,我可以在本地安装它并指向它,但我不认为这是使用 docker 时的最佳解决方案。

4

1 回答 1

9

您需要在 docker 容器内安装带有 chromium 的 puppeteer。我目前为 Browsershot with Sail 设置了完全相同的设置。您需要发布sai 配置文件,这将允许您编辑docker 容器。

sail artisan sail:publish

然后你可以在你的 Laravel 项目的根目录下找到 docker 文件,docker/8.0或者docker/7.4取决于你的 PHP 版本。

编辑 docker 文件并添加 puppeteer with chromium 的安装命令:

RUN apt-get update \
    && apt-get install -y gconf-service libasound2 libappindicator3-1 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget libgbm-dev libatk-bridge2.0-0 \
    && npm install --global --unsafe-perm puppeteer \
    && chmod -R o+rx /usr/lib/node_modules/puppeteer/.local-chromium

然后重建dockerfile:

sail build --no-cache

因为 puppeteer 在 docker 中运行,所以我们需要禁用沙箱。请记住,docker 在您的主机上生成 PDF 的速度会慢很多,因此将默认超时时间也提高一点可能是明智的。

use Spatie\Browsershot\Browsershot;


Browsershot::html($html)
    ->noSandbox()
    ->timeout(360)
    ->save('your.pdf');
于 2021-04-21T11:50:33.770 回答