忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

PHP PDF出力の方法について・矩形領域への文字列出力(Cellメソッド)

前回の 「PHP PDF出力の方法について・マージンとヘッダ/フッタ(TCPDF)」 の記事ではヘッダ/フッタ出力に Cell メソッドを説明なしで使用していましたので、あらためて説明したいと思います。

Cell メソッドの引数は以下の様になっていますので、大まかに各引数について説明します。

// Cellメソッド
public function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='', 
					  $stretch=0, $ignore_min_height=false, $calign='T', $valign='M')
// $w      : 矩形領域の幅、0であれば、右マージンまで自動的に拡張される。
// $h      : 矩形領域の縦幅(デフォルト:0)
// $txt    : 表示文字列(デフォルト:"")
// $border : 境界線表示(0:枠無し,1:枠有 または "LRTB"の文字列で「左右上下」を指定)
// $ln     : 出力後のカーソルの移動方法を指定
//           [0]: 右へ移動(既定)
//           [1]: 次の行へ移動
//           [2]: 下へ移動
// $align  : テキストの整列を指定
//           [L] or 空文字: 左揃え(既定)
//           [C]: 中央揃え
//           [R]: 右揃え
//           [J]: 両端揃え
// $fill   : 矩形領域の塗つぶし指定
//           [false] : 透明(既定)
//           [true]  : 塗つぶす
// $link   : 登録するリンク先のURL
// $stretch: テキストの伸縮(ストレッチ)モード:
//           [0] : なし
//           [1] : 必要に応じて水平伸縮
//           [2] : 水平伸縮
//           [3] : 必要に応じてスペース埋め
//           [4] : スペース埋め
// $ignore_min_height:「true」矩形領域の高さの最小値調整をしない
// $calign : 指定されたY座標に対するセルの配置
//           [T] : cell top
//           [C] : center
//           [B] : cell bottom
//           [A] : font top
//           [L] : font baseline
//           [D] : font bottom
// $valign : セルの中のテキストの垂直方向の配置
//           [T] : top
//           [M] : middle
//           [B] : bottom




■$border : 境界線表示

境界線表示の引数「$border」は以下の様になっていますので、それぞれを順次テストしてみます。

  • 数値(0):枠無し
  • 数値(1):枠有り
  • 文字列("LRTB"):枠線の「左右上下」を指定

<?php
require_once('../tcpdf/tcpdf.php');

// クラス生成
$pdf = new TCPDF();

// デフォルトで用意されている日本語フォント[小塚ゴシックPro M]
$strFont = "kozgopromedium";
// ヘッダ・フッタ出力設定(特にいらないが)
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
// 本文の日本語フォント[小塚ゴシックPro M]
$pdf->SetFont($strFont, "", 10);

// 新しいpdfページを追加
$pdf->AddPage();

// border テスト
$pdf->Write(0, 'border テスト', '', false, '', true);
$pdf->Cell(0, 0, '$border [0]:枠無し'             , 0, 1);
$pdf->Ln();
$pdf->Cell(0, 0, '$border [1]:枠有り'             , 1, 1);
$pdf->Ln();
$pdf->Cell(0, 0, '$border ["L"]:「左」枠'         , 'L', 1);
$pdf->Ln();
$pdf->Cell(0, 0, '$border ["LT"]:「左上」枠'      , 'LT', 1);
$pdf->Ln();
$pdf->Cell(0, 0, '$border ["LTR"]:「左上右」枠'   , 'LTR', 1);
$pdf->Ln();
$pdf->Cell(0, 0, '$border ["LTRB"]:「左上右下」枠', 'LTRB', 1);
$pdf->Ln();

// pdf表示設定
$pdf->Output('pdf3-1.pdf', 'I');  // 'I':ブラウザに出力する(既定)
?>

これの実行結果は以下の通りです。


