はじめに
先日、Laravel12を利用したアプリケーションにおいて、
PDFライブラリの見直しを行いました。
今回は7つの候補ライブラリを比較・検証しました。
結論として、HTML/CSSを活かした複雑なPDFを生成したい場合、Browsershotが非常に有力で、今回はこれを採用しました。
今回の記事では、ライブラリの置き換えを行った背景と、比較したライブラリの紹介、
それぞれの採用・見送り理由をまとめます。
今後PDFライブラリの選定を行う方の参考になれば幸いです。
ライブラリの置き換えを行った背景
ライブラリの置き換えを検討するに至った背景には、
これまで使用していたPDF生成ライブラリに将来的なメンテナンス面の不安が生じたことです。
これまで本アプリケーションにおいては、
PDFライブラリとしてLaravel Snappy PDFを使用していました。
Laravel Snappy PDFのreadmeを確認すると、Usageの項目に
See the wkhtmltopdf manual for more information/settings.
という記載があります。
このことからwkhtmltopdfを内部で利用していることがわかります。
このwkhtmltopdfはレンダリングエンジンとしてQt Webkitを採用していました。
しかし、このQt Webkitのメンテナンスが終了してしまったことを受け、
wkhtmltopdfの開発もアーカイブの状態となり、メンテナンスが止まってしまっている状態でした。
それに加えて、wkhtmltopdfを利用している関係上、
break-beforeのような比較的新しい改ページ関連のCSSが
期待通りに反映されないケースもありました。
こうした背景から、今後のメンテナンス性や拡張性を考慮し、
PDFライブラリの代替を検討することになりました。
ライブラリ選定の前提条件
- Laravel12で使えること
- 無料で利用できること
- 複雑なレイアウトに向くこと
- 最新のCSSを利用したレイアウトが可能であること
- 今後のメンテナンスが期待できること
候補比較
Printd
- wkhtmltopdfの代わりに試した方法として紹介されていた方法
- ブラウザの印刷ダイアログを開き、ページ内のHTML要素を印刷できる
- 環境(開発・本番)による差が解消されるなど、開発面での負担解消が見込める
- 内部でwkhtmltopdfは利用していない
見送り理由
- 最終更新日が2023年2月11日で2年以上前のため、メンテナンス面と今後の拡張性に課題を感じたため
Playwright
- WebアプリのE2Eテスト向けライブラリ
- WebページをPDF化する機能もあり、PDF生成ライブラリとして使うことも可能
- 内部でブラウザを操作させてWebページを表示するため、最新のcss3やhtml5の再現も問題がない
- KotlinやJava環境で活用するならおすすめ
見送り理由
- KotlinやJava環境での利用にはおすすめとあったため
- Laravel環境でも使えたかもしれないが、統合コストが相対的に高いと感じたため
Dompdf
- laravel-dompdfを使うと運用が容易
- HTML->PDF変換ができる
- CSSやフォントの対応はmPDFより弱く、JavaScriptは不可
- 簡単なレイアウトやPDFを素早く生成したい場合におすすめ
- 元々使用していたLaravel Snappy PDFと同じプロジェクトのライブラリ
- MIT LICENSEのライセンス
- Laravel12をサポート
- 日本語対応には別途設定が必要
見送り理由
- 複雑なレイアウトのものは不向きとあったため
- 今回のPDFは画像の表示や複雑なテーブル構造などが発生するので、再現に課題があると感じた
mPDF
-
mPDF is a PHP library which generates PDF files from UTF-8 encoded HTML.とあるように、PHPで動くため、サーバー環境の制約が少ない - 日本語やCJK文字のフォント埋め込みが容易
- 表形式やシンプルなデザインのテンプレートを使う時に向いている
- MIT LICENSEじゃない(GPL-2.0 license)
- 本アプリケーションで使用しているライブラリはMIT LICENSEのものが多いが、GPL-2.0 licenseでも使用は可なのでこれ自体は見送り理由にならない
見送り理由
- 最新のリリースが執筆時点で2022年4月16日と、今後のメンテナンスに課題を感じたため
- Dompdfよりは対応しているCSSが多そうであったが、それでも余白周りなどで思うような実装ができていなかった
- mPDFについては実際に導入してみてPDFを発行できるところまで試してみたが、文字化けしてしまったり指定していたCSSがうまく反映されない状態だった(文字化けに関しては日本語フォントで出力する設定にすれば対処はできそうだった)
- CSSについてはmPDFで再現できるようにHTML自体を変えることを検討したが、作業に使える時間等を鑑みたことと、もう一個実際に試したSpatie Laravel PDF(Browsershot)での実装がうまくいったので今回は見送った
TCPDF
- PHPでPDFファイルを生成するためのオープンソースライブラリ
- 豊富な組み込み関数により、複雑なPDFドキュメントの作成が可能
- HTMLからPDFへの変換機能により、既存のHTMLテンプレートの再利用が容易
- バーコードや電子署名など、ビジネス利用に必要な機能を標準搭載
- GNU Lesser General Public Licenseに基づくソフトウェア
- 継続的なアップデートが行われている
- 様々なPHPフレームワークとの統合が可能
- 以下のようなプロジェクトで重宝される
- 請求書や帳票の自動生成システム
- レポート作成システム
- 証明書や認定書の発行システム
- 商品カタログの動的生成
- 契約書類の電子化システム
見送り理由
- PDFに対して細かい制御をしたい場合はとても良いライブラリであるが、今のところここまでの細かさは求めていないため
- 配置を決めるために細かく座標を決めていく必要があるので、今現在のHTMLを活かしたい場合はこのライブラリだと少し作業が複雑すぎる
DocRaptor
- API経由で受け取ったソースHTMLデータをPDF形式に変換し、PDFファイルとして返すWebサービス
見送り理由
- 商用のため、使用にコストがかかる
- 月単位の使用量に基づく料金が発生する
Spatie Laravel PDF(Browsershot)
- Chromeのヘッドレスブラウザを使用してPDFを生成する
- 最新のCSSやJavaScriptに対応し、美麗なレイアウトを実現できる
- その分リソースを多く消費する可能性があるのでサーバーの性能に留意する
- サーバーサイドで Headless Chrome を使ってHTMLをPDF化するため、Chromeとついているが、ユーザーがどのブラウザで見ていても影響はない
- MIT LICENSE
- Laravel12をサポート
- セットアップは複雑に感じる
- この点はまた後日書きますが、環境に適用させるため、なかなか手間取った記憶があります
採用理由
- Laravel12に対応していること
- 無料で使用可能なこと
- 比較的更新が頻繁で、今後のメンテナンスも期待できそうなこと
- 結構最新のライブラリで複雑なレイアウトの表現もできそうだったこと
まとめ
これらの理由から最終的に既存のHTMLをそのまま活かしつつ、
CSSでレイアウトを細かく調整したいケースではSpatie Laravel PDF(Browsershot)が
非常に相性が良いと感じ、これを採用しました。
