PHP
PDF出力
tcPDF

TCPDFで差し込み印刷をする

PHPを使って、html形式などを出力できるtcPDF。これを使って差し込み印刷ができる機能が必要になったので、作ってみました。


ポイント


  • 表などのテンプレートを用意して、背景画像にする。

  • 背景画像を元にhtmlを構築する。

  • PDFを複数枚印刷できるようにループさせる。

以上の流れとなります。その結果作成したプログラムがこちら


PHP

        //ヘッダの制御(注1)

class MYPDF extends TCPDF {
public function Header(){
$this->SetAutoPageBreak(false, 0); //ページを表示させない
$this->Image(BACKGROUND_IMAGE_PATH, 0, 0, 210, 297, '', '', '', false, 300, '', false, false, 0); //背景画像を設定
}
}

define("MY_PDF_PAGE_ORIENTATION" , "P"); // P:Portrait(縦向き), L:Landscape(横向き)
define("MY_PDF_FONT_NAME" , "kozminproregular"); // 使用するフォント
define("MY_PDF_FONT_SIZE" , 10); //デフォルトのフォントサイズ
define("MY_PDF_UNIT" , "mm"); //用紙の単位
define("MY_PDF_PAGE_FORMAT" , "A4"); //用紙のサイズ
define("MY_PDF_IMAGE_SCALE_RATIO" , 1); //比率
define("MY_PDF_MARGIN_HEADER" , 0); //ヘッダに対するマージン
define("MY_PDF_MARGIN_FOOTER" , 0); //フッタに対するマージン
define("MY_PDF_MARGIN_TOP" , 10); //全体に対する上余白
define("MY_PDF_MARGIN_LEFT" , 15); //全体に対する左余白
define("MY_PDF_MARGIN_RIGHT" , 15); //全体に対する右余白
define("MY_PDF_MARGIN_BOTTOM" , 20); //全体に対する下余白
define("BACKGROUND_IMAGE_PATH" , "img/bg_{$mode}.png"); //下書きに使いたい画像

//オブジェクト生成
$pdf = new MYPDF(MY_PDF_PAGE_ORIENTATION, MY_PDF_UNIT, MY_PDF_PAGE_FORMAT, true, 'UTF-8', false);
$html = "任意のhtmlをテーブルで作成する(画像化した表と合わせる)"
//必要ページ分のpdfデータ準備////////////////////////////////
foreach ($recepts as $data ){
// ページ文の追記
$pdf -> SetTitle('PDFの差し込み印刷');
$pdf -> SetMargins(MY_PDF_MARGIN_LEFT, MY_PDF_MARGIN_TOP, MY_PDF_MARGIN_RIGHT);
$pdf -> setPrintHeader(true); //ページもヘッダで制御する
$pdf -> setPrintFooter(false); //フッタは使わない
$pdf -> setImageScale(MY_PDF_IMAGE_SCALE_RATIO);
$pdf -> SetFont(MY_PDF_FONT_NAME, "", 10);
$pdf -> AddPage(); //ページの始まり
// PDFに変換するHTML
$pdf -> writeHTML($html, true, false, true, false, '');
$pdf -> lastPage(); //ページの終わり
}
$fileData = $pdf-> Output(null,'S'); // デバッグ



注意点

ページ番号の調整をヘッダで指定しているのは、下絵をヘッダに設定しているためです。もし、フッタでページ番号を調整しようとするとフッタ分のマージンができてしまい、大幅に印字がずれてしまうことになります。


html部分の構築について

まず、注意しておくとCSSはほとんど使えません。特に位置を制御するCSSは全くないといっていいと思います。ただ、paddingプロパティだけは使えるので、それで全コンテンツの位置を調整します。

後日、詳述


実務で使う場合

結局は、コンテンツに対する余白など最終的にはプリンタの性能に依存しますが、コンテンツそのものをテーブルで作成する限り、大きく崩れたりはしないので、そこそこの品質を維持できるはずです。