Cell メソッドの $w 及び $h 引数はそれぞれ「0」に設定してますが、 $w は「0」とすることで右マージンまでの横方向の領域の指定となります。 $h の「0」指定は指定されている文字フォントのポイント数分の縦幅が出力領域の指定となります。

また $ln は「1」として出力後のカーソルの位置を次の行の先頭に来る様に指定しています。 これを行うことで順次出力が出来る様になります。

Ln メソッドは行を開ける為に使っていますが、このメソッドは以下の様な引数になっています。
例では引数は省略していますので、直前の Cell メソッドの出力の縦幅になります。

public function Ln( $h, $cell )
// $h    : 改行する高さ(既定値:直近で処理したセルの高さ)
// $cell : trueの場合、次の行の左端からcMarginだけカーソルを右に移動(既定値:false)




■$align : テキストの整列を指定

テキストの整列の引数「$align」は以下の様になっていますので、それぞれを順次テストしてみます。

  • 文字列("L"):左揃え
  • 文字列("C"):中央揃え
  • 文字列("R"):右揃え
  • 文字列("J"):両端揃え

<?php
require_once('../tcpdf/tcpdf.php');

// クラス生成
$pdf = new TCPDF();

// デフォルトで用意されている日本語フォント[小塚ゴシックPro M]
$strFont = "kozgopromedium";
// ヘッダ・フッタ出力設定(特にいらないが)
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
// 本文の日本語フォント[小塚ゴシックPro M]
$pdf->SetFont($strFont, "", 10);

// 新しいpdfページを追加
$pdf->AddPage();

// align テスト
$pdf->Write(0, 'align テスト', '', false, '', true);
$pdf->Cell(0, 0, '$align ["L"]:左揃え'  , 1, 1, "L");
$pdf->Ln();
$pdf->Cell(0, 0, '$align ["C"]:中央揃え', 1, 1, "C");
$pdf->Ln();
$pdf->Cell(0, 0, '$align ["R"]:右揃え'  , 1, 1, "R");
$pdf->Ln();
$pdf->Cell(0, 0, '$align A B C D ["J"]:両端揃え', 1, 1, "J");
$pdf->Ln();

// pdf表示設定
$pdf->Output('pdf3-2.pdf', 'I');  // 'I':ブラウザに出力する(既定)
?>

実行結果は以下の様な表示になるはずです。
両端揃え」の指定は、表示文字列を空白で分解して均等割りで揃えるようです。



■$fill : 矩形領域の塗つぶし指定

矩形領域の塗つぶし指定の引数「$fill」は以下の様になっていますので、それぞれを順次テストしてみます。

  • boolean値(false):塗つぶし無し
  • boolean値(true) :塗つぶし有り


塗つぶしを行う場合は、塗りつぶしの色設定をしないと初期値(黒)のままで処理されるので SetFillColor メソッドで色設定を行います。
以下の例では RGB の指定で「128, 128, 128」なので濃い灰色な感じで塗りつぶしされます。

<?php
require_once('../tcpdf/tcpdf.php');

// クラス生成
$pdf = new TCPDF();

// デフォルトで用意されている日本語フォント[小塚ゴシックPro M]
$strFont = "kozgopromedium";
// ヘッダ・フッタ出力設定(特にいらないが)
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
// 本文の日本語フォント[小塚ゴシックPro M]
$pdf->SetFont($strFont, "", 10);

// 新しいpdfページを追加
$pdf->AddPage();

// fill テスト
$pdf->Write(0, 'fill テスト', '', false, '', true);
$pdf->Cell(0, 0, '$fill [false]:矩形領域の塗つぶし無し'  , 1, 1, "L", false);
$pdf->Ln();
// 塗つぶしの色指定:RGB[128, 128, 128]
$pdf->SetFillColor(128, 128, 128);
$pdf->Cell(0, 0, '$fill [true] :矩形領域の塗つぶし有り'  , 1, 1, "L", true);
$pdf->Ln();

// pdf表示設定
$pdf->Output('pdf3-3.pdf', 'I');  // 'I':ブラウザに出力する(既定)
?>

