余計なメソッドは使わずに構成しています、TCPDF を継承して Cell を使った位置指定印字を可能にしているので、右寄せの印字は簡単に行えます。また、行の高さを使用しているフォントから取得しているので、フォントに依存せずに行の高さが自動的に利用されます。( 但し、フォントサイズを変更すると横の開始位置は変化しないので変更は必要になります ) 本来は、行コントロール(1ページに何行を印字するか)を行うところですが、PDF では 罫線や画像も簡単に重ねる事ができるので、座標で行方向のコントロールをしています。 『設定』は、テンプレートなので最低限の設定で、本来の印字内容に影響を与えないように設定しています。 フォントは、メイリオを使用しています。『TCPDF で非埋め込み型として『メイリオ』を使う手順』を参照して下さい。
<?php // *********************************************** // // プログラム名 : 社員一覧印刷 // 作 成 者 : lightbox // 作 成 日 : 2014/06/06 // // 概要 : // 印刷処理の為のテンプレート // // *********************************************** header( "pragma: no-cache" ); header( "Expires: Wed, 31 May 2000 14:59:58 GMT" ); header( "Cache-control: no-cache" ); mb_language( "ja" ); mb_internal_encoding("UTF-8"); // ********************************************************* // TCPDF インストール場所の設定 // ********************************************************* $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'); // ********************************************************* // 拡張 TCPDF // ※ クラス定義は、処理より前に必要です // ********************************************************* class USER_TCPDF extends TCPDF { // ************************************* // 位置指定 Cell 印字 // ※ 内部印字位置は保存( 元に戻す ) // ************************************* public function user_text( $x=0, $y=0, $txt='', $w=1, $h=0, $p="L" ) { $a = $this->GetX(); $b = $this->GetY(); $this->SetXY( $x, $y ); $this->Cell($w, $h, $txt, 0, 0, $p); $y += $this->getLastH(); $this->SetXY($a,$b); return $y; } } // *********************************************** // データベース // *********************************************** $server = 'localhost'; $db_name = 'lightbox'; $user = 'root'; $password = 'パスワード'; $connect = @ new mysqli($server, $user, $password, $db_name); if ($connect->connect_error) { die('Connect Error (' . $connect->connect_errno . ') ' . $connect->connect_error); } // *********************************************** // 主処理 // *********************************************** query_print(); // *********************************************** // データベース読み出しと印字 // *********************************************** function query_print() { global $connect; //**************************************** // インスタンス作成 //**************************************** $pdf = new USER_TCPDF( "P", "mm", "A4", true, "UTF-8", false, false // PDF/A モード ); //**************************************** // 設定 //**************************************** $pdf->setFontSubsetting(false); $pdf->setPrintHeader(false); $pdf->setPrintFooter(false); // デフォルトが true なので、デバッグ時に混乱しないように false に設定 $pdf->SetAutoPageBreak(false); // フォントサイズ $pdf->SetFont('meiryo001', '', 12); //**************************************** // 最初のページを作成 // ※これを実行しないと、ページ情報が無い //**************************************** $pdf->AddPage(); $query = apply_value("select.sql"); $result = $connect->query($query); // ブラウザに PDF を出力しているので、デバッグ出力はファイルに行う file_put_contents("log.txt",print_r($result,true)); $counter = 0; if ( $result->num_rows != 0 ) { $cur_position = print_header( $pdf ); while ($row = $result->fetch_array(MYSQLI_BOTH)) { $counter++; if ( $counter > 40 ) { $counter = 0; $pdf->AddPage(); $cur_position = print_header( $pdf ); } $next_position = $pdf->user_text( 10, $cur_position, $row['社員コード'] ); $pdf->user_text( 28, $cur_position, $row['氏名'] ); $pdf->user_text( 58, $cur_position, $row['フリガナ'] ); $pdf->user_text( 110, $cur_position, number_format($row['給与']), 20, 0, "R" ); $pdf->user_text( 130, $cur_position, number_format($row['手当']+0), 26, 0, "R" ); $pdf->user_text( 160, $cur_position, substr($row['生年月日'],0,10)); $cur_position = $next_position; } } else { $page_info = $pdf->getPageDimensions(); $cur_position = $page_info['tm']; // トップマージン $pdf->user_text( 10, $cur_position, "データが存在しません" ); } // ブラウザへ PDF を出力します $pdf->Output("syain.pdf", "I"); } // *********************************************** // ヘッダ印字 // *********************************************** function print_header( $pdf ) { $page_info = $pdf->getPageDimensions(); $row_position = $page_info['tm']; // トップマージン // 1行目 $next_position = $pdf->user_text( 75, $row_position, "※※ 社員マスター一覧表 ※※" ); $row_position = $next_position; // 2行目 $next_position = $pdf->user_text( 0, $row_position, "" ); $row_position = $next_position; // 3行目 $next_position = $pdf->user_text( 10, $row_position, "コード" ); $pdf->user_text( 28, $row_position, "名前" ); $pdf->user_text( 58, $row_position, "フリガナ" ); $pdf->user_text( 110, $row_position, "給与", 20, 0, "R" ); $pdf->user_text( 130, $row_position, "手当", 26, 0, "R" ); $pdf->user_text( 160, $row_position, "生年月日"); $row_position = $next_position; return $row_position; } // ********************************************************** // テキストファイル内の文字列を取得 // ********************************************************** function apply_value( $path ) { $value = file_get_contents( $path ); $value = str_replace('"', '\\"', $value ); eval("\$value = \"$value\";"); return $value; } ?>
実行結果 オンラインマニュアルについて 残念ながら、オリジナルはかなり間違いが多いので使えません。日本語訳をしてくれている、TCPDFマニュアル(勝手訳)がとても良くできています。オリジナルの間違いは見事に訂正されていました。 ただ、コンストラクタが無かったので作りました。 コンストラクタ
コンストラクタ | TCPDF::__construct ( $orientation = 'P', $unit = 'mm', $format = 'A4', $unicode = true, $encoding = 'UTF-8', $diskcache = false, $pdfa = false ) |
引数 | |
$orientation (string) |
用紙の向き P or Portrait (default) : 縦 L or Landscape : 横 |
$unit (string) |
長さの単位 pt: ポイント mm: ミリメートル (default) cm: センチメートル in: インチ |
$format (string) |
用紙サイズ |
$unicode (boolean) |
TRUE の場合は、入力データは Unicode |
$encoding (string) |
キャラクタセット。省略すると UTF-8. |
$diskcache (boolean) |
ディスクキャッシュを使うかどうか |
$pdfa (boolean) |
PDF/A mode を使うかどうか( 絶対使いません ) |
|