TCPDFを行・列指定で利用する
TCPDFは、PHPでPDFを出力できるオープンソースのクラスだ。このままでも十分に使えるのだが、もっと便利に使えないかとの思いから自分用のライブラリーを使っている。

昔、汎用機を使っていた頃の帳票設計は、チャート用紙を使って設計してからコード化していたことを思い出した。
そこで、TCPDFをx、y座標でなく行と列で指定して直感的にPDFが作れると便利で開発工数が少なくなるようなライブラリー(incPdfFunc.php)を作ってみた。

TCPDFはこちらからダウンロード

デモ A4縦のチャート

【ディレクトリ構成】
┝ include
 ┝ incPdfFunc.php(このサイトからダウンロードしたライブラリ)

┝ tcpdf (tcpdfのサイトからダウンロードしたもの)
 ┝ config
 ┝ fonts
 ┝ include
 ┝ tcpdf.php
 ┝ ...

┝ ccoSamplePdf1.php(このサイトからダウンロードしたサンプルphp)

// -----------------------------------------------------------
//
//  Copyright (C) 2019 ICTCacao All Rights Reserved.
//
//    PDF出力
//
//     ccoSamplePdf.php
// -----------------------------------------------------------
//共通関数をインクルード
include_once("./include/incPdfFunc.php");

//TCPDF関連をインクルード
require('./tcpdf/config/lang/jpn.php');
require('./tcpdf/tcpdf.php');

//PDFを初期化
$ObjPdf = fncInitPdf();
//PDF出力
fncMakePdf($ObjPdf);

exit();

//--------------------------------------------------------------------------------
//  PDFを初期化
//  fncInitPdf()
//--------------------------------------------------------------------------------
function fncInitPdf(){
  //PDFオブジェクト A4縦
  $ObjPdf= new TCPDF('P','mm','A4');

  // set document information
  $ObjPdf->SetCreator(PDF_CREATOR);
  $ObjPdf->SetAuthor($CompanyName);
  $ObjPdf->SetTitle($CbiztInvoiceKbn);
  $ObjPdf->SetSubject('');
  $ObjPdf->SetKeywords('');
  // disable header and footer
  $ObjPdf->setPrintHeader(false);
  $ObjPdf->setPrintFooter(false);

  //set margins
  $PDF_MARGIN_LEFT = '15';
  $PDF_MARGIN_TOP = '10';
  $PDF_MARGIN_RIGHT = '15';
  $ObjPdf->SetMargins($PDF_MARGIN_LEFT, $PDF_MARGIN_TOP, $PDF_MARGIN_RIGHT);

  $PDF_MARGIN_HEADER = '0';
  $PDF_MARGIN_FOOTER = '0';
  $ObjPdf->SetHeaderMargin($PDF_MARGIN_HEADER);
  $ObjPdf->SetFooterMargin($PDF_MARGIN_FOOTER);

  //set auto page breaks
  $PDF_MARGIN_BOTTOM = '0';
  $ObjPdf->SetAutoPageBreak(FALSE, $PDF_MARGIN_BOTTOM);

  return  $ObjPdf;
}

//------------------------------------------------------------------------------
//      PDF出力
//      fncMakePdf($ObjPdf)
//------------------------------------------------------------------------------
function fncMakePdf($ObjPdf){

  $DefaultRowHeight = 5.0;  //1行の高さ

  //ページ追加
  $ObjPdf->AddPage();

  // ------------------------------------------------------------------
  //  チャート用ライン A4P  A4縦 行・列で指定するタイプ
  incPdfFunc_ChartLineA4P($ObjPdf,$DefaultRowHeight);
  // ------------------------------------------------------------------

  $pdfName = "sample.pdf";
  $pdfName = mb_convert_encoding( $pdfName, 'SJIS-WIN', 'UTF-8' );
  $ObjPdf->Output($pdfName, 'I');
}

TCPDFのMultiCellを、行と列を指定してPDFを出力する。
MultiCellを使ってチャートの3行目から7行目の15カラムから150カラムと7行目から10行目の100カラムから150カラムにテキストを出力してみる

