wkhtmltopdf のPHPラッパー Snappy を Laravel に組み込んだ Laravel-Snappy を使ってみる。
インストール
公式の README に目を通しておくといい。
1 2 3 4 5 6 |
// インストール composer require h4cc/wkhtmltopdf-amd64 0.12.x composer require barryvdh/laravel-snappy // config の雛形をコピー php artisan vendor:publish --provider="Barryvdh\Snappy\ServiceProvider" |
app/snappy.php を編集して、実パスへの位置を定義。
.env に定義があればそれを、無ければ Composer のデフォルト位置を指定。
1 |
'binary' => base_path( env('WKHTML_PDF_BINARY', 'vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64') ), |
追加ライブラリ入れる
The exit status code ‘127’ says something went wrong: stderr: “/var/www/html/vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64: error while loading shared libraries: libXrender.so.1: cannot open shared object file: No such file or directory
とか出た場合。メッセージの通り、ライブラリがない。
dockerイメージに libXrender が含まれないので、これを追加する。
/docker/Dockerfile の apt-get install な列に一行追加。
1 |
&& apt-get install -y libxrender-dev \ |
(autoremove の直前でいいと思う)
ついでに日本語フォント(IPAフォント─素晴らしいプロジェクトですよね)も入れておく。
1 |
&& apt-get install -y fonts-ipafont fonts-ipaexfont \ |
使ってみよう
1 2 |
// HTMLを直で渡してインライン表示 return \PDF::loadHTML('<b>hello world!</b>')->inline(); |
1 2 |
// ダウンロードさせる return \PDF::loadHTML('<b>hello world!</b>')->download('filename.pdf'); |
1 2 3 4 |
// viewをPDF化する return \PDF::loadView('view.name')->inline(); // データ渡しも可 return \PDF::loadView('view.name', $data)->inline(); |
Hタグを入れると目次も自動で作ってくれる。スゴイ!
日本語が文字化けするんだが?
html 内の meta タグで utf8 を指定する。
PDF::loadFile(url)で外部サイトを読み込むとSSL絡みのエラーが出るんだが?
調べてみたところ、ライブラリの問題でバージョンアップするしか無さそう。しかしメンテナが手を離してしまってるみたいで、SSLのバージョンを落とすか(無意味)か、自力で wkhtmltopdf のバージョンを 0.12.5 以上に上げるしかないらしい。厳しい。