8年の月日が流れましたが、FPDF を TCPDF に変えても、FPDI が自動的に全て処理するので、TCPDF のプラグインのような形で動作します。 ▼ main ではこんなかんじrequire_once("../common/tcpdf_include.php"); require_once("../../fpdi/fpdi.php"); require_once("../common/common.php"); require_once("model.php");
<?php // *********************************************** // // 部 品 名 : モデル // プログラム名 : 社員一覧印刷 // 作 成 者 : lightbox // 作 成 日 : 2014/06/06 // // 概要 : // 印刷処理の為のテンプレート // ここでは、プログラム固有の処理を定義します // // *********************************************** // *********************************************** // データベース読み出し // *********************************************** function query() { global $connect,$row,$SEARCH_DATA; $pdf = new FPDI( "L", PDF_UNIT, "A4", true, "UTF-8", false, false // PDF/A モード ); # PDF を読み込んでページ数を得る $pagecount = $pdf->setSourceFile("Book1.pdf"); # ページ番号より ID を取得する $tplidx = $pdf->ImportPage(1); //********************************************************** // 設定 //********************************************************** $pdf->setFontSubsetting(false); $pdf->setPrintHeader(false); $pdf->setPrintFooter(false); $pdf->SetFont('meiryo001', '', 12); // デフォルトが true なので、デバッグ時に混乱しないように false に設定 $pdf->SetAutoPageBreak(false); $pdf->AddPage(); // テンプレートの適用 $pdf->useTemplate($tplidx); // AddPage 実行後に取得する $query = apply_value("select.sql"); $result = $connect->query($query); $counter = 0; $cur_position = print_header( $pdf ); while ($row = $result->fetch_array(MYSQLI_BOTH)) { $counter++; if ( $counter > 20 ) { $counter = 0; $pdf->AddPage(); // テンプレートの適用 $pdf->useTemplate($tplidx); $cur_position = print_header( $pdf ); } user_text( $pdf, 10, $cur_position, $row['社員コード'] ); user_text( $pdf, 28, $cur_position, $row['氏名'] ); $cur_position = user_text( $pdf, 63, $cur_position, number_format($row['給与']), 20, 0, "R" ); } // ブラウザへ PDF を出力します $pdf->Output("syain.pdf", "I"); // 実際の SQL の結果の情報を返します return $result; } // *********************************************** // ヘッダ印字 // *********************************************** function print_header( $pdf ) { $page_info = $pdf->getPageDimensions(); $cur_position = $page_info['tm']; // トップマージン $cur_position = user_text( $pdf, 125, $cur_position, "社員マスター一覧表" ); $cur_position = user_text( $pdf, 0, $cur_position, "" ); user_text( $pdf, 10, $cur_position, "コード" ); user_text( $pdf, 28, $cur_position, "名前" ); $cur_position = user_text( $pdf, 63, $cur_position, "給与", 20, 0, "R" ); return $cur_position; } ?>
TCPDF で動作している場合 FPDI を 読み込んで、TCPDF クラス をそのまま FPDI クラスに変更し、既存 PDF を読み込んで、AddPage する毎にテンプレート使用( $pdf->useTemplate($tplidx) ) を実行するだけです。 本来の目的であるフォームのオーバーレイを想定して、枠線だけを持つ PDF を Microsoft Excel で作成して重ねました。 実行結果 FPDI のドキュメントはこちらを参照 ▼ 以下は TCPDF 用の実行環境設定用のファイルです( require_once します )
<?php // Include the main TCPDF library (search for installation path). $path = "C:\user\web\tcpdf"; set_include_path(get_include_path() . PATH_SEPARATOR . $path); require_once('examples/config/tcpdf_config_alt.php'); require_once('tcpdf.php'); ?>
▼ 以下は、印字用の関数です( 今回の FPDI に関するでページあふれ対応はしていません )
# ********************************************************** # テキスト印字 # ********************************************************** function user_text( $pdf, $x, $y, $text, $w=1, $h=0, $p="L" ) { text( $pdf, $x, $y, $text, $w, $h, $p ); return $y; } # ********************************************************** # 位置指定印字 # ※ 改行コードで自動改行 # ※ ページあふれで自動改ページ # ※ 内部印字位置は保存( 元に戻す ) # ********************************************************** function text( $pdf, $x=0, &$y=0, $txt='', $w=1, $h=0, $p="L" ) { $a = $pdf->GetX(); $b = $pdf->GetY(); $hm = $pdf->getPageHeight( ); $dm = $pdf->getPageDimensions(); $tm = $dm['tm']; $bm = $dm['bm']; $txt = str_replace( "\r","", $txt ); $data = explode("\n", $txt ); if ( count( $data ) > 1 ) { for( $i = 0; $i < count($data); $i++ ) { if ( $i == 0 ) { $pdf->SetXY( $x, $y ); } else { $y += $pdf->getLastH(); if ( $y >= ( $hm - $tm - $bm ) ) { $pdf->AddPage(); $y = $tm; } $pdf->SetXY( $x, $y ); } $pdf->Cell($w, $h, $data[$i], 0, 0, $p); } } else { $pdf->SetXY( $x, $y ); $pdf->Cell($w, $h, $txt, 0, 0, $p); } $y += $pdf->getLastH(); $pdf->SetXY($a,$b); }
TCPDF に関しては、『TCPDFマニュアル(勝手訳)』といのが検索するとすぐ見つかります。これでほぼ OK です。 関連する記事 TCPDF で非埋め込み型として『メイリオ』を使う手順 ▼ 以下は古い記事です 2006-11-26 の記事 PDF は、基本ブラウザに埋め込まれるので、Webアプリの印刷処理として最適です。 多少制限もありますが普通に日本語使えますし。知らないと損しますね。 詳細は↓ http://winofsql.jp/VA003334/phpVarious061126183640.htm 一つのパッケージでは無いので構成するのにそれなりの知識が必要になります。ソースも少し書き換えが発生します。 既存のPDF 利用の部分は日本語マニュアル無いみたいですし・・・ でもまあ、プログラマなら理解できる程度の英語です。