デモ TCPDFのマルチセルを使ってテキストを出力

  //ページ追加
  $ObjPdf->AddPage();

  // ------------------------------------------------------------------
  //  チャート用ライン A4P  A4縦 行・列で指定するタイプ
  incPdfFunc_ChartLineA4P($ObjPdf,$DefaultRowHeight);
  // ------------------------------------------------------------------

  //MultiCell 3行目から7行目の15列から150列にテキストを出力する
  //incPdfFunc_MultiCellRowCol($ObjPdf,$txt,$ftype,$fsize,$stRow,$edRow,$stCol,$edCol,$RowHeight,$align='L',$vAlign='M',$ishtml=false)
  $txt = "MultiCell 3行目から6行目の1列から150列にテキストを出力する\nつれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)";//出力する文字列
  $ftype = 'G';//フォントタイプ G:ゴシック M:明朝
  $fsize = '12';//フォントサイズ
  $stRow = 3;//開始行
  $edRow = 7;//終了行
  $stCol = 15;//開始列
  $edCol = 150;//終了列
  incPdfFunc_MultiCellRowCol($ObjPdf,$txt,$ftype,$fsize,$stRow,$edRow,$stCol,$edCol,$DefaultRowHeight);

  //MultiCell 7行目から10行目の100列から150列にテキストを出力する
  //incPdfFunc_MultiCellRowCol($ObjPdf,$txt,$ftype,$fsize,$stRow,$edRow,$stCol,$edCol,$RowHeight,$align='L',$vAlign='M',$ishtml=false)
  $txt = "MultiCell 7行目から10行目の100列から150列にテキストを出力する\nつれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより)";//出力する文字列
  $ftype = 'M';//フォントタイプ G:ゴシック M:明朝
  $fsize = '12.0';//フォントサイズ
  $stRow = 7;//開始行
  $edRow = 10;//終了行
  $stCol = 100;//開始列
  $edCol = 150;//終了列
  incPdfFunc_MultiCellRowCol($ObjPdf,$txt,$ftype,$fsize,$stRow,$edRow,$stCol,$edCol,$DefaultRowHeight,'L','T');


  $pdfName = "sample.pdf";
  $pdfName = mb_convert_encoding( $pdfName, 'SJIS-WIN', 'UTF-8' );
  $ObjPdf->Output($pdfName, 'I');

TCPDFのMultiCellを、行と列を指定してPDFを出力する関数を拡張して枠付きの表を出力してみる

デモ 枠付きの表を出力

  //10行目から表を出力する
  //列幅定義配列(StCol,EdCol,HEADER_TITLE)
  $ColPosArray = array();
  array_push($ColPosArray,"10,35,項目A");
  array_push($ColPosArray,"35,75,項目B");
  array_push($ColPosArray,"75,140,項目C");
  array_push($ColPosArray,"140,160,項目D");
  array_push($ColPosArray,"160,180,項目E");
  array_push($ColPosArray,"180,200,項目F");
  //表のヘッダを出力する
  $ftype = 'G';
  $fontSize = 8.0;
  $Row = 10;
  $posArr = explode(',',$ColPosArray[0]);
  incPdfFunc_CellTableHeaderRowCol($ObjPdf,$posArr[2],$ftype,$fontSize,$posArr[0],$posArr[1],$Row,'C',$DefaultRowHeight);
  $posArr = explode(',',$ColPosArray[1]);
  incPdfFunc_CellTableHeaderRowCol($ObjPdf,$posArr[2],$ftype,$fontSize,$posArr[0],$posArr[1],$Row,'C',$DefaultRowHeight);
  $posArr = explode(',',$ColPosArray[2]);
  incPdfFunc_CellTableHeaderRowCol($ObjPdf,$posArr[2],$ftype,$fontSize,$posArr[0],$posArr[1],$Row,'C',$DefaultRowHeight);
  $posArr = explode(',',$ColPosArray[3]);
  incPdfFunc_CellTableHeaderRowCol($ObjPdf,$posArr[2],$ftype,$fontSize,$posArr[0],$posArr[1],$Row,'C',$DefaultRowHeight);
  $posArr = explode(',',$ColPosArray[4]);
  incPdfFunc_CellTableHeaderRowCol($ObjPdf,$posArr[2],$ftype,$fontSize,$posArr[0],$posArr[1],$Row,'C',$DefaultRowHeight);
  $posArr = explode(',',$ColPosArray[5]);
  incPdfFunc_CellTableHeaderRowCol($ObjPdf,$posArr[2],$ftype,$fontSize,$posArr[0],$posArr[1],$Row,'C',$DefaultRowHeight);

  //Body部 5回繰り返し
  $fill = true;
  for($i=1;$i<=5;$i++){
    $Row++;
    $fill=!$fill;

    $posArr = explode(',',$ColPosArray[0]);
    incPdfFunc_CellTableBodyRowCol($ObjPdf,'A'.$Row,$ftype,$fontSize,$posArr[0],$posArr[1],$Row,'C',$DefaultRowHeight,$fill);
    $posArr = explode(',',$ColPosArray[1]);
    incPdfFunc_CellTableBodyRowCol($ObjPdf,'B'.$Row,$ftype,$fontSize,$posArr[0],$posArr[1],$Row,'C',$DefaultRowHeight,$fill);
    $posArr = explode(',',$ColPosArray[2]);
    incPdfFunc_CellTableBodyRowCol($ObjPdf,'C'.$Row,$ftype,$fontSize,$posArr[0],$posArr[1],$Row,'C',$DefaultRowHeight,$fill);
    $posArr = explode(',',$ColPosArray[3]);
    incPdfFunc_CellTableBodyRowCol($ObjPdf,'D'.$Row,$ftype,$fontSize,$posArr[0],$posArr[1],$Row,'C',$DefaultRowHeight,$fill);
    $posArr = explode(',',$ColPosArray[4]);
    incPdfFunc_CellTableBodyRowCol($ObjPdf,'E'.$Row,$ftype,$fontSize,$posArr[0],$posArr[1],$Row,'C',$DefaultRowHeight,$fill);
    $posArr = explode(',',$ColPosArray[5]);
    incPdfFunc_CellTableBodyRowCol($ObjPdf,'F'.$Row,$ftype,$fontSize,$posArr[0],$posArr[1],$Row,'C',$DefaultRowHeight,$fill);
  }

