PHP : TCPDF の Cell を使って位置指定印字を行うサンプル

  概要



Cell はそのままでは、自動的にカラムと行が調整されて印字されるので、既存のフォームに重ね合わせて印字するように考えられていません。しかし、1ドットづつ位置指定して、ページ内で前後関係無く好きな位置にテキストが印字できる Text メソッドがあります。但しこのメソッドは古いメソッドで、機能は何もないので不便です。

そこで、Cell を使って位置指定印字を行う事によって、数値編集フォーマット等の右寄せの印刷に簡単に対応できるようにしました。以下の二つのメソッドで通常の印字は容易に行えると思います。

  
//**********************************************************
// 位置指定印字( 左詰め )
//**********************************************************
function text( $pdf, $x=0, $y=0, $txt='', $w=1, $h=0  ) {

	$a = $pdf->GetX();
	$b = $pdf->GetY();

	$pdf->SetXY( $x, $y );
	$pdf->Cell($w, $h, $txt, 0, 0, 'L');

	$pdf->SetXY($a,$b);

}

//**********************************************************
// 位置指定印字( 右詰め )
//**********************************************************
function textR( $pdf, $x=0, $y=0, $txt='', $w=1, $h=0  ) {

	$a = $pdf->GetX();
	$b = $pdf->GetY();

	$pdf->SetXY( $x, $y );
	$pdf->Cell($w, $h, $txt, 0, 0, 'R');

	$pdf->SetXY($a,$b);

}
  

$w = 1 がデフォルトとなっていますが、これは枠線を引いたり、右寄せする時にのみ意味があるので、
テキストだけならば省略できます。$h の高さも、実際のフォントの高さより小さい場合は無視できるので
省略可能です


※ クラスにするのであれば、$pdf は省略可能になります。
(例)
--------------------------------------------------------------------
$pr = new TextOut( $pdf );
$pr->text( 40, 0, "社員一覧表" );
--------------------------------------------------------------------


関連する記事

PHP : TCPDF の Cell で一覧表を印字するサンプル




  ソースコード



syain2.pdf ( 以下のコードで出力したものです )

