-
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
-
前回の 「PHP PDF出力の方法について・矩形領域への文字列出力(Cellメソッド)」 の記事では Cell メソッドを説明しましたが、今回はそれの拡張版といえる MultiCell メソッドについて説明します。
Cell と MultiCell の違いですが、以下のソースを動作させるとよくわかります。<?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 : 境界線表示
- $align : テキストの整列を指定
- $fill : 矩形領域の塗つぶし指定
- $stretch: テキストの伸縮(ストレッチ)モード指定
- $valign : テキストのセル位置、垂直方向指定
■$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 -
前回の 「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 : 境界線表示
- $align : テキストの整列を指定
- $fill : 矩形領域の塗つぶし指定
- $stretch: テキストの伸縮(ストレッチ)モード指定
- $calign, $valign: テキストのセル位置、垂直方向指定
■$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':ブラウザに出力する(既定) ?>
実行結果は以下の様な表示になるはずです。
-
初回の 「PHP PDF出力の方法について(TCPDF)」 の記事ではマージンとヘッダ/フッタについての説明を割愛していましたが、 今回は PDF 出力のマージンとヘッダ/フッタについて説明したいと思います。
■簡単なPDF表示のマージン
前回の簡単なPDF表示のプログラムは以下の様になっていました。
<?php // ライブラリ読込 require_once('../tcpdf/tcpdf.php'); // TCPDFクラス生成 $pdf = new TCPDF(); $pdf->setPrintHeader(false); // 新規ページ追加 $pdf->AddPage(); // デフォルトで用意されている日本語フォント[小塚ゴシックPro M] $pdf->SetFont("kozgopromedium", "", 10); // HTMLの定義 $html = <<< EOF <style> h1 { font-size: 24px; // 文字の大きさ color: #ff0000; // 文字の色 text-align: center; // テキストを真ん中に寄せる } p { font-size: 12px; // 文字の大きさ color: #000000; // 文字の色 text-align: left; // テキストを左に寄せる } </style> <h1>PDFテスト1</h1> <p>これは <b>TCPDF</b> を使った <b>PDF</b> の出力テストです。</p> EOF; // HTML書式で出力する $pdf->writeHTML($html); // PDF表示出力 $pdf->Output('pdf1.pdf', 'I'); // 'I':ブラウザに出力する(既定) ?>
ここではマージン(ページの上下左右の余白)の設定は行っていませんが、 上マージンと左右マージンは 1cm 、下マージンは 2cm が規定値として設定されています。
上マージンと左右マージンの設定は setMargins() メソッドで、下マージンは SetAutoPageBreak() メソッドで行います。public function setMargins($left, $top, $right=null, $keepmargins=false) // $left : 左マージン(数値の単位は規定値は mm) // $top : 上マージン // $right: 右マージン(null の場合は左マージンの値を使う) // $keepmargins: trueの場合、デフォルトのページ余白設定を更新する public function setAutoPageBreak($auto, $margin=0) // $auto : 自動改ページする場合 true // $margin : 下マージン
上マージンを[20mm]、左右マージンを[40mm]、下マージンを[50mm]に設定してみます。<?php require_once('../tcpdf/tcpdf.php'); // TCPDFクラス生成 $pdf = new TCPDF(); // プリンターヘッダとフッタOFF $pdf->setPrintHeader(false); $pdf->setPrintFooter(false); // マージン設定 $pdf->setMargins(40.0, 20.0, 40.0); //上マージン[20mm] 左右マージン[40mm] $pdf->setAutoPageBreak(true, 50.0); //下マージン[50mm] // 新しいpdfページを追加 $pdf->AddPage(); // デフォルトで用意されている日本語フォント[小塚ゴシックPro M] $pdf->SetFont("kozgopromedium", "", 10); // HTMLの定義 $html = <<< EOF <style> h1 { font-size: 24px; // 文字の大きさ color: #ff0000; // 文字の色 text-align: center; // テキストを真ん中に寄せる } p { font-size: 12px; // 文字の大きさ color: #000000; // 文字の色 text-align: left; // テキストを左に寄せる } </style> <h1>PDFテスト1</h1> <p>これは <b>TCPDF</b> を使った <b>PDF</b> の出力テストです。</p> EOF; // 下マージンを超えるぐらいに文字列の設定 for ($i = 0; $i < 50; $i++) { $html .= "".sprintf("[%02d]", $i)."********<br>"; } // HTML書式で出力する $pdf->writeHTML($html); // pdf表示設定 $pdf->Output('pdf1.pdf', 'I'); // 'I':ブラウザに出力する(既定) ?>
これの実行結果は以下の通りです。■簡単なPDF表示のヘッダ/フッタ(ロゴ画像・タイトル表示)
PDF に備わった機能でヘッダ/フッタを表示させる方法の手順としては以下の様になります。
元々備わった処理では、ヘッダに「ロゴ画像」「ヘッダタイトル」「ヘッダ文字列」の表示が、 フッタには「ページ番号」「全ページ数」の表示が出来る様になっています。- TCPDF ライブラリの読込
- TCPDF クラスの生成
- ヘッダ・フッタ出力設定
- マージン設定
- ヘッダ・フッタマージン設定
- 自動改ページモード設定
- ヘッダ・フッタデータ設定
- ヘッダ・フッタのフォント設定
- TCPDF クラスへの新規ページ追加
- 日本語フォントの設定
- HTML文字列のブラウザへの表示
<?php require_once('../tcpdf/tcpdf.php'); // TCPDFクラス生成 $pdf = new TCPDF(); //$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); // デフォルトで用意されている日本語フォント[小塚ゴシックPro M] $strFont = "kozgopromedium"; // ヘッダ・フッタ出力設定(特にいらないが) $pdf->setPrintHeader(true); $pdf->setPrintFooter(true); // マージン設定 $pdf->setMargins(40.0, 30.0, 40.0); //上マージン[20mm] 左右マージン[40mm] $pdf->setAutoPageBreak(true, 50.0); //下マージン[50mm] // ヘッダマージン設定(上マージンの中でヘッダ表示の上方のマージン) $pdf->setHeaderMargin(2.5); // フッタマージン設定(下マージンの中でフッタ表示の下方のマージン) $pdf->setFooterMargin(5); // 自動改ページモード設定 $pdf->setAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM); // ヘッダ・フッタデータ設定 $pdf->setHeaderData("../../../_test_pdf/test-logo.png", 30.0, "header-titleあいうえお", "header-string全角漢字@@@@@", array(0,64,255), array(255,0,0)); $pdf->setFooterData(array(0,128,0), array(0,0,128)); // ヘッダ・フッタのフォント設定 $pdf->setHeaderFont(array($strFont, '', 10));//(family, style, size). $pdf->setFooterFont(array($strFont, '', 12)); // 本文の日本語フォント[小塚ゴシックPro M] $pdf->SetFont($strFont, "", 10); // 新しいpdfページを追加 $pdf->AddPage(); // HTMLの定義 $html = <<< EOF <style> h1 { font-size: 24px; // 文字の大きさ color: #ff0000; // 文字の色 text-align: center; // テキストを真ん中に寄せる } p { font-size: 12px; // 文字の大きさ color: #000000; // 文字の色 text-align: left; // テキストを左に寄せる } </style> <h1>PDFテスト1</h1> <p>これは <b>TCPDF</b> を使った <b>PDF</b> の出力テストです。</p> EOF; // 下マージンを超えるぐらいに文字列の設定 for ($i = 0; $i < 50; $i++) { $html .= "".sprintf("[%02d]", $i)."********<br>"; } // HTML書式で出力する $pdf->writeHTML($html); // pdf表示設定 $pdf->Output('pdf1.pdf', 'I'); // 'I':ブラウザに出力する(既定) ?>
実行結果は以下の様な表示になるはずです。
ちなみに setHeaderData 及び setFooterData メソッドの引数は、以下の様になっています。// ヘッダデータ設定 public function setHeaderData($ln='', $lw=0, $ht='', $hs='', $tc=array(0,0,0), $lc=array(0,0,0)) // $ln : ロゴ画像ファイルのパス // $lw : ロゴ画像の横幅(mm単位) // $ht : ヘッダタイトル文字列 // $hs : ヘッダドキュメント文字列 // $tc : テキスト色のRGB array // $lc : 線色のRGB array // ヘッダ・フッタデータ設定 public function setFooterData($tc=array(0,0,0), $lc=array(0,0,0)) { // $tc : テキスト色のRGB array // $lc : 線色のRGB array
この setHeaderData 及び setFooterData メソッドを使ってもいいのですが、 このままでは自由度がないのでカスタマイズするには TCPDF クラスを拡張して Header 及び Footer メソッドを上書きしてやればできる様です。
次の項目で、ヘッダ・フッタのカスタマイズ方法について説明します。
■TCPDF クラスを拡張してヘッダ/フッタ表示をカスタマイズ
TCPDF クラスを拡張して、ヘッダ/フッタ表示を自分で定義する方法を記します。
やり方としては TCPDF クラスを extends で指定し新たに EXPDF の名前でクラスを定義します。
EXPDF クラスの中に TCPDF のメソッドである Header() Footer() メソッドを上書きする為に記述します。
Header() メソッドではロゴ画像を Image メソッドで表示し、タイトル文字列を Cell メソッドで表示しています。 また、Footer() メソッドではページ番号を表示しています。<?php require_once('../tcpdf/tcpdf.php'); // TCPDF クラスを継承 class EXPDF extends TCPDF { // [Header]を上書き public function Header() { // ロゴ画像 $image_file = '../_test_pdf/test-logo.png'; $this->Image($image_file, 10, 10, 30, '', 'PNG', '', 'T', false, 300, '', false, false, 0, false, false, false); // 「Cell()」で使用されるフォント設定 $this->setFont('kozgopromedium', 'B', 20); // タイトル表示 $this->Cell(0, 15, '** TCPDFクラス継承テスト **', 0, false, 'C', 0, '', 0, false, 'M', 'M'); } // [Footer]を上書き public function Footer() { // Y座標を一番下から「15mm」上の方向へ移動 $this->setY(-15); // 「Cell()」で使用されるフォント設定 $this->setFont('kozgopromedium', '', 13); // ページ番号を表示 $strPage = 'PAGE-'.$this->getAliasNumPage().'/'.$this->getAliasNbPages(); $this->Cell(0, 10, $strPage, 0, false, 'C', 0, '', 0, false, 'T', 'M'); } } // TCPDFを継承したクラス生成 $pdf = new EXPDF(); // デフォルトで用意されている日本語フォント[小塚ゴシックPro M] $strFont = "kozgopromedium"; // ヘッダ・フッタ出力設定(特にいらないが) $pdf->setPrintHeader(true); $pdf->setPrintFooter(true); // マージン設定 $pdf->setMargins(40.0, 30.0, 40.0); //上マージン[20mm] 左右マージン[40mm] $pdf->setAutoPageBreak(true, 50.0); //下マージン[50mm] // ヘッダマージン設定 $pdf->setHeaderMargin(2.5); // フッタマージン設定 $pdf->setFooterMargin(5); // 自動改ページモード設定 $pdf->setAutoPageBreak(TRUE, 30.0); // ヘッダ・フッタデータ設定 $pdf->setHeaderData("../../../_test_pdf/test-logo.png", 30.0, "header-titleあいうえお", "header-string全角漢字@@@@@", array(0,64,255), array(255,0,0)); $pdf->setFooterData(array(0,128,0), array(0,0,128)); // ヘッダ・フッタのフォント設定 $pdf->setHeaderFont(array($strFont, '', 10));//(family, style, size). $pdf->setFooterFont(array($strFont, '', 12)); // 本文の日本語フォント[小塚ゴシックPro M] $pdf->SetFont($strFont, "", 10); // 新しいpdfページを追加 $pdf->AddPage(); // HTMLの定義 $html = <<< EOF <style> h1 { font-size: 24px; // 文字の大きさ color: #ff0000; // 文字の色 text-align: center; // テキストを真ん中に寄せる } p { font-size: 12px; // 文字の大きさ color: #000000; // 文字の色 text-align: left; // テキストを左に寄せる } </style> <h1>PDFテスト2-3</h1> <p>これは <b>TCPDF</b> を使った <b>PDF</b> の出力テストです。</p> EOF; // 下マージンを超えるぐらいに文字列の設定 for ($i = 0; $i < 50; $i++) { $html .= "".sprintf("[%02d]", $i)."********<br>"; } // HTML書式で出力する $pdf->writeHTML($html); // pdf表示設定 $pdf->Output('pdf2-3.pdf', 'I'); // 'I':ブラウザに出力する(既定) ?>
実行結果は以下の様な表示になるはずです。
ちなみに Image 及び setFooterData メソッドの引数は、以下の様になっています。
// public function Image($file, $x=null, $y=null, $w=0, $h=0, $type='', $link='', $align='', $resize=false, $dpi=300, $palign='', $ismask=false, $imgmask=false, $border=0, $fitbox=false, $hidden=false, $fitonpage=false, $alt=false, $altimgs=array()) // $file : 画像ファイル名 // $x : 領域左上のX座標[指定しない場合、現在のX座標位置] // $y : 領域左上のY座標[指定しない場合、現在のY座標位置] // $w : 領域の幅 [指定しない場合、自動計算される] // $h : 領域の高さ [指定しない場合、自動計算される] // $type : 画像フォーマット("JPEG", "PNG") // $link : AddLink()で作成したリンク識別子 // $align : 次の画像を表示する位置 // [T]: top-right for LTR or top-left for RTL< // [M]: middle-right for LTR or middle-left for RTL // [B]: bottom-right for LTR or bottom-left for RTL // [N]: next line // $resize : [true]画像サイズを$wや$hに合わせてリサイズ // $dpi : 解像度(dot per inch) // $palign : 画像を現在の行のどこに配置するか // [L] : 左端 // [C] : 中央 // [R] : 右端 // ['']: 左端(RTLの場合は右端) // $ismask : [true]画像をマスクする場合 // $imgmask : 画像オブジェクトをメソッドの戻り値として取得する // (描画しない、w、h、x、yは無視される)場合true // $border : 境界線表示(0:枠無し,1:枠有 または "LRTB"の文字列で「左右上下」を指定) // $fitbox : [ture]($w, $h)で指定する領域に合わせて拡縮 // $hidden : [ture]画像を画面に表示しない // $fitonpage : [ture]ページの大きさに拡大する // $alt : If true the image will be added as alternative and not directly printed // (the ID of the image will be returned). // $altimgs : Array of alternate images IDs. Each alternative image must be an array with two values: // an integer representing the image ID (the value returned by the Image method) // and a boolean value to indicate if the image is the default for printing. 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
-
今回は TCPDF で行う 「PDFファイル出力」 について説明したいと思います。
Webシステムでエクセルファイルやワードファイルのダウンロードは良くあることですが、 それらのファイルを見るためには、エクセルやワードのソフトが必要になります。
そこで PDF の出番ですが、上記のソフトが無くてもブラウザ上で見ることが出来る様になっていますので、 各種のデータ検索後のPDF出力の需要は結構あります。
このライブラリですが PHPでの 「PDFファイル出力」 と言えば TCPDF と推奨されています。
割と簡単に PDFファイル が作成できますので、使用されてみてはいかがでしょうか。
■TCPDF のダウンロードとインストール
TCPDF のダウンロードは以下の所から行えます。
【GitHub】tecnickcom / TCPDF
⇒https://github.com/tecnickcom/tcpdf画面上部の緑色の Code ボタンをクリックし更に Download ZIP をクリックででダウンロードが開始されます。
以下の様に HTML ドキュメントのフォルダに展開します。 私のテスト環境はWindows上の xampp で行いますので C:\xampp\htdocs\ フォルダの中に tcpdf フォルダを作成し TCPDF-main.zip を展開し、中身を tcpdf フォルダにコピーしました。(下図参照)■簡単なPDF表示
簡単なPDF表示処理として HTML 形式の内容をPDFとしてブラウザに表示させることを行います。 手順としては以下の様になります。
- TCPDF ライブラリの読込
- TCPDF クラスの生成
- TCPDF クラスへの新規ページ追加
- 日本語フォントの設定
- HTML文字列のブラウザへの表示
<?php // ライブラリ読込 require_once('../tcpdf/tcpdf.php'); // TCPDFクラス生成 $pdf = new TCPDF(); $pdf->setPrintHeader(false); // 新規ページ追加 $pdf->AddPage(); // デフォルトで用意されている日本語フォント[小塚ゴシックPro M] $pdf->SetFont("kozgopromedium", "", 10); // HTMLの定義 $html = <<< EOF <style> h1 { font-size: 24px; // 文字の大きさ color: #ff0000; // 文字の色 text-align: center; // テキストを真ん中に寄せる } p { font-size: 12px; // 文字の大きさ color: #000000; // 文字の色 text-align: left; // テキストを左に寄せる } </style> <h1>PDFテスト1</h1> <p>これは <b>TCPDF</b> を使った <b>PDF</b> の出力テストです。</p> EOF; // HTML書式で出力する $pdf->writeHTML($html); // PDF表示出力 $pdf->Output('pdf1.pdf', 'I'); // 'I':ブラウザに出力する(既定) ?>
実行結果は以下の様な表示になるはずです。 HTML での表現をそのまま PDF として表示できますので、いろんなものが簡単に PDF 化できると思います。
TCPDF クラスの生成は引数無しで行っていますが、クラス生成の関数(__construct をみると)の引数は7個あり、以下の様になっています。public function __construct($orientation='P', $unit='mm', $format='A4', $unicode=true, $encoding='UTF-8', $diskcache=false, $pdfa=false)
- $orientation用紙の向き('P':ポートレート, 'L':ランドスケープ 規定値:'P')
- $unit測位単位('mm':ミリm, 'cm':センチm, 'pt':ポイント, 'in':インチ 規定値:'mm')
- $format用紙の大きさ('A4','A5','B5' などの用紙サイズを文字列指定 規定値:'A4')
- $unicode文字列がUNICODEかの指定(規定値:true)
- $encoding文字セットエンコーディング(htmlを戻すときに使用 規定値:true)
- $diskcache廃止された機能(規定値:false) この機能は内部的に使っていない
- $pdfa[PDF/A]モードを使う場合バージョンNO[1, 3]を指定(規定値:false [PDF/A]モード未使用)
TCPDF クラスの生成を引数ありで記述すれば以下の様になります。
$pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false, false);
クラスの生成直後は TCPDF オブジェクトにはPDFのページが存在しませんので AddPage() メソッドで1ページ追加します。 ページを追加することで、そのページに対して出力処理が行える状態になります。
文字のフォントは規定値では helvetica になっていますので、これを日本語が表示出来る様に TCPDF に既に備わっている 日本語フォント[小塚ゴシックPro M:'kozgopromedium']を SetFont() メソッドで指定します。
次は HTML 文字列を作成しを writeHTML() メソッドで PDF のページに書き出します。
なお、HTMLのタグは以下のものがサポートされています。(実際のソースより)
Supported tags are: a, b, blockquote, br, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, img, li, ol, p, pre, small, span, strong, sub, sup, table, tcpdf, td, th, thead, tr, tt, u, ul
最後に Output() メソッドで PDF をブラウザに出力します。public function Output($name='doc.pdf', $dest='I') // $name : 保存時のファイル名 // $dest : ドキュメントの出力先を指定 // 'I': ブラウザに出力する、ブラウザで保存する時のファイル名が $name で指定した名前になる。 // 'D': ブラウザでダウンロードする。ファイル名は $name で指定した名前になる。 // 'F': ローカルサーバーファイルとして保存する。ファイル名は $name で指定した名前になる。 // 'S': PDFドキュメントの内容を文字列として出力する。
■HTMLページからPDFを別タブで表示させる(A タグ)
上の例ではブラウザの URL アドレスに直接「http://localhost/_test_pdf/pdf1.php」などと入力し、そのタブでの PDF 表示を行いました。
ただし、URL を直接では無く HTML ページから間接的に指定して別タブで表示させることが出来ます。
A タグを使って以下の様にすれば、リンクをクリックすると別タブに PDF 出力が表示されます。<html> <head> <meta charset="utf-8"> <title>PDF - 1</title> </head> <body> <h2>PDF 出力を起動</h2> <a href="./pdf1.php" target="_blank">[pdf1.pdf]別タブで表示</a> </body> </html>
さらに、A タグをソースで記述では無く Javascript で行う場合は以下の様になります。<html> <head> <meta charset="utf-8"> <title>PDF - 1</title> <script type="text/javascript"> function showPdf() { var a = document.createElement("a"); document.body.appendChild(a); a.href = "./pdf1.php"; a.target = "blank"; a.click(); a.remove(); } </script> </head> <body> <h2>PDF 出力を起動</h2> <button onclick="showPdf();">[pdf1.pdf]別タブで表示</button> </body> </html>
PDF 出力とは直接関係はないことでしたが、出力処理だけで動作させることは少なく、起動の方法も必要かと思いここに記しました。
■HTMLページからPDFを別タブで表示させる・その2
上の例では A タグを使って別タブに PDF 出力を表示する方法でしたが、 PDF 出力プログラム側で引数が必要な場合、 A タグではブラウザの URL に引数がそのまま表示されてしまいます。
これを出ない様にするには POST する必要があります。
それでは以下に PDF 側に1個の引数を持つ様に変更して、それを呼出す HTML ファイルを記します。
PDF出力側
<?php require_once('../tcpdf/tcpdf.php'); // 引数の取得 $para = ""; if (isset($_POST["para"])) { $para = $_POST["para"]; } // TCPDFクラス生成 $pdf = new TCPDF(); $pdf->setPrintHeader(false); // 新しいpdfページを追加 $pdf->AddPage(); // デフォルトで用意されている日本語フォント[小塚ゴシックPro M] $pdf->SetFont("kozgopromedium", "", 10); // HTMLの定義 $html = <<< EOF <style> h1 { font-size: 24px; // 文字の大きさ color: #ff0000; // 文字の色 text-align: center; // テキストを真ん中に寄せる } p { font-size: 12px; // 文字の大きさ color: #000000; // 文字の色 text-align: left; // テキストを左に寄せる } </style> <h1>PDFテスト1</h1> <p>これは <b>TCPDF</b> を使った <b>PDF</b> の出力テストです。</p> <p>引数は <b>$para</b> です。</p> EOF; // HTML書式で出力する $pdf->writeHTML($html); // pdf表示設定 $pdf->Output('pdf1.pdf', 'I'); // 'I':ブラウザに出力する(既定) ?>
PDF出力を呼出すHTML側
<html> <head> <meta charset="utf-8"> <title>PDF 1-3</title> <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script> <script type="text/javascript"> function showPdf() { var form = document.createElement("form"); form.method = "POST"; form.action = "./pdf1-2.php"; form.target = "blank"; var hid = document.createElement("input"); hid.type = "hidden"; hid.name = "para"; hid.value = $("#para").val(); form.appendChild(hid); document.body.appendChild(form); form.submit(); form.remove(); } </script> </head> <body> <h2>PDF 出力を起動</h2> <input type="input" id="para" value="test" /> <button onclick="showPdf();">[pdf1.pdf]別タブで表示</button> </body> </html>
-
今回は、今更ながら each の使い方を再考してみます。
each には2種類の使い方があります。 ひとつは jQuery の セレクタ に対してのものと、もう一つは配列やコレクションやオブジェクトに対するものです。
共にそれぞれが内部に持っているものに対して、順次処理を行うことでは似た感じです。
先ずは jQuery の セレクタ に対しての each の書き方ですが、以下の様になります。$('セレクタ名').each(function([index[, element]]) { // index : 各要素のインデックス番号(値は 0 から始まる) // element : 繰り返し処理中の要素を参照 各要素に関する処理; });
これを使った例として以下に HTML ファイル側のソースを示します。■each を使った例
<html> <head> <meta charset="utf-8"> <title>test checkbox</title> <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script> <script type="text/javascript"> //TEST関数 function testEach() { $('li').each(function(index, element) { console.log(index + ':' + $(element).text()); }); } </script> </head> <body> <h2>test each 1</h2> <li>ラベル1</li> <li>ラベル2</li> <li>ラベル3</li> <br /> <button onclick="javascript:testEach();">TEST</button> </body> </html>
9行目の .each(function(index, element) { ... }); で each 処理を行っています。
処理は要素の index と element で取得できるテキスト値をコンソールに出力しています。(以下の様になります。)0: ラベル1 1: ラベル2 2: ラベル3
each の処理で index と element を記述せずに以下の様にしても、同様な処理が行えます。
以下の例では element の代わりに this を使っています。 特に index を使う必要が無ければ、いつもは this で記述することが多いです。
この this ですが、each の繰り返しの処理の中で、現在のセレクタ?(オブジェクト)を指し示す変数みたいなものと考えて良いと思います。<html> <head> <meta charset="utf-8"> <title>test checkbox</title> <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script> <script type="text/javascript"> //TEST関数 function testEach() { $('li').each(function() { // index , elemnt を省略 console.log($(this).text()); }); } </script> </head> <body> <h2>test each 2</h2> <li>ラベル1</li> <li>ラベル2</li> <li>ラベル3</li> <br /> <button onclick="javascript:testEach();">TEST</button> </body> </html>
この例から少し発展させて <li> 要素がクリックされた時に、クリックされたラベル以外の文字列を表示する様に変更します。<html> <head> <meta charset="utf-8"> <title>test checkbox</title> <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script> <script type="text/javascript"> // 初期処理 $(function(){ // li 要素のクリック時の処理 $('li').on('click', function() { // クリック時の[this]退避 var this_click = this; // li 要素の全てを処理 $('li').each(function() { if (this_click != this) { // クリック以外のラベル console.log($(this).text()); } }); }); }); </script> </head> <body> <h2>test each 2</h2> <li>ラベル1</li> <li>ラベル2</li> <li>ラベル3</li> </body> </html>
それでは、配列やコレクションやオブジェクトに対する each について説明します。 構文的には以下の様になります。
$.each(collection, function(index, value) { // collection : each処理の対象となる配列またはオブジェクト // function : 各繰り返し処理で実行したい関数を指定 // index : 配列であればインデックス番号、オブジェクトであればkey // value : 繰り返し処理中の値 各要素に関する処理; });
$.each で宣言された関数の中で、引数である index, value を利用することが出来ます。
以下に、配列データとオブジェクトの中身を全てコンソールに出力する例を示します。
■配列やコレクションやオブジェクトに対する each 例
<html> <head> <meta charset="utf-8"> <title>test checkbox</title> <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script> <script type="text/javascript"> //TEST関数 function testEach() { // 配列 var arr = ['A001', 'B002', 'C003']; $.each(arr, function(index, value) { console.log('index(' + index + ') = ' + value); }); // オブジェクト var obj = { 'key1' : 'A001', 'key2' : 'B002', 'key3' : 'C003' }; $.each(obj, function(index, value) { console.log('index(' + index + ') = ' + value); }); } </script> </head> <body> <h2>test each 5</h2> <button onclick="javascript:testEach();">TEST</button> </body> </html>
コンソールの出力は以下の様になります。オブジェクトの場合 index にキーが渡されることがわかります。index(0) = A001 index(1) = B002 index(2) = C003 index(key1) = A001 index(key2) = B002 index(key3) = C003
今回の例でも、 index, value を記述せずに this を使うことが出来ます。
■配列やコレクションやオブジェクトに対する each 例
<html> <head> <meta charset="utf-8"> <title>test checkbox</title> <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script> <script type="text/javascript"> //TEST関数 function testEach() { // 配列 var arr = ['A001', 'B002', 'C003']; $.each(arr, function() { console.log(this.valueOf()); // [PrimitiveValue]の値 //console.log(this + ""); // この方法でもOK }); // オブジェクト var obj = { 'key1' : 'A001', 'key2' : 'B002', 'key3' : 'C003' }; $.each(obj, function() { console.log(this.valueOf()); // [PrimitiveValue]の値 //console.log(this + ""); }); } </script> </head> <body> <h2>test each 6</h2> <button onclick="javascript:testEach();">TEST</button> </body> </html>
$.each の中の this にはオブジェクト型で渡されるため、その中の値を取得するには this.valueOf とします。
この方法は面倒なので、一つ前の index, value を用いる方法が良いと思います。
最後に、繰返し処理のなかで for 文の break, continue の様な処理に付いて説明します。
以下の例では、6件の配列データを宣言し、2番目までは処理を continue し、5番目以降で break する処理を行います。
■配列に対する each 処理での break, continue 例
<html> <head> <meta charset="utf-8"> <title>test checkbox</title> <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script> <script type="text/javascript"> //TEST関数 function testEach() { // 6件の配列 var arr = ['A001', 'B002', 'C003', 'D004', 'E005', 'F006']; $.each(arr, function(index, value) { // indexは[0]から始まることに注意!! if (index <= 1) { // 2番目までは処理をcontinue return true; } if (index >= 4) { // 5番目以降でbreak return false; } console.log('index(' + index + ') = ' + value); }); } </script> </head> <body> <h2>test each 6</h2> <button onclick="javascript:testEach();">TEST</button> </body> </html>
コンソールの出力は以下の様になります。index(2) = C003 index(3) = D004
関連する記事
⇒JavaScript 何に使う
⇒JavaScript jQueryの使い方(セレクタ)
⇒JavaScript jQueryの使い方(セレクタ)その2
⇒JavaScript 関数の宣言について(function)
⇒JavaScript jQueryでJavascriptファイルの動的に変更する方法