问题描述
我已经设置了 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)
它基本上是说它找不到我的本地版本的 Chromium,我不知道如何解决这个问题,如果它不是通过 docker 运行的,我可以在本地安装它并指向它,但我不认为这是使用 docker 时的最佳解决方案。
解决方法
您需要在 docker 容器内安装带有 Chromium 的 puppeteer。 我目前对带有 Sail 的 Browsershot 进行了完全相同的设置。 您需要 publish the sail config 个文件来编辑 docker 容器。
sail artisan sail:publish
然后您可以在 Laravel 项目的根目录下的 docker/8.0
或 docker/7.4
下找到 docker 文件,具体取决于您的 PHP 版本。
编辑docker文件,添加puppeteer withchromium的安装命令:
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');