簡単な帳票を作成する
次にここまでの応用として、簡単な帳票を作成してみます。作成する帳票は、以下のようなイメージです。
このサンプルは、破線を引く処理以外は今までのサンプルの組み合わせで作成できます。部品ごとに関数を作成しながら、再利用しやすいように作成していきます。
完全な実際のコードはcode_layout.phpを参照してください。ここでは、注意すべき部分を抜粋して説明いたします。
タイトルの作成
まず文字に下線を引く関数を作成します。この関数は前回「文字に下線や打ち消し線を引く」で紹介したコードをそのまま関数にしたものです。
function text_underline($page,$x,$y,$text){
// (省略)
}
これで出力する位置の$xと$y、そして出力する文字列を指定することで、下線付きの文字が出力できる関数の作成が完了しました。各自で共通処理を定義する場合にも、$pageと位置情報($xと$y)を共通引数として定義しておくと便利です。
テーブルレイアウトの作成
テーブルレイアウトでは、まずヘッダ部分とボディ部分に分けて指定できるようにしましょう。そして、ヘッダでは各カラムの横幅が指定できるようにします。サイズの指定はミリ(mm)です。また、コードでは以下のような指定をしてください。
$data = array();
$header = array('社員番号' => 50,'所属' => 70,'氏名' => 70);
$data[] = array('A20150511','開発部','日本 太郎');
「社員番号」のカラムは50ミリ(つまり5cm)、「所属」のカラムは70ミリのようになります。
まず、ミリから内部サイズへと変換する関数を作成します。Haru内部では72dpiとして計算されておりますので、以下のような関数で変換が可能です。
function mmToPx($size){
$dpi = 72;
return ($size * $dpi / 25.4);
}
「ヘッダ」と「データ」、それに表示する位置($x,$y)を指定すれば、テーブルレイアウトが表示できるようにtable関数を作成します。
サンプルの帳票イメージでは、以下の関数を3回実行しています。関数内の流れは、以下のようになります。
function table($page,$font,$header,$data,$x,$y){
// (省略)
// ヘッダ情報からサイズ情報の作成
$table_width = 0;
$size_cols = array();
$header_row = array();
// ヘッダの情報を作成する
foreach($header as $label => $mm){
$size = mmToPx($mm);
$table_width += $size;
$size_cols[] = $size;
$header_row[] = $label;
}
// テーブルの上部の線を引く ( tableでのborder-top相当)
// (省略)
// ヘッダの一番左の列の左側の線を書く (trでのborder-left相当)
// (省略)
// ヘッダ行の出力
draw_row(...);
// ヘッダ列の下線を引く ( trでのborder-bottom相当)
// (省略)
foreach($data as $row){
if(2行目移行の場合){
// 複数の列の場合に、各列の下に破線を引く (trでのborder-bottom相当)
$page->setDash(array(1, 1), 0);
// (省略)
}
// 一番左の列の左側の線を書く (trでのborder-left相当)
// 各行の出力
draw_row(...);
// テーブルの下に線を引く (tableでのborder-bottom相当)
// (省略)
}
}
この関数での制限として、1カラムに複数行の出力にならないこと、横幅に収まることが条件です。この制約があることで行の移動は必ず1行の高さと等しくなり、非常に簡単にレイアウトを行うことができます。もしこの制約がない場合は、出力する最後の列により高さが決まることになったり、文字列幅によってフォントサイズの調整が必要になったりと、非常に複雑になります。
