忍者ブログ

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

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

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

前回の 「PHP PDF出力の方法について・矩形領域への文字列出力(MultiCellメソッド)」 の記事では MultiCell メソッドを説明しましたが、今回は MultiCell メソッドの注意点について説明します。

それでは以下のソースを見て下さい。
前回の説明の時の「valign テスト」のソースを少し変更しています。

<?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;
// 線のStyleで「破線」指示
$pdf->SetLineStyle(array('dash' => '2'));
// 縦サイズ:20で文字列を表示
$pdf->MultiCell(60, 10, $strTxt, 1, 'L', false, 1,  10, 20, true, 0, false, true, 60,'T');

// 線のStyleで「破線」指示で、色がRGB指定で「赤」
$pdf->SetLineStyle(array('dash' => '2', 'color' => array(255, 0, 0)));
// 四角い枠線を表示(縦サイズ:20)
$pdf->Rect( 10, 20, 60, 10,'D');

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

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


この例で MultiCell メソッドで 「valign」が「'T':Top」で「align」を「'L':Left」の指定で表示しますが、縦方向のサイズを「10」にしています。 表示文字列は改行が3回入るため、そのサイズでは溢れるはずです。
なお MultiCell メソッドの枠線を破線で表示するため SetLineStyle メソッドを使用しています。

MultiCell メソッドでは「横:60、縦:10」で範囲を指定していますので、 その大きさを赤い枠線で表示するため Rect メソッドを使用しています。

出力結果から分かる様にMultiCell メソッドでは縦サイズに収まらない場合、縦方向の伸長がされます。
そのため表示する文字列の文字数のMAX値や改行などを考慮して伸長されても問題無い様に考える必要があります。

ここで唐突に SetLineStyle メソッド Rect メソッドがでてきましたので、メソッドの引数について説明します。

// SetLineStyleメソッド
public function setLineStyle($style, $ret=false)
// $style  : 線スタイル連想配列(以下の文字列をキーとする配列)
//           'width':線の幅(float値)
//           'cap'  :線のCAP (文字列:'butt','round','square')
//           'join' :線のJOIN(文字列:'miter','round','bevel')
//           'dash' :破線パターン(文字列で破線のON/OFFを指定)
//                    例1:"2"のみの場合、「ON:2」「OFF:2」
//                    例1:"3,1の場合、   「ON:3」「OFF:1」
//           'phase':破線パターンの開始位置のシフトする長さ(integer値)
//           'color':破線の色指定(array値)
//                    書式1: array(GREY)
//                    書式2: array(R,G,B)
//                    書式3: array(C,M,Y,K)
//                    書式4: array(C,M,Y,K,SpotColorName)
// 
// $ret    : [true]:コマンドを送信しない

// Rectメソッド
public function Rect($x, $y, $w, $h, $style='', $border_style=array(), $fill_color=array())
// $x      : 矩形領域左上のX座標(float)
// $y      : 矩形領域左上のY座標(float)
// $w      : 幅  (float)
// $h      : 高さ(float)
// $style  : 描画スタイル(文字列)
//           'D' or ''(空文字): 線画
//           'F': 塗りつぶし
//           'DF' or 'FD': 線画+塗りつぶし
//           'CNZ': クリッピングモード(even-odd方式).
//           'CEO': クリッピングモード(non-zero方式).
// $border_style : 境界線描画スタイル(array)「SetLineStyle()」に似ている
// $fill_color   : 塗りつぶし色(array)
//                 ・書式1: array(GREY)
//                 ・書式2: array(R,G,B)
//                 ・書式3: array(C,M,Y,K)
//                 ・書式4: array(C,M,Y,K,SpotColorName)




■MultiCell のさらなる注意点

上記の例で MultiCell メソッドでは縦方向に指定した矩形領域を超える場合、領域の縦方向への伸長が行われることを示しました。

さらに MultiCell メソッドの描画開始Y座標をページの下の方に指定し、描画が1ページ内に収まらない場合どうなるのかを見てみます。 ソースは以下の様になります。

<?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;
// 線のStyleで「破線」指示
$pdf->SetLineStyle(array('dash' => '2'));
// 縦サイズ:20で文字列を表示
$h = 10;
// Y座標
$y = 265;
$pdf->MultiCell(60, $h, $strTxt, 1, 'L', false, 1,  10, $y, true, 0, false, true, 60,'T');

// 線のStyleで「破線」指示で、色がRGB指定で「赤」
$pdf->setPage(1);
$pdf->SetLineStyle(array('dash' => '2', 'color' => array(255, 0, 0)));
// 四角い枠線を表示(縦サイズ:20)
$pdf->Rect( 10, $y, 60, $h, 'D');

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

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


MultiCell メソッドの描画が1ページ収まらない場合、次のページに境界線を含めて拡張されるのが分かります。 この件も、十分に注意が必要だと思います。

仕様的にどうしても1ページにおさめなければならに場合は、データに制限を掛けるかですが。
他にも方法はある様ですが、例えば描画トランザクションでページが拡張されるかどうかを調べてから、 MultiCell メソッドの処理を変えたりするとかが、考えられます。 これに付いては別の機会に説明したいと思います。

また、上記のソースでは MultiCell メソッドの後で Rect メソッドで枠線を表示している関係上、 ページが移動してしまうので、強制的に1ページ目に戻る指定を行っています。












PR

コメント

コメントを書く