syain2.php ( utf8n )
001.<?php
002.//**********************************************************
003.// require の 検索パスを設定
004.//**********************************************************
005.$path = "C:\\user\\web\\tcpdf_5_5_001";
006.set_include_path(get_include_path() . PATH_SEPARATOR . $path);
007. 
008.//**********************************************************
009.// TCPDF ライブラリ
010.//**********************************************************
011.require_once('tcpdf/config/lang/eng.php');
012.require_once('tcpdf/tcpdf.php');
013. 
014.//**********************************************************
015.// Windows の場合は MySQL用の外部ライブリをロード
016.//**********************************************************
017.if ( substr(PHP_OS,0,3) == 'WIN' ) {
018.    if ( !extension_loaded( "mysql" ) ) {
019.        dl("php_mysql.dll");
020.    }
021.}
022. 
023.//**********************************************************
024.// MySQL 接続文字列
025.//**********************************************************
026.$Server = 'localhost';
027.$DbName = 'lightbox';
028.$User = 'root';
029.$Password = 'password';
030. 
031.//**********************************************************
032.// 接続
033.//**********************************************************
034.$Connect = @mysql_connect( $Server, $User, $Password );
035.if ( !$Connect ) {
036.    header( "Content-Type: text/html; Charset=euc-jp" );
037. 
038.    mb_language( "ja" );
039.    mb_internal_encoding("UTF-8");
040.    $str = mb_convert_encoding( "接続エラーです", "euc-jp", "utf-8" );
041.    print $str;
042. 
043.    exit();
044.}
045. 
046.//**********************************************************
047.// 必要なら、DB からのキャラクタセットを変換する
048.// ( PHP 5 >= 5.2.3 ) で利用可能
049.// ※ DB が utf8でソースもutf8 なら必要ありません
050.// ※ php5.2.3 より前なら mb_convert_encoding で日本語を
051.//   変換します
052.//**********************************************************
053.// mysql_set_charset("utf8", $Connect);
054.//mysql_set_charset("eucjpms", $Connect);
055.//mysql_set_charset("cp932", $Connect);
056. 
057.//**********************************************************
058.// DB選択
059.//**********************************************************
060.mysql_select_db( $DbName, $Connect );
061. 
062.//**********************************************************
063.// クエリ
064.//**********************************************************
065.$query = "select 社員マスタ.*,DATE_FORMAT(生年月日,'%Y-%m-%d') as 誕生日";
066.$query .= " from 社員マスタ";
067.$result = mysql_query($query, $Connect);
068. 
069.//**********************************************************
070.// PDFオブジェクトを作成
071.//
072.// TCPDF __construct(
073.// [string $orientation = 'P'],
074.//   P or PORTRAIT(縦:既定)
075.//   L or LANDSCAPE(横))
076.// [string $unit = 'mm'],
077.//   pt: ポイント
078.//   mm: mm(既定)
079.//   cm: cm
080.//   in: インチ
081.// [mixed $format = 'A4'],
082.//    4A0 | 2A0 | A0 | A1 | A2 | A3 | A4(既定) | A5 | A6 | A7 | A8 | A9 | A10
083.//   | B0 | B1 | B2 | B3 | B4 | B5 | B6 | B7 | B8 | B9 | B10
084.//   | C0 | C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 | C9 | C10
085.//   | RA0 | RA2 | RA3 | RA4 | SRA0 | SRA1 | SRA2 | SRA3 | SRA4
086.//   | LETTER | LEGAL | EXECUTIVE | FOLIO
087.// [boolean $unicode = true],
088.// [String $encoding = 'UTF-8'],
089.// [boolean $diskcache = false])
090.//
091. 
092.//**********************************************************
093.$pdf = new TCPDF(
094.    PDF_PAGE_ORIENTATION,
095.    PDF_UNIT,
096.    PDF_PAGE_FORMAT,
097.    true,
098.    "UTF-8",
099.    false
100.);
101.//**********************************************************
102.// ヘッダーとフッターは無し
103.//**********************************************************
104.$pdf->setPrintHeader(false);
105.$pdf->setPrintFooter(false);
106. 
107.//**********************************************************
108.// ページコントロール用変数
109.//
110.// $line_no は次に印字する行
111.// ※ この場合タイトル行数も含む
112.//**********************************************************
113.$line_no = 0;
114.$line_max = 10;
115.$data_top = 25;
116.$data_left = 10;
117. 
118.//**********************************************************
119.// 1ページ目(ページの追加)
120.//**********************************************************
121.$pdf->AddPage();
122. 
123.//**********************************************************
124.// 日本語データを扱うので、使うフォントを
125.// 日本語フォントに設定する
126.//**********************************************************
127.$pdf->SetFont('arialunicid0', '', 8);
128. 
129.//**********************************************************
130.// データの出力
131.//**********************************************************
132.while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
133. 
134.    // ここでは既にデータが存在する事が確定しているので、
135.    // 初回および最大印字行数をオーバーしている場合はヘッダを印字する
136.    if ( $line_no == 0 || $line_no > $line_max ) {
137.        user_titie( $pdf );
138.    }
139. 
140.    // 社員名出力
141.    // $data_top : 開始 Y マージン
142.    // タイトルからの距離 + 5
143.    // 行間 * 5
144.    $row_position = $data_top + 5 +($line_no-3) * 5;
145.    text( $pdf$data_left + 0,  $row_position, $row['社員コード'] );
146.    text( $pdf$data_left + 15, $row_position, $row['氏名'] );
147.    // 右寄せ出力は幅を指定する
148.    textR( $pdf, $data_left + 35, $row_position, user_number_format($row['給与']), 20 );
149. 
150.    // 次の印字行
151.    $line_no++;
152. 
153.}
154. 
155.//**********************************************************
156.//PDFを出力
157.// Output(
158.// [string $name = 'doc.pdf'],
159.// [string $dest = 'I'])
160.// I: ブラウザに出力する(既定)、
161.// D: ブラウザで(強制的に)ダウンロードする。
162.// F: ローカルファイルとして保存する。
163.// S: PDFドキュメントの内容を文字列として出力する。
164.//**********************************************************
165.$pdf->Output("sample.pdf", "I");
166. 
167.//**********************************************************
168.// MySQL 接続解除
169.//**********************************************************
170.mysql_close($Connect);
171. 
172. 
173.//**********************************************************
174.// タイトル部印字関数
175.//**********************************************************
176.function user_titie( $pdf ) {
177. 
178.    global $line_no;
179.    global $data_top,$data_left;
180. 
181.    // 初回以外は改ページ
182.    if ( $line_no != 0 ) {
183.        $pdf->AddPage();
184.    }
185. 
186.    // 画像出力
187.    // ファイル名は、http://~ を指定可能
188.    $pdf->Image(
189.        './winofsql.png',
190.        10,
191.        3,
192.        0,
193.        0,
194.        'PNG',
195.        'http://winofsql.jp/',
196.        '',
197.        false,
198.        300,
199.        '',
200.        false,
201.        false,
202.        0,
203.        false,
204.        false,
205.        false
206.    );
207. 
208. 
209.    $pdf->SetFont('arialunicid0', '', 40);
210.    text( $pdf, 40, 0, "社員一覧表"  );
211. 
212.    $pdf->SetFont('arialunicid0', '', 8);
213.    text( $pdf, $data_left + 0, $data_top + 0, "社員CD"  );
214.    text( $pdf, $data_left + 15, $data_top + 0, "氏名"  );
215.    textR( $pdf, $data_left + 35, $data_top + 0, "給与", 20  );
216. 
217.    $line_no = 3;
218. 
219.}
220. 
221.//**********************************************************
222.// カンマ編集( 空文字は 0 )
223.//**********************************************************
224.function user_number_format($param) {
225. 
226.    if ( trim($param) == '' ) {
227.        $param = "0";
228.    }
229. 
230.    return number_format($param);
231. 
232.}
233. 
234.//**********************************************************
235.// 位置指定印字( 左詰め )
236.//**********************************************************
237.function text( $pdf, $x=0, $y=0, $txt='', $w=1, $h=0  ) {
238. 
239.    $a = $pdf->GetX();
240.    $b = $pdf->GetY();
241. 
242.    $pdf->SetXY( $x, $y );
243.    $pdf->Cell($w, $h, $txt, 0, 0, 'L');
244. 
245.    $pdf->SetXY($a,$b);
246. 
247.}
248. 
249.//**********************************************************
250.// 位置指定印字( 右詰め )
251.//**********************************************************
252.function textR( $pdf, $x=0, $y=0, $txt='', $w=1, $h=0  ) {
253. 
254.    $a = $pdf->GetX();
255.    $b = $pdf->GetY();
256. 
257.    $pdf->SetXY( $x, $y );
258.    $pdf->Cell($w, $h, $txt, 0, 0, 'R');
259. 
260.    $pdf->SetXY($a,$b);
261. 
262.}
263. 
264.?>













   SQLの窓    create:2010/06/23  update:2018/02/18   管理者用(要ログイン)





フリーフォントWEBサービス

SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