実行結果は以下の様な表示になるはずです。

ちなみに SetFillColor メソッドの引数は、以下の様になっています。

public function setFillColor($col1=0, $col2=-1, $col3=-1, $col4=-1, $ret=false, $name='')
// $col1  : GRAYレベルの値、RGBのRed[0~255]、CMYKのCYAN[0~100]
// $col2  : RGBのGREEN[0~255]、CMYKのMAGENTA[0~100]
// $col3  : RGBのBlue[0~255]、CMYKのYELLOW[0~100]
// $col4  : CMYKのKEY(BLACK)[0~100]
// $ret   : [true]コマンドを送信しない
// $name  : 色名

この SetFillColor メソッドで「GRAYレベル」「RGB」「CMYK」の指定を行った例を以下に示します。

<?php
require_once('../tcpdf/tcpdf.php');

// クラス生成
$pdf = new TCPDF();

// デフォルトで用意されている日本語フォント[小塚ゴシックPro M]
$strFont = "kozgopromedium";
// ヘッダ・フッタ出力設定(特にいらないが)
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
// 本文の日本語フォント[小塚ゴシックPro M]
$pdf->SetFont($strFont, "", 10);

// 新しいpdfページを追加
$pdf->AddPage();

// fill - SetFillColor GRAY テスト
$pdf->Write(0, 'fill - SetFillColor GRAY テスト', '', false, '', true);
$pdf->SetFillColor( 64);
$pdf->Cell(0, 0, '$fill [true] :矩形領域の塗つぶし有り:setFillColor( 64)' , 1, 1, "L", true);
$pdf->Ln();
$pdf->SetFillColor(128);
$pdf->Cell(0, 0, '$fill [true] :矩形領域の塗つぶし有り:setFillColor(128)' , 1, 1, "L", true);
$pdf->Ln();
$pdf->SetFillColor(192);
$pdf->Cell(0, 0, '$fill [true] :矩形領域の塗つぶし有り:setFillColor(192)' , 1, 1, "L", true);
$pdf->Ln();
$pdf->SetFillColor(240);
$pdf->Cell(0, 0, '$fill [true] :矩形領域の塗つぶし有り:setFillColor(240)' , 1, 1, "L", true);
$pdf->Ln();

// fill - SetFillColor RGB テスト
$pdf->Write(0, 'fill - SetFillColor RGB テスト', '', false, '', true);
$pdf->SetFillColor(128, 128, 128);
$pdf->Cell(0, 0, '$fill [true] :矩形領域の塗つぶし有り:setFillColor(128, 128, 128)' , 1, 1, "L", true);
$pdf->Ln();
$pdf->SetFillColor(255, 128, 128);
$pdf->Cell(0, 0, '$fill [true] :矩形領域の塗つぶし有り:setFillColor(255, 128, 128)' , 1, 1, "L", true);
$pdf->Ln();
$pdf->SetFillColor(128, 255, 128);
$pdf->Cell(0, 0, '$fill [true] :矩形領域の塗つぶし有り:setFillColor(128, 255, 128)' , 1, 1, "L", true);
$pdf->Ln();
$pdf->SetFillColor(128, 128, 255);
$pdf->Cell(0, 0, '$fill [true] :矩形領域の塗つぶし有り:setFillColor(128, 128, 255)' , 1, 1, "L", true);
$pdf->Ln();

