忍者ブログ

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

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

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

前回の 「PHP PDF出力の方法について・矩形領域への文字列出力(Cellメソッド)」 の記事では Cell メソッドを説明しましたが、今回はそれの拡張版といえる MultiCell メソッドについて説明します。

CellMultiCell の違いですが、以下のソースを動作させるとよくわかります。

<?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(50, 0, '$border [1]:枠有り012345678901234567890123456789'   , 1, 1);
$pdf->Ln();
$pdf->Cell(50, 0, "\$border [1]:枠有り\r\n012345678901234567890123456789"   , 1, 1);
$pdf->Ln();
$pdf->MultiCell(50, 0, "\$border [1]:枠有り\r\n012345678901234567890123456789"   , 1, 1);

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

これの実行結果は以下の通りです。
前回の Cell メソッドの記事の中のボーダー(枠線)の部分のソースを参考にしています。
20行目の文字列の中に改行コードを入れてみたのですが、実際に実行すると空白が2個挿入された感じになりました。 尚、18行目では文字列が枠をはみ出て表示されています。 Cell メソッドでは改行を考慮には入れていない様です。
そこで呼出しを MultiCell メソッドに変えてみますと、枠の中で改行がされています。 メソッドの中で上手く縦方向に伸ばしている様です。


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

// Cellメソッド
public function MultiCell($w, $h, $txt, $border=0, $align='J', $fill=false, $ln=1, $x=null, $y=null, 
                          $reseth=true, $stretch=0, $ishtml=false, $autopadding=true, $maxh=0, 
                          $valign='T', $fitcell=false)
// $w      : 矩形領域の幅、0であれば、右マージンまで自動的に拡張される。
// $h      : 矩形領域の最小の縦幅で自動的に拡張される
// $txt    : 表示文字列
// $border : 境界線表示(0:枠無し,1:枠有 または "LRTB"の文字列で「左右上下」を指定)
// $align  : テキストの整列を指定
//           [L] or 空文字: 左揃え
//           [C]: 中央揃え
//           [R]: 右揃え
//           [J]: 両端揃え ($ishtml=falseの場合の既定値)
// $fill   : 矩形領域の塗つぶし指定
//           [false] : 透明(既定)
//           [true]  : 塗つぶす
// $ln     : 出力後のカーソルの移動方法を指定
//           [0]: 右へ移動(既定)
//           [1]: 次の行へ移動
//           [2]: 下へ移動
// $x      : X座標(省略時は現在位置)
// $y      : Y座標(省略時は現在位置)
// $reseth : 前回セルの高さ設定リセット
//           [true] :リセットする
//           [false]:前回セルの高さを引き継ぐ
// $stretch: テキストの伸縮(ストレッチ)モード:
//           [0] : なし
//           [1] : 必要に応じて水平伸縮
//           [2] : 水平伸縮
//           [3] : 必要に応じてスペース埋め
//           [4] : スペース埋め
// $ishtml :「true」テキストがHTML
// $autopadding :「true」行幅に自動調整
// $maxh   : 高さの上限
// $valign : セルの中のテキストの垂直方向の配置
//           [T] : top
//           [M] : middle
//           [B] : bottom
// $fitcell: [true]セルの領域でフィットする様にフォントサイズを小さくする




■$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);
$strAdd = "\r\n".'012345678901234567890123456789';
$pdf->MultiCell(50, 0, '$border [0]:枠無し'.$strAdd             , 0     , 'J', false, 0,  10, 20);
$pdf->MultiCell(50, 0, '$border [1]:枠有り'.$strAdd             , 1     , 'J', false, 0,  70, 20);
$pdf->MultiCell(50, 0, '$border ["L"]:「左」枠'.$strAdd         , 'L'   , 'J', false, 0, 130, 20);
$pdf->MultiCell(50, 0, '$border ["LT"]:「左上」枠'.$strAdd      , 'LT'  , 'J', false, 0,  10, 40);
$pdf->MultiCell(50, 0, '$border ["LTR"]:「左上右」枠'.$strAdd   , 'LTR' , 'J', false, 0,  70, 40);
$pdf->MultiCell(50, 0, '$border ["LTRB"]:「左上右下」枠'.$strAdd, 'LTRB', 'J', false, 0, 130, 40);

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

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


各「border」の説明テキストの後ろに改行コード(\r\n)と長い文字列を付加しています。 セルの横幅は「50」(mm)で指定していますが、改行コードで改行の動作が行われ、 横幅からあふれる場合には次の行に表示がされる様になっています。
MultiCell メソッドの引数のX座標、Y座標を指定してそれぞれの位置合わせを行っています。


■$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);
$strAdd = "\r\n".'012345678901234567890123456789';
$pdf->MultiCell(50, 0, '$align["L"]:左揃え'  .$strAdd, 1, 'L', false, 0,  10, 20);
$pdf->MultiCell(50, 0, '$align["C"]:中央揃え'.$strAdd, 1, 'C', false, 0,  70, 20);
$pdf->MultiCell(50, 0, '$align["R"]:右揃え'  .$strAdd, 1, 'R', false, 0, 130, 20);
$pdf->MultiCell(50, 0, '$align["J"]:両端揃え A B C D E F G', 1, 'J', false, 0,  10, 40);
$pdf->MultiCell(50, 0, '$align["J"]:両端揃え ABCDE FGH IJK', 1, 'J', false, 0,  70, 40);

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

実行結果は以下の様な表示になるはずです。
両端揃え」の指定は、表示文字列を空白で分解して均等割りで揃えるようです。
「両端揃え」を2種類表示しましたが、それぞれセルの横幅に合わせて最適な感じで表示している様です。



■$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->MultiCell(0, 0, '$fill [false]:矩形領域の塗つぶし無し'  , 1, "L", false);
$pdf->Ln();
// 塗つぶしの色指定:RGB[128, 128, 128]
$pdf->SetFillColor(128, 128, 128);
$pdf->MultiCell(0, 0, '$fill [true] :矩形領域の塗つぶし有り'  , 1, "L", true);

// pdf表示設定
$pdf->Output('pdf4-4.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->MultiCell(0, 0, '$fill [true] :矩形領域の塗つぶし有り:setFillColor( 64)' , 1, "L", true);
$pdf->Ln();
$pdf->SetFillColor(128);
$pdf->MultiCell(0, 0, '$fill [true] :矩形領域の塗つぶし有り:setFillColor(128)' , 1, "L", true);
$pdf->Ln();
$pdf->SetFillColor(192);
$pdf->MultiCell(0, 0, '$fill [true] :矩形領域の塗つぶし有り:setFillColor(192)' , 1, "L", true);
$pdf->Ln();
$pdf->SetFillColor(240);
$pdf->MultiCell(0, 0, '$fill [true] :矩形領域の塗つぶし有り:setFillColor(240)' , 1, "L", true);
$pdf->Ln();

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

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

// pdf表示設定
$pdf->Output('pdf4-5.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->MultiCell(0, 0, '$stretch[0]:ストレッチ:無し'                , 1, "C", false, 1, null, null, true, 0);
$pdf->Ln();
$pdf->MultiCell(0, 0, '$stretch[1]:ストレッチ:必要に応じて水平伸縮', 1, "C", false, 1, null, null, true, 1);
$pdf->Ln();
$pdf->MultiCell(0, 0, '$stretch[2]:ストレッチ:水平伸縮'            , 1, "C", false, 1, null, null, true, 2);
$pdf->Ln();
$pdf->MultiCell(0, 0, '$stretch[3]:ストレッチ:必要に応じて空白埋め', 1, "C", false, 1, null, null, true, 3);
$pdf->Ln();
$pdf->MultiCell(0, 0, '$stretch[3]:ストレッチ:空白埋め'            , 1, "C", false, 1, null, null, true, 4);
$pdf->Ln();

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

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



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

セルの中のテキストの垂直方向の配置の引数「$valign」は以下の様になっています。

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

<?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();
// valign テスト
$pdf->Write(0, 'valign テスト', '', false, '', true);
$strAdd = "\r\n0123456789\r\n0123456789";

$strTxt = "\$valign['T']:Top   \r\n\$align['L']左揃え"  .$strAdd;
$pdf->MultiCell(60, 60, $strTxt, 1, 'L', false, 1,  10, 20, true, 0, false, true, 60,'T');

$strTxt = "\$valign['M']:Middle\r\n\$align['C']中央揃え".$strAdd;
$pdf->MultiCell(60, 60, $strTxt, 1, 'C', false, 1,  75, 20, true, 0, false, true, 60,'M');

$strTxt = "\$valign['B']:Bottom\r\n\$align['R']右揃え"  .$strAdd;
$pdf->MultiCell(60, 60, $strTxt, 1, 'R', false, 1, 140, 20, true, 0, false, true, 60,'B');

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

なお、「$maxh」は「$h」と同じ値にしてあります。この値が「0」ではうまく表示されません。
あと「$ishtml」ですがテキストの中に改行コードを入れる場合は「false」で指定し、 テキストが HTML で改行が <BR> の場合は「true」で指定します。
実行結果は以下の様な表示になるはずです。












PR

コメント

コメントを書く