[2023/03/10] PHP TCPDFの「Cellメソッド」を使ったテーブル表示(背景色あり)の方法について (No.309)
[2023/02/08] PHP TCPDF出力の方法について・矩形領域への枠線設定(setLineStyleメソッド) (No.308)
[2023/02/07] PHP TCPDFのテキストデータの段組みの方法について (No.307)
[2023/02/07] PHP TCPDFの画像ファイルの出力について(imageメソッド)・その3 (No.306)
[2023/02/06] PHP TCPDFの画像ファイルの出力について(imageメソッド)・その2 (No.305)
-
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
-
今回は「Cellメソッド」を使って、配列データをテーブルの表として枠線と背景色を塗りながら、四角い領域に表示する方法について説明します。
「Cellメソッド」の説明は以下のページで行っていますので、詳しくはそちらを参照して下さい。
⇒PHP PDF出力の方法について・矩形領域への文字列出力(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」と矩形領域の塗つぶし指定の「$fill」引数を指定します。
それでは Cell メソッドを使用したデータテーブルの表示の簡単な例を以下に記します。
■Cell メソッドを使用したデータテーブルの表示
setLineStyle メソッドのスタイル指定連想配列は、ほぼ以下の様にしています。
<?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(); $pdf->Write(0, '[Cell]関数でのテーブル表示テスト', '', false, '', true); // 各色指定による[Cell]関数でのテーブル表示 $arrTableData = [ ['A001', 'aaaa' , 'a002', 'AAAAA' ] , ['B001', 'bbbb' , 'b002', 'BBBBBBBB'] , ['C001', 'cccccc', 'c002', 'CCCCCC' ] , ['D001', 'dddddd', 'd002', 'DDDDDDD' ] , ]; // 各データのセル幅 $arrWidth = [40, 35, 40, 45]; // 各データの高さ $intHeight = 6; // 塗潰し色設定 : [Cell()]のfill指定に適用される $pdf->setFillColor(224, 235, 255); // テキスト色設定 $pdf->setTextColor(0); // 線色設定 : [Cell()]のborder指定に適用される $pdf->setDrawColor(0, 0, 255); // 線の幅設定 : [Cell()]のborder指定に適用される $pdf->setLineWidth(0.3); // 現在のX座標取得 $x = $pdf->GetX(); // 各データのセル幅の合計値でセルの[Top]の枠線を引く(高さは「0」指定) $pdf->Cell(array_sum($arrWidth), 0, '', 'T', 0); // カーソルは右端指定 // カーソルのX座標指定 $pdf->SetX($x); // 塗潰し指定(最初は塗潰し無し) $fill = 0; // データ配列からテーブル表示 foreach($arrTableData as $data) { // 各カラムは左右の枠線描画指定 $pdf->Cell($arrWidth[0], $intHeight, $data[0], 'LR', 0, 'L', $fill); $pdf->Cell($arrWidth[1], $intHeight, $data[1], 'LR', 0, 'L', $fill); $pdf->Cell($arrWidth[2], $intHeight, $data[2], 'LR', 0, 'R', $fill); $pdf->Cell($arrWidth[3], $intHeight, $data[3], 'LR', 0, 'R', $fill); $pdf->Ln(); // 塗潰し指定反転 $fill = !$fill; } // 各データのセル幅の合計値でセルの[Top]の枠線を引く(高さは「0」指定) $pdf->Cell(array_sum($arrWidth), 0, '', 'T'); // pdf表示設定 $pdf->Output('pdf-cells-color-1.pdf', 'I'); ?>
これの実行結果は以下の通りです。
各データの縦の枠線は Cell メソッドの枠指定 'LR' で左右の枠を指定します。 また、各データの塗潰しの指定は true と false が交互に指定される様にしています。
テーブルの上下の横線はテーブル全部の横幅の合計数に対して Cell メソッドで高さ「0」の枠のみを描画させています。
なお、塗潰し色・テキスト色・線の色は以下のメソッドで指定したものが適用されます。- 塗潰し色設定 :setFillColor
- テキスト色設定:setTextColor
- 線色設定 :setDrawColor
関連する記事
⇒PHP PDFファイル出力の方法について(TCPDF)
⇒PHP TCPDF PDFのワークシートの処理について
⇒PHP TCPDF PDFのワークシートのセルへのアクセスについて
⇒PHP TCPDF PDFのワークシートのセルへのアクセスについて(行・列指定)
⇒PHP TCPDF PDFのワークシートのセルへ漢字(全角文字)の設定について
⇒PHP TCPDF PDFのワークシートの紙の大きさやページ設定について
PR -
以下の記事では Cell メソッド及び MultiCell メソッドについて説明しましたが、 それらのメソッドの前に setLineStyle メソッドで枠線の設定を行うと矩形領域の枠線に変化を付けて表示されます。
- PHP PDF出力の方法について・矩形領域への文字列出力(Cellメソッド)
- PHP PDF出力の方法について・矩形領域への文字列出力(MultiCellメソッド)
- PHP PDF出力の方法について・矩形領域への文字列出力(MultiCellメソッド)その2
それでは setLineStyle メソッドの引数ついて説明します。// setLineStyleメソッド public function setLineStyle($style, $ret=false) // // $style : スタイルを指定する連想配列(以下のKEYで指定) // 'width' (float) : 線の太さ // 'cap' (string) : 線の端の部分の種類('butt', 'round', 'square') // ・'butt' (端の部分が線の長さと等しく平ら) // ・'round' (丸) // ・'square'(端を四角く) // 'square'(string) : 線の頂点結合の種類('miter', 'round', 'bevel') // ・'miter'(鋭角) // ・'round'(丸) // ・'bevel'(面取り) // 'dash' (mixed) : 破線パターン // [例] // ・string "2" : 2 ON, 2 OFF の繰り返し // ・string "2,1" : 2 ON, 1 OFF の繰り返し // ・array "2,3,1,2" : 2 ON, 3 OFF, 1 ON, 2 OFF の繰り返し // 'phase' (integer): 破線パターン開始位置のシフト長 // 'color' (array) : 描画色で以下の4種類の指定がある // ・array(GREY) : グレー値(0~255) // ・array(R,G,B) : RGB設定値(それぞれ0~255) // ・array(C,M,Y,K): CMYK設定値(それぞれ0~100) // ・array(C,M,Y,K,SpotColorName): // $ret : true の場合はコマンドを送信しない // (通常は指定無しでOKです)
■簡単な例で矩形領域の枠線表示
setLineStyle メソッドのスタイル指定連想配列は、ほぼ以下の様にしています。
$pdf->setLineStyle( array('width' => 1.0, // 枠線幅を太く1mmにする 'cap' => 'butt', // 端の部分は平ら 'join' => 'miter', // 鋭角 'dash' => 10, // 10:ON ,10:OFF を繰り返す 'color' => array(R,G,B) // RGB指定で各々の色 ) );
ここで 'dash' の値ですがピクセル値(px)なので「mm」換算では以下の計算式になります。
「'dash'値mm換算」=「'dash'値(px)」/(「DPI値」/「25.4」)
よって上記の「'dash'値(px)」が「10」の場合は
「'dash'値mm換算」=「10」/(「72(DPIデフォルト値)」/「25.4」)=3.5277…(mm)
画面上は約3.53mmの破線間隔になります。
以下にソースを記します。<?php require_once('../tcpdf/tcpdf.php'); // TCPDFクラス生成 $pdf = new TCPDF(); // デフォルトで用意されている日本語フォント[小塚ゴシックPro M] $strFont = "kozgopromedium"; // ヘッダ・フッタ出力設定 $pdf->setPrintHeader(true); $pdf->setPrintFooter(true); // 本文の日本語フォント[小塚ゴシックPro M] $pdf->SetFont($strFont, "", 14); // 新規ページの追加 $pdf->AddPage(); $pdf->Write(0, 'SetLineStyle() のテスト', '', 0, 'L', true, 0, false, false, 0); $pdf->Ln(); $pdf->setLineStyle(array('width' => 1.0, 'cap' => 'butt', 'join' => 'miter', 'dash' => 10, 'color' => array(255, 0, 0))); $pdf->setFillColor(255,255,128); $pdf->setTextColor(0,0,128); $text="Cell メソッドでの出力"; $pdf->Cell(0, 0, $text, 1, 1, 'L', 1, 0); $pdf->Ln(); $text="MultiCell メソッドでの出力"; $pdf->setLineStyle(array('width' => 1.0, 'cap' => 'butt', 'join' => 'miter', 'dash' => 10, 'color' => array(0, 0, 255))); $pdf->setFillColor(255,255, 0); $pdf->setTextColor( 0, 0,255); $pdf->MultiCell(60, 4, $text, 1, 'C', 1, 0); $pdf->SetX($pdf->GetX() + 1.0); $pdf->setLineStyle(array('width' => 1.0, 'cap' => 'butt', 'join' => 'miter', 'dash' => 10, 'color' => array(255, 192, 0))); $pdf->setFillColor( 0,255,255); $pdf->setTextColor(128,128,128); $pdf->MultiCell(60, 4, $text, 'LR', 'C', 1, 0); $pdf->SetX($pdf->GetX() + 1.0); $pdf->setLineStyle(array('width' => 1.0, 'cap' => 'butt', 'join' => 'miter', 'dash' => "10,2,2", 'color' => array(255, 0, 255))); $pdf->setFillColor(0,255,0); $pdf->setTextColor(255,0,255); $pdf->MultiCell(60, 4, $text, 1, 'C', 1, 1); // pdf表示設定 $pdf->Output('pdf-setlinestyle-1-1.pdf', 'I'); ?>
これの実行結果は以下の通りです。
Cell メソッドに対応する setLineStyle メソッドのスタイル指定配列では 'dash' を「10」としているので 破線の表示「約3.53mm」非表示「約3.53mm」の繰り返し表示されます。
また、破線の端がきっちりとさせる為に 'cap' を「'join'」 'join' を「'miter'」にしています。
MultiCell メソッドの2番目のテストは枠線の表示指定を 'LR' として枠の左右しか描画させていません。
また、3番目のテストは 'dash' を「'10,2,2'」にして見た目「一点鎖線」の様になっています。
この場合の破線の表示パターンは「10:ON , 2:OFF , 2:ON , 2:OFF」の繰り返しになります。
(ちなみに、破線パターンの「2」は「換算mm」「2」/(「72(DPIデフォルト値)」/「25.4」)=0.705…(mm)となります。)
-
段組み とは1ページの中で複数の列に分けて、テキストを左の列から右方向へ順次出力することを言います。
以下の画像は 段組み のテストとして、ワードで作成した3段組のものです。
この様な段組みが TCPDF では簡単にできますので、この説明を行っていきます。TCPDF での 段組み は AddPage メソッドを実行後に、「カラム定義の設定」「開始カラムの指定」を行い、 テキストの文字列を Write メソッドを実行すれば実現します。
取敢えず 段組み に必要な各種のメソッドに付いて以下に記します。// // 同一幅の段組み設定 public function setEqualColumns($numcols=0, $width=0, $y=null) // $numcols : カラム数(「0」設定で段組みを不可指定) // $width : カラム幅 // $y : カラム開始Y座標(「null」であれば現在位置から出力) // 段組みのカラムを削除 public function resetColumns() // カラム定義を配列で設定 public function setColumnsArray($columns) // $columns : カラム定義配列 // $columns[]['w'] : カラム幅 // $columns[]['s'] : カラムの空白幅 // $columns[]['y'] : カラムの先頭位置 // 開始カラムの選択 public function selectColumn($col=null) // $col : カラム番号(番号は「0」から始まる、「null」の場合は現在のカラム) // 現在カラムの取得 public function getColumn() // 現在のカラム数の取得 public function getNumberOfColumns() //
■段組みでのテキストデータ表示
表示を行うテキストデータは「test-mul-col.txt」として同一ディレクトリ内に設定しておきます。
AddPage メソッドを実行後に、resetColumns メソッドでカラムをリセットし、「カラム定義の設定」を setEqualColumns メソッドで カラム数は「3」で幅は「60mm」を指定します。
その後「開始カラムの指定」を selectColumn メソッドで「0」カラムから出力する様に指定します。
テキスト文字列の出力は file_get_contents メソッドでテキストファイルの内容を読込んで Write メソッドを実行します。<?php require_once('../tcpdf/tcpdf.php'); // TCPDFクラス生成 $pdf = new TCPDF(); // デフォルトで用意されている日本語フォント[小塚ゴシックPro M] $strFont = "kozgopromedium"; // ヘッダ・フッタ出力設定 $pdf->setPrintHeader(true); $pdf->setPrintFooter(true); // 本文の日本語フォント[小塚ゴシックPro M] $pdf->SetFont($strFont, "", 12); // 新規ページの追加 $pdf->AddPage(); // カラム制御をリセット $pdf->resetColumns(); // カラム定義の設定(3カラムで、幅は60mm) $pdf->setEqualColumns(3, 60); // カラム定義の指定 $pdf->selectColumn(0); // 外部テキストファイルの読込 $content = file_get_contents('test-mul-col.txt', false); // テキスト色 $pdf->setTextColor(50, 50, 50); // 内容を出力 $pdf->Write(0, $content, '', 0, 'J', true, 0, false, true, 0); // pdf表示設定 $pdf->Output('pdf-mul-col-1-1.pdf', 'I'); ?>
これの実行結果は以下の通りです。(ワードの出力とはフォントの違いなどから若干の表示が異なります。)
上記のソースで setEqualColumns メソッドでは同じカラム幅なのでこのメソッドを用いましたが、 その部分を以下の様に setColumnsArray メソッドで置き換えができます。// カラム定義の設定(3カラムで、幅は60mm) //$pdf->setEqualColumns(3, 60); // [setColumnsArray]に置き換え $columns = [ ['w' => 60, 's' => 0, 'y' => 10], ['w' => 60, 's' => 0, 'y' => 10], ['w' => 60, 's' => 0, 'y' => 10] ]; $pdf->setColumnsArray($columns); //
この方式で、3カラムの幅が異なる例をテストしてみます。
<?php require_once('../tcpdf/tcpdf.php'); // TCPDFクラス生成 $pdf = new TCPDF(); // デフォルトで用意されている日本語フォント[小塚ゴシックPro M] $strFont = "kozgopromedium"; // ヘッダ・フッタ出力設定 $pdf->setPrintHeader(true); $pdf->setPrintFooter(true); // 本文の日本語フォント[小塚ゴシックPro M] $pdf->SetFont($strFont, "", 12); // 新規ページの追加 $pdf->AddPage(); // カラム制御をリセット $pdf->resetColumns(); // カラム定義の設定 $columns = [ ['w' => 30, 's' => 0, 'y' => 10], ['w' => 60, 's' => 0, 'y' => 10], ['w' => 90, 's' => 0, 'y' => 10] ]; $pdf->setColumnsArray($columns); // カラム定義の指定 $pdf->selectColumn(0); // 外部テキストファイルの読込 $content = file_get_contents('test-mul-col.txt', false); // テキスト色 $pdf->setTextColor(50, 50, 50); // 内容を出力 $pdf->Write(0, $content, '', 0, 'J', true, 0, false, true, 0); // pdf表示設定 $pdf->Output('pdf-mul-col-1-1.pdf', 'I'); ?>
これの実行結果は以下の通りです。(カラム幅が異なっていることが確認できます。)
-
「PHP PDF出力の方法について・マージンとヘッダ/フッタ(TCPDF)」 の記事では TCPDF クラスを継承し Header メソッドを上書きすることでページのヘッダ処理のカスタマイズを行いました。
この Header メソッドは、ページを追加するメソッドの AddPage を実行すると毎回CALLされる様になっています。
TCPDF クラスを継承し Header メソッドのに、ページ全体に背景画像を設定する様にしてみます。
取敢えず Image メソッドの引数はに付いて以下に記します。// Imageメソッド 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.
■ページを追加するごとに、画像を用紙全体に表示する
画像データは以下のものを使います。画像の大きさは「459×640」ピクセルです。
この画像を用紙全体に表示を行います。
TCPDF を継承しクラス名を EXPDF とします。 Header メソッド内の処理は先ず getBreakMargin メソッドで改頁までの余白を取得し getAutoPageBreak メソッドで自動改ページモードを取得し退避します。
その後で SetAutoPageBreak メソッドで自動改ページ機能をOFF、及びページ下端からのマージンを「0」に設定します。 そして Image メソッドで画像をページ全体指定で表示します。
画像表示後 SetAutoPageBreak メソッドで自動改ページ状態と改頁までの余白の設定値を戻してやります。
ここで少し注意点があります。TCPDF クラスではデフォルトでヘッダ出力の設定が true になっているので AddPage メソッド実行時に上書きした Header メソッドが実行されます。 ただし setPrintHeader メソッドで false に設定すると Header メソッドが実行されなくなるので注意が必要です。<?php require_once('../tcpdf/tcpdf.php'); // TCPDF クラスを継承 class EXPDF extends TCPDF { // [Header]を上書き public function Header() { // 改頁までの余白取得 $svBreakMargin = $this->getBreakMargin(); // 自動改ページモード取得 $svAutoPageBreak = $this->getAutoPageBreak(); // 自動改ページ機能をOFF(ページ下端からのマージン;0設定) $this->SetAutoPageBreak(false, 0); // ページ全体に画像を張り付け $this->Image('../_test_pdf/test-backg.png', 0, 0, 210, 297); // ページ設定を元に戻す $this->SetAutoPageBreak($svAutoPageBreak, $svBreakMargin); } } // TCPDFを継承したクラス生成 $pdf = new EXPDF(); // デフォルトで用意されている日本語フォント[小塚ゴシックPro M] $strFont = "kozgopromedium"; // ヘッダ・フッタ出力設定 $pdf->setPrintHeader(true); // デフォルトではヘッダ出力「true」なので要らないが $pdf->setPrintFooter(false); // 本文の日本語フォント[小塚ゴシックPro M] $pdf->SetFont($strFont, "", 10); // 新しいpdfページを追加 $pdf->AddPage(); // 1ページ目タイトル表示 $strOut = '<h1>HTML Imageテスト3・1ページ目表示</h1>'; $pdf->writeHTML($strOut, true, false, true, false, ''); // 新しいpdfページを追加 $pdf->AddPage(); // 1ページ目タイトル表示 $strOut = '<h1>HTML Imageテスト3・2ページ目表示</h1>'; $pdf->writeHTML($strOut, true, false, true, false, ''); // pdf表示設定 $pdf->Output('pdf-img-7-1.pdf', 'I'); ?>
これの実行結果は以下の通りです。
-
「PHP TCPDFの画像ファイルの出力について(imageメソッド)」 の記事では Image メソッドの基本的な使い方を説明しましたが、今回はこのメソッドについてその他のトピックスを記します。
取敢えず Image メソッドの引数はに付いて以下に記します。// Imageメソッド 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.
以下の各種のテストをしてみます。■画像を用紙全体に表示
画像データは以下のものを使います。画像の大きさは「100×30」ピクセルです。
この画像を用紙全体に表示を行います。
方法としては、先ず SetAutoPageBreak メソッドで自動改ページ機能をOFF、及びページ下端からのマージンを「0」に設定します。 その後 Image メソッドでページ全体指定で表示します。
SetAutoPageBreak メソッドの実行前には現在の自動改ページ状態と改頁までの余白を取得して退避し、 画像表示後にその設定値を戻してやります。<?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(); // 改頁までの余白取得 $svBreakMargin = $pdf->getBreakMargin(); // 自動改ページモード取得 $svAutoPageBreak = $pdf->getAutoPageBreak(); // 自動改ページ機能をOFF(ページ下端からのマージン;0設定) $pdf->SetAutoPageBreak(false, 0); // ページ全体に画像を張り付け $pdf->Image('test-logo.png', 0, 0, 210, 297); // ページ設定を元に戻す $pdf->SetAutoPageBreak($svAutoPageBreak, $svBreakMargin); // タイトル表示 $strOut = '<h1>HTML Imageテスト・全体に画像表示</h1>'; $pdf->writeHTML($strOut, true, false, true, false, ''); // pdf表示設定 $pdf->Output('pdf-img-6-1.pdf', 'I'); ?>
これの実行結果は以下の通りです。
■画像がページをまたがって表示
画像の「Y座標」位置がページをまたがる様な指定の場合には、どの様な表示になるのでしょうか。
以下のソースを見て下さい。
最初の画像表示は Image メソッドの「Y座標」をA4サイズ「297mm」から 「画像の縦の長さ:30mm」、「ページブレイク長:20mm」及び「1mm」を引いた値で設定しています。
2番目の画像表示は、「Y座標」を最初の画像表示よりさらに「1mm」を引いた値で設定しています。<?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(); // HTMLの定義 $strOut = '<h1>HTML Imageテスト</h1>'; $pdf->writeHTML($strOut, true, false, true, false, ''); $strOut = '画像の横幅・高さ(100×30 mm)指定し、PageBreakを超える感じて表示'; $pdf->cell(null, null, $strOut, 0, 1); // 縦位置:紙の縦幅「297mm」-画像縦幅「30mm」-PageBreak幅「20mm(デフォルト値)」 $pdf->Image('test-logo.png', 10, 297 - 30 - 20, 100, 30, 'PNG', '', 'N', false); // 縦位置:紙の縦幅「297mm」-画像縦幅「30mm」-PageBreak幅「20mm+1mm」 $pdf->Image('test-logo.png', 10, 297 - 30 - 21, 100, 30, 'PNG', '', 'N', false); // pdf表示設定 $pdf->Output('pdf-img-6-2.pdf', 'I'); ?>
実行結果は以下の様な表示になります。
最初の画像表示は1ページにおさまらないので、2ページ目のマージンの先頭から画像が表示されています。
2番目の画像表示は、2ページ目におさまるため2ページ目の一番下の方に表示されます。
依って Image メソッドのでは指定された「Y座標」+画像の縦サイズがそのページにおさまらない場合は、 「Y座標」は次のページの先頭になる様です。 この点は注意が必要かと思います。■画像が回転して表示される場合の処理(Exif)
Image メソッドで スマートフォンなどでカメラ機能で画像を取り込んだものをそのまま表示すると、回転して表示される場合があります。
このテストですが、仮に回転する画像データを Image メソッドで表示させてみます。<?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(); // HTMLの定義 $strOut = '<h1>HTML Imageテスト・回転1</h1>'; $pdf->writeHTML($strOut, true, false, true, false, ''); // 画像ファイルをそのまま表示 $pdf->Image('trotate.jpg', null, null, 100, 0, 'JPG', '', 'N', false); // pdf表示設定 $pdf->Output('pdf-img-6-3-1.pdf', 'I'); ?>
(この画像は右に90度回転しています)
回転する画像ファイルをHTMLのimgタグで表示させるようにしてHTMLファイルを作成します。<html> <head> <meta charset="utf-8"> <title>HTML TABLE</title> </head> <body> <h2>HTML 回転する画像データテスト</h2> <img src="trotate.jpg" width="600" /> </body> </html>
ブラウザで表示させると、正しく回転を直してくれています。これはブラウザ側で「Exif」情報を元に画像データの回転補正を行っている様です。
この結果から、画像ファイルの「Exif」情報を元に画像データの回転補正を行う様にソースにその処理を追加してみます。 ソースは以下の様になります。<?php /** * 画像の回転 * @access private * @param string $strImagePath 画像ファイルフルパス * @return string 回転後の画像ファイルフルパス */ function rotateImageFile($strImagePath) { // EXIF取得 $exif = @exif_read_data($strImagePath); $exif = $exif ? $exif : []; $orientation = $exif['Orientation'] ?? 1; if ($orientation == 1) { // 回転無し:そのままファイルパスを返す return $strImagePath; } // 画像イメージ $image = imagecreatefromstring(file_get_contents($strImagePath)); // 画像の回転処理 $image = rotateImage($image, $orientation); // 保存 $filetype = pathinfo($strImagePath, PATHINFO_EXTENSION); $strTmpFile = date('YmdHis')."-img.".$filetype; imagejpeg($image, $strTmpFile); // 保存先を返す return $strTmpFile; } /** * 画像を回転させる * @param object $image 画像イメージデータ * @param integer $orientation 回転フラグ * @return resource */ function rotateImage($image, $orientation) { switch ($orientation) { case 1: // 何もしない break; case 2: // 水平方向の反転 imageflip($image, IMG_FLIP_HORIZONTAL); break; case 3: // 180度回転 $image = imagerotate($image, 180, 0); break; case 4: // 垂直方向の反転 imageflip($image, IMG_FLIP_VERTICAL); break; case 5: // 右270度回転、水平方向の反転 $image = imagerotate($image, 270, 0); imageflip($image, IMG_FLIP_HORIZONTAL); break; case 6: // 右270度回転 $image = imagerotate($image, 270, 0); break; case 7: // 右90度回転して水平方向反転 $image = imagerotate($image, 90, 0); imageflip($image, IMG_FLIP_HORIZONTAL); break; case 8: // 右90度回転 $image = imagerotate($image, 90, 0); break; } return $image; } 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(); // HTMLの定義 $strOut = '<h1>HTML Imageテスト・回転3</h1>'; $pdf->writeHTML($strOut, true, false, true, false, ''); // 画像ファイルをそのまま表示 $strFile = 'trotate.jpg'; $pdf->Image($strFile, null, null, 100, 0, 'JPG', '', 'N', false); $pdf->writeHTML('', true, false, true, false, ''); // 画像ファイルの回転 $strRotateFile = rotateImageFile($strFile); $pdf->Image($strRotateFile, null, null, 100, 0, 'JPG', '', 'N', false); if ($strRotateFile != $strFile) { // 画像ファイルが回処理されている場合、削除 unlink($strRotateFile); } // pdf表示設定 $pdf->Output('pdf-img-6-3-3.pdf', 'I'); ?>
実行結果は以下の様な表示になります。
回転処理は全てをテストしていませんので、悪しからずお願いします。