// fill - SetFillColor CMYK テスト
$pdf->Write(0, 'fill - SetFillColor CMYK テスト', '', false, '', true);
$pdf->SetFillColor(100,   0,   0,   0);
$pdf->Cell(0, 0, '$fill [true] :矩形領域の塗つぶし有り:setFillColor(100,   0,   0,   0)' , 1, 1, "L", true);
$pdf->Ln();
$pdf->SetFillColor(  0, 100,   0,   0);
$pdf->Cell(0, 0, '$fill [true] :矩形領域の塗つぶし有り:setFillColor(  0, 100,   0,   0)' , 1, 1, "L", true);
$pdf->Ln();
$pdf->SetFillColor(  0,   0, 100,   0);
$pdf->Cell(0, 0, '$fill [true] :矩形領域の塗つぶし有り:setFillColor(  0,   0, 100,   0)' , 1, 1, "L", true);
$pdf->Ln();
$pdf->SetFillColor(  0,   0,   0,  20);
$pdf->Cell(0, 0, '$fill [true] :矩形領域の塗つぶし有り:setFillColor(  0,   0,   0,  20)' , 1, 1, "L", true);
$pdf->Ln();
$pdf->SetFillColor( 50,  10,  20,  10);
$pdf->Cell(0, 0, '$fill [true] :矩形領域の塗つぶし有り:setFillColor( 50,  10,  20,  10)' , 1, 1, "L", true);
$pdf->Ln();

// pdf表示設定
$pdf->Output('pdf3-4.pdf', 'I');  // 'I':ブラウザに出力する(既定)
?>

実行結果は以下の様になります。



■$stretch: テキストの伸縮(ストレッチ)モード指定

テキストの伸縮(ストレッチ)モード指定の引数「$stretch」は以下の様になっていますので、それぞれを順次テストしてみます。

  • 数値(0):なし
  • 数値(1):必要に応じて水平伸縮
  • 数値(2):水平伸縮
  • 数値(3):必要に応じてスペース埋め
  • 数値(4):スペース埋め

<?php
require_once('../tcpdf/tcpdf.php');

// クラス生成
$pdf = new TCPDF();

// デフォルトで用意されている日本語フォント[小塚ゴシックPro M]
$strFont = "kozgopromedium";
// ヘッダ・フッタ出力設定(特にいらないが)
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
// 本文の日本語フォント[小塚ゴシックPro M]
$pdf->SetFont($strFont, "", 10);

// 新しいpdfページを追加
$pdf->AddPage();

// stretch テスト
$pdf->Write(0, 'stretch テスト', '', false, '', true);
$pdf->Cell(0, 0, '$stretch [0]:テキストの伸縮(ストレッチ)モード:無し'                , 1, 1, "C", false, '', 0);
$pdf->Ln();
$pdf->Cell(0, 0, '$stretch [1]:テキストの伸縮(ストレッチ)モード:必要に応じて水平伸縮', 1, 1, "C", false, '', 1);
$pdf->Ln();
$pdf->Cell(0, 0, '$stretch [2]:テキストの伸縮(ストレッチ)モード:水平伸縮'            , 1, 1, "C", false, '', 2);
$pdf->Ln();
$pdf->Cell(0, 0, '$stretch [3]:テキストの伸縮(ストレッチ)モード:必要に応じてスペース埋め', 1, 1, "C", false, '', 3);
$pdf->Ln();
$pdf->Cell(0, 0, '$stretch [3]:テキストの伸縮(ストレッチ)モード:スペース埋め', 1, 1, "C", false, '', 4);
$pdf->Ln();

// pdf表示設定
$pdf->Output('pdf3-5.pdf', 'I');  // 'I':ブラウザに出力する(既定)
?>

実行結果は以下の様な表示になるはずです。



■$calign, $valign: テキストのセル位置、垂直方向指定

指定されたY座標に対するセルの配置の引数「$calign」は以下の様になっています。

  • 文字列("T"):cell top
  • 文字列("C"):center
  • 文字列("B"):cell bottom
  • 文字列("A"):font top
  • 文字列("L"):font baseline
  • 文字列("D"):font bottom


これによりセルの配置が決定されますが、テキストの縦方向の配置と合わせてテストします。
セルの中のテキストの垂直方向の配置の引数「$valign」は以下の様になっています。

  • 文字列("T"):top
  • 文字列("M"):middle
  • 文字列("B"):bottom


以下の例は、テキストの垂直方向ごとに「$calign」の値を6種類表示しています。

