SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ライセンス制限が緩く高速でPDFを作成可能なPHPライブラリ「Haru」

PHP::Haruで簡単なPDF帳票を作成する

ライセンス制限が緩く高速でPDFを作成可能なPHPライブラリ「Haru」(2)

  • X ポスト
  • このエントリーをはてなブックマークに追加

簡単な帳票を作成する

 次にここまでの応用として、簡単な帳票を作成してみます。作成する帳票は、以下のようなイメージです。

レイアウトイメージ
レイアウトイメージ

 このサンプルは、破線を引く処理以外は今までのサンプルの組み合わせで作成できます。部品ごとに関数を作成しながら、再利用しやすいように作成していきます。

 完全な実際のコードはcode_layout.phpを参照してください。ここでは、注意すべき部分を抜粋して説明いたします。

タイトルの作成

 まず文字に下線を引く関数を作成します。この関数は前回「文字に下線や打ち消し線を引く」で紹介したコードをそのまま関数にしたものです。

下線付き文字の出力関数定義(code_layout.phpの一部)
function text_underline($page,$x,$y,$text){
  // (省略)
}

 これで出力する位置の$xと$y、そして出力する文字列を指定することで、下線付きの文字が出力できる関数の作成が完了しました。各自で共通処理を定義する場合にも、$pageと位置情報($xと$y)を共通引数として定義しておくと便利です。

テーブルレイアウトの作成

 テーブルレイアウトでは、まずヘッダ部分とボディ部分に分けて指定できるようにしましょう。そして、ヘッダでは各カラムの横幅が指定できるようにします。サイズの指定はミリ(mm)です。また、コードでは以下のような指定をしてください。

テーブルデータのコード(code_layout.phpの一部)
$data = array();
$header = array('社員番号' => 50,'所属' => 70,'氏名' => 70);
$data[] = array('A20150511','開発部','日本 太郎');

 「社員番号」のカラムは50ミリ(つまり5cm)、「所属」のカラムは70ミリのようになります。

 まず、ミリから内部サイズへと変換する関数を作成します。Haru内部では72dpiとして計算されておりますので、以下のような関数で変換が可能です。

ミリ指定から内部サイズへの変換(code_layout.phpの一部)
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行の高さと等しくなり、非常に簡単にレイアウトを行うことができます。もしこの制約がない場合は、出力する最後の列により高さが決まることになったり、文字列幅によってフォントサイズの調整が必要になったりと、非常に複雑になります。

次のページ
最後に

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
ライセンス制限が緩く高速でPDFを作成可能なPHPライブラリ「Haru」連載記事一覧
この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7218 2013/06/28 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング