Laravel-dompdf が使いやすくなってた件

いろいろとやることが多くてついブログをサボってしまいました(汗)

現在の開発で久しぶりに PDFを作成する必要があったんで、Laravel 開発の PDF作成ではデファクトスタンダード laravel-dompdf を使わせてもらうことにしました。

以前に何度もこのパッケージを使わせてもらってるんですけど、実はこのパッケージ、日本語を使おうとなると composer のルールを破ったりキャッシュのためのファイルを自分で作ったりとなかなか使いにくいものだったんです。

※実際には laravel-dompdf ではなく、元となってる dompdf が原因です。

なので、今回もまたおんなじ作業をやんなきゃいけないかな、なんて思ってたら、さすがそこは日進月歩のウェブの世界。

laravel-dompdf がいい具合にめんどうな作業をショートカットできるように改善してくれてました。

ということで、その感動を原動力に laravel-dompdf を使って日本語を出力するまでをまとめてみたいと主ます!

環境

  • Laravel: 5.5
  • laravel-dompdf: 0.8.1

まずはインストール

まずはパッケージをインストールしましょう。
composer で一発です。

composer require barryvdh/laravel-domp

Laravel 5.5 なら今までやってた面倒な config/app.php への作業も必要ありません。
ホント便利になりましたね!

フォントを準備

laravel-dompdf を使って日本語出力をするには、以前と同じく日本語フォントが必要になります。

なので、以下から IPAフォントをダウンロードして storage/fonts に設置しましょう。
(フォルダがなければ自分で作って権限も 777 に変更しておいてくださいね。)

storage/app/fonts ではないので注意!

[ダウンロードURL]
http://ipafont.ipa.go.jp/old/ipafont/download.html

ビューとコントローラー

フォントの設置が終わったら、次はビューコントローラーを作成します。


まずは実際に PDFでアウトプットされるビューを作成しましょう。

※テスト的に書いてるんでファイル名とかパスとかは自分のお好みでどうぞ!

<!doctype html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <style type="text/css">
        @font-face {
            font-family: ipag;
            font-style: normal;
            font-weight: normal;
            src: url('{{ storage_path('fonts/ipag.ttf') }}') format('truetype');
        }
        @font-face {
            font-family: ipag;
            font-style: bold;
            font-weight: bold;
            src: url('{{ storage_path('fonts/ipag.ttf') }}') format('truetype');
        }
        body {
            font-family: ipag !important;
        }
    </style>
</head>
<body>
日本語の表示
</body>
</html>

注意すべき点は、@font-face の部分。
ここに指定したフォントが PDF作成で利用されるいろいろなファイルの元になります。

なお、@font-face が2つあるのは通常の文字と、太字に対応するためです。
最初ずーっと表示できないと思っていたら太文字を指定していなかったという時間の無駄をしてしまいました(笑)

で、body にも font-family で指定してあげて念の為 !important で強調する。
あと、meta にも utf-8をセットしておくといいでしょう。

はい、これでビューはOKです。

コントローラー

次にコントローラーを作りましょう。

これはもう定型文みたいなもんなんで簡単なもんですけどね。

class HomeController extends Controller
{
    public function generate_pdf() {

        $pdf = \PDF::loadView('generate_pdf');
        return $pdf->stream('title.pdf');

    }

はい。
さっきのビューを loadView()で読み込んであげて、後は stream()を呼ぶだけです。

どうやらこのときに、laravel-dompdf が必要なファイルがなければ自動で作成してくれているようです。
なんてできるパッケージさんなんでしょう!

で、もしPDFをダウンロードしたい場合は、return 部分を

return $pdf->download('title.pdf');

にするだけでOK!
楽ちんですね♪

と、いうことで今回は作業が楽になった laravel-dompdf 0.8.1 を紹介しました。
みなさんの開発のお役にたてたら光栄です。

では!



にほんブログ村 IT技術ブログへ  にほんブログ村 IT技術ブログ プログラム・プログラマーへ


BugGUI バグ報告を効率化
たった3分でバグ報告完了!? BugGUI