SQLの窓 イラストAC フリー素材

2014年09月28日

TCPDF + FPDI : PHP で既存 PDF を読み込んで加工してブラウザに送る

8年の月日が流れましたが、FPDFTCPDF に変えても、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 利用の部分は日本語マニュアル無いみたいですし・・・
でもまあ、プログラマなら理解できる程度の英語です。


posted by at 2014-09-28 01:15 | PHP+PDF | このブログの読者になる | 更新情報をチェックする


Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX