人気のPHP WEBアプリケーションフレームワークLaravelのTipsを記録していきます

Laravel で BrowsershotでPDF表示

● BrowsershotでPDF表示

● spatie/browsershot

https://github.com/spatie/browsershot

1. puppeteer のインストール

npm install puppeteer --global

2. browsershot のインストール

composer require spatie/browsershot

3-A. 表示のテスト(ウェブサイトをpdfにして表示する場合)

use Spatie\Browsershot\Browsershot;
        Browsershot::url('https://www.google.com/?hl=ja')
            ->setOption('args', ['--no-sandbox','--disable-web-security'])
            ->save('./test.pdf');

        $file = file_get_contents( public_path('./test.pdf') );

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

3-B. 表示のテスト(ローカルのhtmlをpdfにして表示する場合)

use Spatie\Browsershot\Browsershot;
        $html = "<h1>TEST</h1>";
        Browsershot::html( $html )
            ->setOption('args', ['--no-sandbox','--disable-web-security'])
            ->save('./test.pdf');

        $file = file_get_contents( public_path('./test.pdf') );

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

error while loading shared libraries: libatk-1.0.so.0: cannot open shared object file エラーになる場合

puppetter の 共有ライブラリが不足しています。

・足りない共有ライブラリを調べる

cd /YOUR-PATH-TO-PUPPETEER/puppeteer/.local-chromium/linux-818858/chrome-linux
ldd chrome

これで not found と言われている .so をインストールする必要があります。

yumコマンドでインストールしましょう。

● LaravelでPDF作成時に外部cssが読み込まれない不具合の対応

  <link rel="stylesheet" href="{{ url('/assets/css_pdf/pdfprint.css') }}">

 ↓ 次のようにして絶対パスに書き換えます

  <link rel="stylesheet" href="{{ public_path('/assets/css_pdf/pdfprint.css') }}">

● puppetter の LD_LIBRARY_PATH を手動で追加する

vendor/spatie/browsershot/Browsershot.php

    protected function callBrowser(array $command)
    {
        $fullCommand = $this->getFullCommand($command);
        $process = Process::fromShellCommandline($fullCommand)->setTimeout($this->timeout);
        // ● この行を追加 ↓
        $process->setEnv(array('LD_LIBRARY_PATH' => "/PATH/TO/YOUR/lib64" ));
        $process->run();
No.1880
02/01 13:19

edit