昔、汎用機を使っていた頃の帳票設計は、チャート用紙を使って設計してからコード化していたことを思い出した。
そこで、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カラムにテキストを出力してみる
//ページ追加
$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);
最終的に、チャートをコメントにして完成です。
いかがですか、incPdfFunc.phpを使って直感的にPDFを出力してみませんか。
※著作権はICTcacaoに帰属しますが、ダウンロードして自由に改変してご利用ください。
incPdfFunc.phpは、フリーウェア(商用利用可)です。ただし、ICTCacao用に作ったライブラリのため、動作の保証はありませんのでご了承ください。