帳票作成
業務系のシステムで欠かせないのが帳票作成です。また近年であれば帳票作成はPDF出力化するのが一般的です。PDF形式が一般的になったことは開発者から見れば嬉しいことですが、一番厄介なのがPDF出力するためのツールやフレームワーク毎に作法が異なっており、その度にPDF出力の方法を学習しなければいけません。
TCPDF
そこで今回紹介したいのがHTML形式でPDF作成できるTCPDFです。
https://tcpdf.org/
PDF出力のための表現にHTMLを利用できるので、わざわざ新しいPDF出力の方法を学ばなくてもHTMLさえ知っていれば大丈夫です。このTCPDFは2002年から開発が続いており、今でも現役で活躍しています。またTCPDFのサイトには65個にもおよぶサンプルが揃っているので、使い方に悩んだとき必ず役に立つことでしょう。
TCPDFの配置
TCPDFはオープンソースソフトウェアでありGithubで公開されています。Githubからはzip形式でダウンロードすることができます。「Clone or download」ボタンをクリックしさらに「Download ZIP」を選択してください。
https://github.com/tecnickcom/tcpdf
zipファイルはお好きなところに配置してください。私はプロジェクトフォルダに「lib」フォルダを作成し、そこに「TCPDF」を配置しています。下記、「lib / TCPDF」に配置したものとし説明を続けます。
使い方
今回は index.php を用意し、直接PDFファイルとして表示してみましょう。利用時にtcpdf.phpを読み込む必要があります。
include "lib/TCPDF/tcpdf.php";
そしてTCPDFクラスのインスタンスを生成します。今回は次のような引数を利用しインスタンスを生成しました。
$tcpdf = new TCPDF("L", "mm", "A4", true, "UTF-8" );
- 第1引数 … PDFの方向(L: 横, P: 縦)
- 第2引数 … 単位(mm, pt, in など)
- 第3引数 … 用紙サイズ
- 第4引数 … unicodeであればtrue
- 第5引数 … 文字コード
インスタンスに対して AddPage メソッドで新しいページを追加します。
$tcpdf->AddPage();
インスタンスに対して SetFont メソッドでフォントを指定します。日本語を出力する場合、日本語フォントを指定しなければ文字化けします(??と表示されます)。
$tcpdf->SetFont("kozgopromedium", "", 10);
- 第1引数 … フォント名
- 第2引数 … フォントスタイル(空文字: 標準, B: ボールド, I: イタリック など)
- 第3引数 … フォントサイズ
インスタンスに対して writeHTMLメソッドでhtmlで書かれた内容を書き込めます。htmlの内容にはstyleタグにcssも記述することができます。
$tcpdf->writeHTML($html);
インスタンスに対して Output メソッドでPDFファイルを出力します。
$tcpdf->Output("user.pdf", "I");
- 第1引数 … ファイル名
- 第2引数 … 出力方法(I: ブラウザに出力, D: ダウンロード など)
サンプル
次のようなindex.phpファイルを用意しました。簡単なユーザ一覧であり、No, 名前, 年齢, 住所を表示しています。またテーブルのスタイルをcssで記述しています。
<?php
include "lib/TCPDF/tcpdf.php";
$tcpdf = new TCPDF("L", "mm", "A4", true, "UTF-8" );
$tcpdf->AddPage();
$tcpdf->SetFont("kozgopromedium", "", 10);
$html = <<< EOF
<style>
table {width: 500px;}
table th {text-align: center; font-weight: bold;}
table th.no {width: 50px;}
table th.name {width: 150px;}
table th.age {width: 50px;}
table th.address {width: 250px;}
table td.no {text-align: right;}
table td.name {text-align: left;}
table td.age {text-align: right;}
table td.address {text-align: left;}
</style>
<h1>ユーザ一覧</h1>
<table border="1">
<tr>
<th class="no">No</th>
<th class="name">名前</th>
<th class="age">年齢</th>
<th class="address">住所</th>
</tr>
<tr>
<td class="no">1</td>
<td class="name">山田</td>
<td class="age">25</td>
<td class="address">東京都港区</td>
</tr>
<tr>
<td class="no">2</td>
<td class="name">佐藤</td>
<td class="age">32</td>
<td class="address">埼玉県さいたま市</td>
</tr>
<tr>
<td class="no">3</td>
<td class="name">鈴木</td>
<td class="age">23</td>
<td class="address">大阪府大阪市</td>
</tr>
</table>
EOF;
$tcpdf->writeHTML($html);
$tcpdf->Output("user.pdf", "I");
これを出力すると、次のように表示されます。
まとめ
HTML形式でPDFファイルを作れるのは非常にありがたいです。学習コストが低く、比較的自由に表現できるかと思います。ぜひご利用ください。