<?php
require_once('../tcpdf/tcpdf.php');

// クラス生成
$pdf = new TCPDF();

// デフォルトで用意されている日本語フォント[小塚ゴシックPro M]
$strFont = "kozgopromedium";
// ヘッダ・フッタ出力設定(特にいらないが)
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
// 本文の日本語フォント[小塚ゴシックPro M]
$pdf->SetFont($strFont, "", 10);

// 新しいpdfページを追加
$pdf->AddPage();

// calign テスト
$pdf->Write(0, 'calign テスト', '', false, '', true);

// set border width
$pdf->setLineWidth(0.7);

// set color for cell border
$pdf->setDrawColor(0,128,255);

$pdf->setCellHeightRatio(3);

$pdf->setXY(10, 30);

// text on center
$pdf->Cell(30, 0, 'Top-Center'     , 1, 0, 'C', 0, '', 0, false, 'T', 'C');
$pdf->Cell(30, 0, 'Center-Center'  , 1, 0, 'C', 0, '', 0, false, 'C', 'C');
$pdf->Cell(30, 0, 'Bottom-Center'  , 1, 0, 'C', 0, '', 0, false, 'B', 'C');
$pdf->Cell(30, 0, 'Ascent-Center'  , 1, 0, 'C', 0, '', 0, false, 'A', 'C');
$pdf->Cell(30, 0, 'Baseline-Center', 1, 0, 'C', 0, '', 0, false, 'L', 'C');
$pdf->Cell(30, 0, 'Descent-Center' , 1, 0, 'C', 0, '', 0, false, 'D', 'C');

$pdf->setXY(10, 60);

// text on top
$pdf->Cell(30, 0, 'Top-Top'        , 1, 0, 'C', 0, '', 0, false, 'T', 'T');
$pdf->Cell(30, 0, 'Center-Top'     , 1, 0, 'C', 0, '', 0, false, 'C', 'T');
$pdf->Cell(30, 0, 'Bottom-Top'     , 1, 0, 'C', 0, '', 0, false, 'B', 'T');
$pdf->Cell(30, 0, 'Ascent-Top'     , 1, 0, 'C', 0, '', 0, false, 'A', 'T');
$pdf->Cell(30, 0, 'Baseline-Top'   , 1, 0, 'C', 0, '', 0, false, 'L', 'T');
$pdf->Cell(30, 0, 'Descent-Top'    , 1, 0, 'C', 0, '', 0, false, 'D', 'T');

$pdf->setXY(10, 90);

// text on bottom
$pdf->Cell(30, 0, 'Top-Bottom'     , 1, 0, 'C', 0, '', 0, false, 'T', 'B');
$pdf->Cell(30, 0, 'Center-Bottom'  , 1, 0, 'C', 0, '', 0, false, 'C', 'B');
$pdf->Cell(30, 0, 'Bottom-Bottom'  , 1, 0, 'C', 0, '', 0, false, 'B', 'B');
$pdf->Cell(30, 0, 'Ascent-Bottom'  , 1, 0, 'C', 0, '', 0, false, 'A', 'B');
$pdf->Cell(30, 0, 'Baseline-Bottom', 1, 0, 'C', 0, '', 0, false, 'L', 'B');
$pdf->Cell(30, 0, 'Descent-Bottom' , 1, 0, 'C', 0, '', 0, false, 'D', 'B');

// draw some reference lines
$linestyle = array('width' => 0.1, 'cap' => 'butt', 'join' => 'miter', 
				   'dash' => '', 'phase' => 0, 'color' => array(255, 0, 0));
$pdf->Line(10, 30, 190, 30, $linestyle);
$pdf->Line(10, 60, 190, 60, $linestyle);
$pdf->Line(10, 90, 190, 90, $linestyle);


// pdf表示設定
$pdf->Output('pdf3-6.pdf', 'I');  // 'I':ブラウザに出力する(既定)
?>

実行結果は以下の様な表示になるはずです。












PR

コメント

コメントを書く