PDF資料を作成する際に使用するソフトといえば、真っ先に思い浮かぶのはデザインに使う定番のソフトではないでしょうか。
書籍のレイアウトに強い「InDesign」、グラフィックデザインの王道ツール「Illustrator」などを使えば、簡単に作成したデザインをPDFに書き出すことが可能です。
しかし、同じデザインのテンプレートを使って、データだけを入れ替えて大量に資料を作成する場合には、いちいちデザインデータを開き、データを貼り付けて書き出すのは、すごく手間が掛かります。。。しかも、このような作業を人間の手で行うと、ミスが起きやすいです。
そこで、今回はWEB技術の力を借りて、自動的にPDFを書き出す方法をご紹介します。
考え方としては、レイアウトをHTMLとCSSで作成し、そのデータを専門のライブラリを使ってPDFに変換します。
今回は「Laravel」というPHPプログラムのフレームワークで、「dompdf」というライブラリを使用します。
dompdfのインストールは簡単!以下のワンコマンドでOKです!
1 |
composer require barryvdh/laravel-dompdf |
インストールした「dompdf」サービスを呼び出せるようにするため、「app\config\app.php」ファイルの「providers」配列に以下を追加します。
1 2 3 4 5 6 7 8 9 10 |
'providers' => [ /* * Laravel Framework Service Providers... */ App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, /* 追加:dompdf */ Barryvdh\DomPDF\ServiceProvider::class ], |
そして、簡単に呼び出せるよう、「aliases」配列に以下のように別名で指定します。
1 2 3 4 5 |
'aliases' => [ … /* 追加:dompdf */ 'PDF' => Barryvdh\DomPDF\Facade::class, ], |
以上が「dompdf」を使うための準備になります。
次に、PDFの書き出しを行うルート、処理を書くコントローラーなどを指定します。
1 2 |
/* Routes\web.php */ Route::get('/pdf', [PDFController::class, 'download'])->name('pdf.download'); |
続いて、PDFを書き出すためのベースとなるテンプレートを作成します。
1 2 3 4 5 6 7 8 9 |
<?php # 親テンプレート ?> @extends('layouts.pdf') <?php # ページタイトル ?> @section('pagetitle', 'pdfの書き出し') @section('maincontent') <h2>dompdfでpdfを出力する</h2> @endsection |
最後に、PDFの書き出し処理をControllerで実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//ライブラリを読み出す use PDF; class PDFController extends Controller { /** * PDF出力 */ public function download(Request $request) { Log::info('PDF出力'); //ブラウザタブでPDFを表示する場合 $pdf = PDF::loadView('pdf'); return $pdf->stream(); //直接にダウンロードする場合 return $pdf->download('hello.pdf'); } } |
「dompdf」自体は日本語に対応していません。
現状では、日本語の部分が「文字化け」してしまいます。
そのため、日本語の外部フォントを読み込む必要があります。
以下のサイトからIPA明朝・ゴシックをダウンロードします。
https://moji.or.jp/ipafont/ipa00303/
ダウンロードしたフォントファイルを「storage/fonts/」フォルダに入れます。
そして、@font-faceを使ってフォントを読み込みます。
headタグに以下のように指定します。
1 2 3 4 5 6 7 8 9 |
@font-face{ font-family: ipag; font-style: normal; font-weight: normal; src: url('{{ storage_path("fonts/ipag.ttf")}}'); } body { font-family: ipag; } |
なお、実際のクラス設定で、font-weightをnormal以外で指定すると、再び文字化けしてしまいますので、@font-faceで「font-weight: 600」のバージョンを指定する必要があります。
また、外部CSSを以下のようにヘッダータグで設定すると、CSSが全く効きません。
1 |
<link rel="stylesheet" href="{{ route('css/pdf.css') }}"> |
routeの指定方法では、dompdfはうまく認識しないので、dompdfライブラリにCSSを識別させるため、routeではなく「public_path」を使う必要があります。
デフォルトでは、PDFが縦向きで出力されます。横向きで出力したい場合は、以下のようにコントローラーに追記します。
1 2 3 4 5 6 |
Log::info('PDF出力'); $building = []; $pdf = PDF::loadView('proposal.detail-pdf',compact('building')); // A4サイズで、縦向きで出力する $pdf = $pdf->setPaper('A4', 'landscape'); |
以上がdompdfの使用説明になります。
コントローラーで、繰り返し処理を合わせて使うと、ボタンを押すだけで、指定したデザインにデータを貼り付けてPDFデータを書き出してくれます。
今回ご紹介した方法では、HTMLからPDFに変換することは簡単ですが、やはり正確さや細かさは足りません。
より正確に書き出したい場合は、さらに専門的な手段が必要ですね。
私たちには馴染み深いWEB技術。うまく応用することで、いろんな問題を解決し、便利にすることができます。
このようなことを考え、使いこなすことが、WEB制作の楽しさではないでしょうか。
これからも、WEB技術を使ってさまざまな課題に挑戦していきたいです。