縦線、横線で枠を作ってみる

デモ 縦線、横線で枠を作ってみる

  //長方形を描く 行と列で指定する
  //50カラムから150列 17行目から30行目に長方形
  $StCol = 50;
  $EdCol = 150;
  $StRow = 17;
  $EdRow = 30;
  incPdfFunc_RectRowCol($ObjPdf,$DefaultRowHeight,$StCol,$EdCol,$StRow,$EdRow);

  //横線
  //50列から100列 18行目に横線
  $StCol = 50;
  $EdCol = 100;
  $Row = 18;
  incPdfFunc_HLineRowMulti($ObjPdf,$DefaultRowHeight,$StCol,$EdCol,$Row);

  //50列から75列 20行目から3本2行間隔の横線
  $StCol = 50;
  $EdCol = 75;
  $Row = 20;
  $rep = 3;
  $repRow = 2;
  incPdfFunc_HLineRowMulti($ObjPdf,$DefaultRowHeight,$StCol,$EdCol,$Row,$rep,$repRow);


  //18行目から24行目の75列に縦線
  $StRow = 18;
  $EdRow = 24;
  $Col = 75;
  incPdfFunc_VLineRowMulti($ObjPdf,$RowHeight,$Col,$StRow,$EdRow);

  //17行目から30行目の100列に縦線
  $StRow = 17;
  $EdRow = 30;
  $Col = 100;
  incPdfFunc_VLineRowMulti($ObjPdf,$RowHeight,$Col,$StRow,$EdRow);

  //17行目から30行目の110列から3本15列間隔に縦線
  $StRow = 17;
  $EdRow = 30;
  $Col = 110;
  $rep = 3;
  $repCol = 15;
  incPdfFunc_VLineRowMulti($ObjPdf,$RowHeight,$Col,$StRow,$EdRow,$rep,$repCol);

最終的に、チャートをコメントにして完成です。

デモ TCPDFを行・列指定で利用するサンプル

いかがですか、incPdfFunc.phpを使って直感的にPDFを出力してみませんか。

※著作権はICTcacaoに帰属しますが、ダウンロードして自由に改変してご利用ください。
incPdfFunc.phpは、フリーウェア(商用利用可)です。ただし、ICTCacao用に作ったライブラリのため、動作の保証はありませんのでご了承ください。

incPdfFunc.phpのダウンロードをダウンロード