Laravel&sail環境で、綺麗なPDFファイルを作る。
PDFファイルを作る方法は色々ある。
ChromiumブラウザからPDFファイルを出力する方法だと、複雑なHTMLでもPDF化できるので便利。
m1/m2/m3のmacとかでも対応できる手順。
DockerでのChromiumをインストール
リリース版のChromiumは、aptじゃないsnapというパッケージマネージャーをインストールする必要があるらしく、Dockerで入れるには色々面倒っぽい。betaバージョンのChromiumを入れることにした。
Dockerの設定ファイルを書き出す。
./artisan sail:publish
Dockerの設定変更
/docker/8.2/Docker
&& apt-get install -y mysql-client \
&& apt-get install -y postgresql-client-$POSTGRES_VERSION \
+ && apt-get install -y software-properties-common \
+ && add-apt-repository -y ppa:saiarcot895/chromium-beta \
+ && apt-get update \
+ && apt-get install -y chromium-browser \
/docker-compose.yaml
- image: sail-8.2/app
+ image: sail-8.2/app-with-chromium
イメージを作り直して起動する。
./vendor/bin/sail up
PHPから簡単に呼び出せるパッケージをインストール
composer require chrome-php/chrome
使ってみる
use HeadlessChromium\BrowserFactory;
// chromium-browserのパスを指定して、ブラウザファクトリを作成
$browserFactory = new BrowserFactory('/usr/bin/chromium-browser');
// ブラウザを起動
$browser = $browserFactory->createBrowser();
try {
// 新しいタブを作成
$page = $browser->createPage();
// ページに移動
$page->navigate('https://www.yahoo.co.jp/')->waitForNavigation();
// スクリーンショットを撮影
$tmp_path = tempnam(sys_get_temp_dir(), 'pdf');
$page->pdf(['printBackground' => false])->saveToFile($tmp_path);
// ブラウザを閉じる
$browser->close();
// PDFファイルを返す
return response()->file($tmp_path)->deleteFileAfterSend(true);
} catch(Exception $e) {
// ブラウザを閉じる
$browser->close();
// 例外をまた飛ばす
throw $e;
}