[2023/01/26] PHP PDF出力の方法について・矩形領域への文字列出力(Cellメソッド) (No.299)
[2023/01/23] PHP PDF出力の方法について・マージンとヘッダ/フッタ(TCPDF) (No.298)
[2023/01/19] PHP PDF出力の方法について(TCPDF) (No.297)
[2022/12/08] PHP Carbon 日付ライブラリの使い方について(Carbon\Carbon) (No.295)
[2022/11/29] PHP DateTimeクラス(オブジェクト)のコピーについて (No.294)
-
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
-
前回の 「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':ブラウザに出力する(既定) ?>
実行結果は以下の様な表示になるはずです。
PR -
初回の 「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>
-
今回はPHPで使われる日付ライブラリの Carbon の使い方について説明したいと思います。
なお Carbon のインストールについては以下の記事を参照して下さい。
⇒PHP Carbon(ライブラリ)を使って日付処理・インストール
以下の順で説明したいと思います。■Carbon インスタンスの生成
先ずは Carbon クラスのインスタンスの生成について例をあげて説明します。
普通に new Carbon() とすることで Carbon のインスタンスを生成できます。 生成されたインスタンスを指し示す変数から各種のメソッドを使うことで各種の処理ができます。
また Carbon 備わった各種のスタティックなメソッドでもインスタンスの生成ができます。 以下の例では now() yesterday() tomorrow() などを示しています。
new Carbon('日付指定文字列') のクラスの引数に日付指定文字列を渡すことで指定した日付のインスタンスを生成できます。<?php // ライブラリ読込 require $_SERVER['DOCUMENT_ROOT'].'vendor/autoload.php'; // ライブラリ使用宣言 use Carbon\Carbon; // インスタンス生成:現在のシステム日時 $dtCar = new Carbon(); echo "現在のシステム日時: ".$dtCar."<br>\n"; // 文字列を返すデフォルトのメソッドは「__toString()」 echo "現在のシステム日時: ".$dtCar->__toString()."<br>\n"; // static な関数による生成 // インスタンス生成(static):本日 $dtNow = Carbon::now(); echo "static-本日: ".$dtNow."<br>\n"; // インスタンス生成(static):昨日 $dtYes = Carbon::yesterday(); echo "static-昨日: ".$dtYes."<br>\n"; // インスタンス生成(static):明日 $dtTom = Carbon::tomorrow(); echo "static-明日: ".$dtTom."<br>\n"; // Carbonクラス生成時にパースを渡す // クラス生成時に日付文字列を渡す $dt1 = new Carbon('2022-11-30'); echo "日付文字列を渡す: ".$dt1."<br>\n"; // クラス生成時に日付加算文字列を渡す(システム日付[2022-11-29]に対して次の日) $dt2 = new Carbon('+1 days'); echo "日付加算文字列を渡す: ".$dt2."<br>\n"; // クラス生成時に月数加算文字列を渡す(システム日付[2022-11-29]に対して2か月後) $dt3 = new Carbon('+2 months'); echo "月数加算文字列を渡す: ".$dt3."<br>\n"; // クラス生成時に年数加算文字列を渡す(システム日付[2022-11-29]に対して2年後) $dt4 = new Carbon('+2 years'); echo "年数加算文字列を渡す: ".$dt4."<br>\n"; // クラス生成時に日指定文字列を渡す(システム日付[2022-11-29]に対して次月の初日) $dt5 = new Carbon('first day of next month'); echo "次月の最初の日: ".$dt5."<br>\n"; // クラス生成時に日指定文字列を渡す(システム日付[2022-11-29]に対して前月の初日) $dt6 = new Carbon('first day of last month'); echo "前月の最初の日: ".$dt6."<br>\n"; // クラス生成時に日指定文字列を渡す(システム日付[2022-11-29]に対して次月の末日) $dt7 = new Carbon('last day of next month'); echo "次月の最後の日: ".$dt7."<br>\n"; // クラス生成時に日指定文字列を渡す(システム日付[2022-11-29]に対して前月の末日) $dt8 = new Carbon('last day of last month'); echo "前月の最後の日: ".$dt8."<br>\n"; // クラス生成時に日付指定の生成メソッドを使用 $dt9 = Carbon::createFromDate(2022, 9, 25); echo "日付指定の生成メソッド: ".$dt9."<br>\n"; // クラス生成時に日時指定の生成メソッドを使用 $dt10 = Carbon::create(2022, 9, 25, 17, 10, 36, 'Asia/Tokyo'); // タイムゾーン指定は無くてもOK echo "日時指定の生成メソッド: ".$dt10."<br>\n"; ?>
このプログラムの実行結果は以下の通りです。
現在のシステム日時: 2022-11-29 08:48:39 現在のシステム日時: 2022-11-29 08:48:39 static-本日: 2022-11-29 08:48:39 static-昨日: 2022-11-28 00:00:00 static-明日: 2022-11-30 00:00:00 日付文字列を渡す: 2022-11-30 00:00:00 日付加算文字列を渡す: 2022-11-30 08:48:39 月数加算文字列を渡す: 2023-01-29 08:48:39 年数加算文字列を渡す: 2024-11-29 08:48:39 次月の最初の日: 2022-12-01 08:48:39 前月の最初の日: 2022-10-01 08:48:39 次月の最後の日: 2022-12-31 08:48:39 前月の最後の日: 2022-10-31 08:48:39 日付指定の生成メソッド: 2022-09-25 08:48:39 日付指定の生成メソッド: 2022-09-25 17:10:36
■日付データの取得(Getter)
Carbon クラスのインスタンスの生成しその日付データから各種の日付に関するデータを取得できます。
日付データのなかで良く使われるであろうものをピックアップしました。
取得の名前をみると VB.NET の DateTime 型のプロパティとよく似ていると思いますが、真似をしたのでしょうか?
とにかく、実際に例を以下に示します。<?php // ライブラリ読込 require $_SERVER['DOCUMENT_ROOT'].'vendor/autoload.php'; // ライブラリ使用宣言 use Carbon\Carbon; // クラス生成時に日付文字列を渡す $dt = new Carbon('2022-11-30 12:25:30.123456'); echo "<pre>"; echo "日付:".$dt->format('Y/m/d H:i:s.u')."\n"; // 各種 getter(戻り値はInteger) // 年 echo '$dt->year :';var_dump($dt->year); // 月 echo '$dt->month :';var_dump($dt->month); // 日 echo '$dt->day :';var_dump($dt->day); // 時 echo '$dt->hour :';var_dump($dt->hour); // 分 echo '$dt->minute :';var_dump($dt->minute); // 秒 echo '$dt->second :';var_dump($dt->second); // マイクロ秒 echo '$dt->micro :';var_dump($dt->micro); // 週のIndex値 (日:0, 月:1, 火:2, 水:3, 木:4, 金:5, 土:6) echo '$dt->dayOfWeek :';var_dump($dt->dayOfWeek); // 年の何日目(0から始まる) echo '$dt->dayOfYear :';var_dump($dt->dayOfYear); // 月の何週目(1から始まる) echo '$dt->weekOfMonth:';var_dump($dt->weekOfMonth); // 年の何週目(1から始まる) echo '$dt->weekOfYear :';var_dump($dt->weekOfYear); // 月の日数 echo '$dt->daysInMonth:';var_dump($dt->daysInMonth); // 第何四半期か echo '$dt->quarter :';var_dump($dt->quarter); echo "</pre>"; ?>
このプログラムの実行結果は以下の通りです。これらの値は全て Integer 型で返されます。
日付:2022/11/30 12:25:30.123456 $dt->year :int(2022) $dt->month :int(11) $dt->day :int(30) $dt->hour :int(12) $dt->minute :int(25) $dt->second :int(30) $dt->micro :int(123456) $dt->dayOfWeek :int(3) $dt->dayOfYear :int(334) $dt->weekOfMonth:int(5) $dt->weekOfYear :int(48) $dt->daysInMonth:int(30) $dt->quarter :int(4)
■日付データの設定(Setter)
上記の「日付データの取得(Getter)」では各種の日付データの取得を行いましたが、 ここではその Getter の名前に値を設定することで日付データインスタンス内の値を変更することが出来ます。
<?php // ライブラリ読込 require $_SERVER['DOCUMENT_ROOT'].'vendor/autoload.php'; // ライブラリ使用宣言 use Carbon\Carbon; // 取敢えずクラス生成 $dt = new Carbon(); // 各種 setter // 年 $dt->year = 2022; // 月 $dt->month = 12; // 日 $dt->day = 1; // 時 $dt->hour = 13; // 分 $dt->minute = 45; // 秒 $dt->second = 29; // マイクロ秒 $dt->micro = 987654; // 日付表示 echo "日付:".$dt->format('Y/m/d H:i:s.u')."\n"; ?>
このプログラムの実行結果は以下の通りです。
日付:2022/12/01 13:45:29.987654
■日付データの加減算
上記の「日付データの取得(Getter)」の名前に「add」及び「sub」では各種の日付データの取得を行いましたが、 ここではその Getter の名前に値を設定することで日付データインスタンス内の値を変更することが出来ます。
以下に加減算を行うメソッドの主なものを示します。 取敢えず実行結果は長くなるので、コメントとして右側に表示しています。<?php // ライブラリ読込 require $_SERVER['DOCUMENT_ROOT'].'vendor/autoload.php'; // ライブラリ使用宣言 use Carbon\Carbon; // クラス生成時に日付文字列を渡す $dt = new Carbon('2022-11-30 12:25:30.123456'); echo "<pre>"; echo "日付:".$dt->format('Y/m/d H:i:s.u')."\n"; // 各種 加減算 // 世紀 echo '世紀'."\n"; // 取敢えず結果をコメントで表示 echo $dt->addCenturies(4)."\n"; //指定世紀数分加算 // 2422-11-30 12:25:30 echo $dt->addCentury()."\n"; //1世紀加算 // 2522-11-30 12:25:30 echo $dt->subCentury()."\n"; //1世紀減算 // 2422-11-30 12:25:30 echo $dt->subCenturies(4)."\n"; //指定世紀数分減算 // 2022-11-30 12:25:30 // 年 echo '年'."\n"; echo $dt->addYears(2)."\n"; //指定年数分加算 // 2024-11-30 12:25:30 echo $dt->addYear()."\n"; //1年加算 // 2025-11-30 12:25:30 echo $dt->subYear()."\n"; //1年減算 // 2024-11-30 12:25:30 echo $dt->subYears(2)."\n"; //指定年数分減算 // 2022-11-30 12:25:30 // 月 echo '月'."\n"; echo $dt->addMonths(60)."\n"; //指定月数分加算 // 2027-11-30 12:25:30 echo $dt->addMonth()."\n"; //1月加算 // 2027-12-30 12:25:30 echo $dt->subMonth()."\n"; //1月減算 // 2027-11-30 12:25:30 echo $dt->subMonths(60)."\n"; //指定月数分減算 // 2022-11-30 12:25:30 // 日 echo '日'."\n"; echo $dt->addDays(29)."\n"; //指定日数分加算 // 2022-12-29 12:25:30 echo $dt->addDay()."\n"; //1日加算 // 2022-12-30 12:25:30 echo $dt->subDay()."\n"; //1日減算 // 2022-12-29 12:25:30 echo $dt->subDays(29)."\n"; //指定日数分減算 // 2022-11-30 12:25:30 // 週 echo '週'."\n"; echo $dt->addWeeks(3)."\n"; //指定週分加算 // 2022-12-21 12:25:30 echo $dt->addWeek()."\n"; //1週加算 // 2022-12-28 12:25:30 echo $dt->subWeek()."\n"; //1週減算 // 2022-12-21 12:25:30 echo $dt->subWeeks(3)."\n"; //指定週分減算 // 2022-11-30 12:25:30 // 週(土日以外) echo '週'."\n"; echo $dt->addWeekdays(4)."\n"; //指定週分加算 // 2022-12-06 12:25:30 echo $dt->addWeekday()."\n"; //1世紀加算 // 2022-12-07 12:25:30 echo $dt->subWeekday()."\n"; //1世紀減算 // 2022-12-06 12:25:30 echo $dt->subWeekdays(4)."\n"; //指定週分減算 // 2022-11-30 12:25:30 // 時 echo '時'."\n"; echo $dt->addHours(24)."\n"; //指定時間分加算 // 2022-12-01 12:25:30 echo $dt->addHour()."\n"; //1時間加算 // 2022-12-01 13:25:30 echo $dt->subHour()."\n"; //1時間減算 // 2022-12-01 12:25:30 echo $dt->subHours(24)."\n"; //指定時間分減算 // 2022-11-30 12:25:30 // 分 echo '分'."\n"; echo $dt->addMinutes(61)."\n"; //指定分数加算 // 2022-11-30 13:26:30 echo $dt->addMinute()."\n"; //1分加算 // 2022-11-30 13:27:30 echo $dt->subMinute()."\n"; //1分減算 // 2022-11-30 13:26:30 echo $dt->subMinutes(61)."\n"; //指定分数減算 // 2022-11-30 12:25:30 // 秒 echo '秒'."\n"; echo $dt->addSeconds(61)."\n"; //指定秒数加算 // 2022-11-30 12:26:31 echo $dt->addSecond()."\n"; //1秒加算 // 2022-11-30 12:26:32 echo $dt->subSecond()."\n"; //1秒減算 // 2022-11-30 12:26:31 echo $dt->subSeconds(61)."\n"; //指定秒数減算 // 2022-11-30 12:25:30 echo "</pre>"; ?>
■日付データの比較
日付データの比較は「等しい」「大きい」「小さい」などの英語表記の以下のメソッドがあります。
- 等しい eq() equalTo() =
- 等しく無い ne() notEqualTo() !=
- 大きい gt() greaterThan() >
- 以上 gte() greaterThanOrEqualTo() >=
- 小さい lt() lessThan() <
- 以下 lte() lessThanOrEqualTo() <=
以下に比較を行うメソッドの主なものを示します。 取敢えず実行結果は長くなるので、コメントとして右側に表示しています。<?php // ライブラリ読込 require $_SERVER['DOCUMENT_ROOT'].'vendor/autoload.php'; // ライブラリ使用宣言 use Carbon\Carbon; // クラス生成時に日付文字列を渡す // 日付の設定 $first = Carbon::create("2022-10-05"); $second = Carbon::create("2022-10-06"); echo "<pre>"; // $second から見て $first がどうかを比較 // equal var_dump($first->eq($second)); // bool(false) // not equal var_dump($first->ne($second)); // bool(true) // greater than var_dump($first->gt($second)); // bool(false) // greater than or equal var_dump($first->gte($second)); // bool(false) // less than var_dump($first->lt($second)); // bool(true) // less than or equal var_dump($first->lte($second)); // bool(true) echo "</pre>"; ?>
■日付データのデータ変換
Carbon には日付データから Array、Object(stdclass)、DateTimeクラス、DateTimeImmutableクラスへの変換用メソッドがあります。 これらのメソッドが有用かどうかは別として、取り敢えず紹介しておきます。
<?php // ライブラリ読込 require $_SERVER['DOCUMENT_ROOT'].'vendor/autoload.php'; // ライブラリ使用宣言 use Carbon\Carbon; // クラス生成 $dt = Carbon::createFromFormat('Y-m-d H:i:s.u', '2022-12-05 16:45:27.612984'); echo "<pre>"; // Array への変換 $arrDt = $dt->toArray(); var_dump($arrDt); // Object への変換(stdclass) $objDt = $dt->toObject(); var_dump($objDt); // DateTime への変換 $dateDt = $dt->toDate(); // Same as $dt->toDateTime() var_dump($dateDt); // DateTimeImmutable への変換 $objDtim = $dt->toDateTimeImmutable(); var_dump($objDtim); echo "</pre>"; ?>
このプログラムの実行結果は以下の通りです。
array(12) { ["year"]=> int(2022) ["month"]=> int(12) ["day"]=> int(5) ["dayOfWeek"]=> int(1) ["dayOfYear"]=> int(339) ["hour"]=> int(16) ["minute"]=> int(45) ["second"]=> int(27) ["micro"]=> int(612984) ["timestamp"]=> int(1670258727) ["formatted"]=> string(19) "2022-12-05 16:45:27" ["timezone"]=> object(Carbon\CarbonTimeZone)#4 (2) { ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" } } object(stdClass)#3 (12) { ["year"]=> int(2022) ["month"]=> int(12) ["day"]=> int(5) ["dayOfWeek"]=> int(1) ["dayOfYear"]=> int(339) ["hour"]=> int(16) ["minute"]=> int(45) ["second"]=> int(27) ["micro"]=> int(612984) ["timestamp"]=> int(1670258727) ["formatted"]=> string(19) "2022-12-05 16:45:27" ["timezone"]=> object(Carbon\CarbonTimeZone)#5 (2) { ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" } } object(DateTime)#6 (3) { ["date"]=> string(26) "2022-12-05 16:45:27.612984" ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" } object(DateTimeImmutable)#8 (3) { ["date"]=> string(26) "2022-12-05 16:45:27.612984" ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" }
-
DateTime クラス(オブジェクト)は良く使うクラスですが、コピーについては注意が必要なことがあります。
以下のソースを見て下さい。単に「$datetime1」に日付を設定し「$datetime2」にコピーをしています。<?php $datetime1 = new DateTime('2022-11-20 10:30:00'); $datetime2 = $datetime1; $datetime2->modify('+1 day'); echo "\$datetime1 = ".$datetime1->format('Y-m-d')."<br>\n"; echo "\$datetime2 = ".$datetime2->format('Y-m-d')."<br>\n"; ?>
これを実行するとブラウザに以下の様に表示されます。$datetime1 = 2022-11-21 $datetime2 = 2022-11-21
「$datetime2」にコピーをしているので「$datetime1」に影響しないと思いきや、「$datetime2」に modify メソッドで日付を1日加算すると 「$datetime1」「$datetime2」共に同じ日付になります。
「$datetime2」へのコピーでは参照渡しの様な感じになる様です。(実際のPHPの中では参照では無い様ですが…)
そこで、これを解消するにはクローン命令で別のインスタンスを作成し「$datetime2」に代入する必要があります。<?php $datetime1 = new DateTime('2022-11-20 10:30:00'); $datetime2 = clone $datetime1; echo "\$datetime1 = ".$datetime1->format('Y-m-d')."<br>\n"; echo "\$datetime2 = ".$datetime2->format('Y-m-d')."<br>\n"; $datetime2->modify('+1 day'); echo "\$datetime2 = ".$datetime2->format('Y-m-d')."<br>\n"; ?>
これを実行するとブラウザに以下の様に表示されます。$datetime1 = 2022-11-20 $datetime2 = 2022-11-20 $datetime2 = 2022-11-21
modify や add メソッドの戻り値は自分自身の DateTime オブジェクトを返します。
実際 PHP の正規のマニアルには以下の様に記述されています。戻り値: メソッドチェインに使う、変更された DateTime オブジェクトを返します。
メソッドチェイン とは以下の様な使い方です。
<?php $datetime1 = new DateTime('2022-11-30 10:30:00'); echo "\$datetime1 = ".$datetime1->modify('+1 day')->format('Y-m-d')."<br>\n"; echo "\$datetime1 = ".$datetime1->modify('+1 day')->modify('+1 day')->format('Y-m-d')."<br>\n"; echo "\$datetime1 = ".$datetime1->format('Y-m-d')."
\n"; ?>3行目では modify メソッドの直後に format メソッドを呼出しています。modify は DateTime オブジェクトを返すので、この方法が可能です。 さらに、4行目では modify メソッドの直後に再度 modify メソッドを呼出しています。
実行結果は以下の様に表示されます。 5行目では再度「$datetime1」の値を表示していますが、3回の modify の実行で日付は初期値から3日後になります。 modify では自分のオブジェクトを変更することがわかります。$datetime1 = 2022-12-01 $datetime1 = 2022-12-03 $datetime1 = 2022-12-03
ところで DateTime の値を変更する modify メソッド等で新しい DateTime オブジェクトを返したい場合には DateTimeImmutable クラスを使用します。Immutable(イミュータブル) とは「不変」「変わらない」ことを意味するそうです。
では DateTimeImmutable クラスを使用して最初のソースを変更します。<?php $datetime1 = new DateTimeImmutable('2022-11-20 10:30:00'); $datetime2 = $datetime1->modify('+1 day');; echo "\$datetime1 = ".$datetime1->format('Y-m-d')."<br>\n"; echo "\$datetime2 = ".$datetime2->format('Y-m-d')."<br>\n"; ?>
実行結果は以下の様に表示されます。 「$datetime1」の modify メソッドの結果は別のオブジェクトとして「$datetime2」に設定された様です。 ただし、「$datetime1」の値は変化がありません。
$datetime1 = 2022-11-20 $datetime2 = 2022-11-21