-
以下の記事では 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)となります。)
PR -
段組み とは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'); ?>
実行結果は以下の様な表示になります。
回転処理は全てをテストしていませんので、悪しからずお願いします。
-
「 PHP PDF出力の方法について・マージンとヘッダ/フッタ(TCPDF)」 の記事ではいきなり 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」ピクセルです。
この画像を使って以下の表示をテストします。- 画像の横幅・高さを指定しないでそのまま表示
- 画像の横幅・高さを指定して表示(20×6 mm)
- 画像の横幅・高さを指定して表示(100×30 mm)
- 画像の横幅・高さを指定して表示(100×30 mm) リサイズ指定有り
<?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 px)'; $pdf->cell(0, 0, $strOut, 0, 1); $pdf->Image('test-logo.png', null, null, 0, 0, 'PNG', '', 'N'); $unit = $pdf->pixelsToUnits(100);//px => mm $strOut = '画像の横幅(100px ==> mm 換算):'.$unit.'mm (pixelsToUnitsメソッド使用)'; $pdf->cell(0, 0, $strOut, 0, 1); $pdf->cell(0, 0, '', 0, 1); $strOut = '画像の横幅・高さを指定して表示(20×6 mm)'; $pdf->cell(0, 0, $strOut, 0, 1); $pdf->Image('test-logo.png', null, null, 20, 6, 'PNG', '', 'N', false,300); $pdf->cell(0, 0, '', 0, 1); $strOut = '画像の横幅・高さを指定して表示(100×30 mm)'; $pdf->cell(0, 0, $strOut, 0, 1); $pdf->Image('test-logo.png', null, null, 100, 30, 'PNG', '', 'N', false); $strOut = '画像の横幅・高さを指定して表示(100×30 mm) (resize:true 指定)'; $pdf->cell(0, 0, $strOut, 0, 1); $pdf->Image('test-logo.png', null, null, 100, 30, 'PNG', '', 'N', true, 300); // pdf表示設定 $pdf->Output('pdf-img-5-1.pdf', 'I'); ?>
これの実行結果は以下の通りです。
「画像の横幅・高さを指定しないでそのまま表示」の場合は実際PDF上でどのくらいの大きさで表示されるのかと言いますと、 画像データのピクセル値から DPI を加味して以下の計算で分かります。 (pixelsToUnits メソッドを使用すればピクセルからPDF上の長さが分かります。)
「画像のPDF上の横幅(mm)」=「画像の横幅ピクセル値」/(「PDFでの指定DPI」/「25.4」)
この画像の場合は、以下の計算となります。
「画像のPDF上の横幅(mm)」=「100px」/(「72」/「25.4」)=「35.2777…」
(「DPI」のデフォルトは「72」になっています)
「画像の横幅・高さを指定して表示(20×6 mm)」では指定通り「20×6 mm」に縮小された表示になっています。
また、「画像の横幅・高さを指定して表示(100×30 mm)」では指定通り「100×30 mm」に拡大された表示になっています。
最後のリサイズ指定を「true」にした場合ですが、指定しない場合との違いが良くわかりませんでした。 指定の仕方が悪いのかそれともテストした画像データが適切ではなかったのか?機会があればもう少し調べたいと思います。
■次の画像位置指定・現在行の表示位置
「次の画像位置指定」は「$align」の引数ですが指示内容は以下の通りです。
- 'T' 画像TOPでかつ右端
- 'M' 画像縦方向の中央でかつ右端
- 'T' 画像BOTTOMでかつ右端
- 'N' 次の行
この指定は、画像表示が終わった時点でカレントのX,Y座標をどの位置にするかを示します。
「現在行の表示位置」は「$palign」の引数ですが指示内容は以下の通りです。- 'L' 左揃え
- 'C' 中央揃え
- 'R' 右揃え
- '' 左揃え(RTLの場合は右端)
<?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, ''); // 元の画像そのまま $pdf->writeHTML('<h4>元の画像(サイズ指定無し)</h4>', true, false, true, false, ''); $pdf->Image('test-logo.png', null, null, 0, 0, 'PNG'); // $align : 次の画像を表示する位置 $pdf->SetXY(0, 35); $pdf->writeHTML('<h4>次の画像の表示位置「$align」</h4>', true, false, true, false, ''); $pdf->Image('test-logo.png', null, 40, 0, 0, 'PNG', '', 'T'); //top-right $pdf->Image('test-logo.png', null, null, 0, 0, 'PNG', '', 'M'); //middle-right $pdf->Image('test-logo.png', null, null, 0, 0, 'PNG', '', 'B'); //bottom-right $pdf->Image('test-logo.png', null, null, 0, 0, 'PNG', '', 'N'); //next line $pdf->Image('test-logo.png', null, null, 0, 0, 'PNG', '', 'N'); //next line // $palign : 画像を現在の行のどこに配置するか $pdf->SetXY(0, 80); $pdf->writeHTML('<h4>現在行の配置指定「$palign」</h4>', true, false, true, false, ''); $pdf->writeHTML('<h4>・幅[50mm]指定・左寄せ</h4>', true, false, true, false, ''); $pdf->Image('test-logo.png', null, null, 40, 0, 'PNG', '', 'N', false, 300, 'L'); $pdf->writeHTML('<h4>・幅[50mm]指定・中央揃え</h4>', true, false, true, false, ''); $pdf->Image('test-logo.png', null, null, 40, 0, 'PNG', '', 'N', false, 300, 'C'); $pdf->writeHTML('<h4>・幅[50mm]指定・右寄せ</h4>', true, false, true, false, ''); $pdf->Image('test-logo.png', null, null, 40, 0, 'PNG', '', 'N', false, 300, 'R'); // pdf表示設定 $pdf->Output('pdf-img-5-2.pdf', 'I'); ?> ?>
実行結果は以下の様な表示になります。
■幅・高さ($w, $h)指定領域に合わせて拡縮
幅・高さ($w, $h)指定領域に合わせて拡縮を行う引数である「$fitbox」についてテストを行います。
「$fitbox」は2文字で指定し、1文字目は水平方向の配置指定で、2文字目は垂直方向の配置指定となります。
「1文字目は水平方向」- 'L' 左寄せ
- 'C' 中央揃え
- 'R' 右寄せ
「2文字目は垂直方向」
- 'T' 上寄せ
- 'M' 中央揃え
- 'B' 下寄せ
3種類ずつなので9種類の組み合わせがります。 但し、画像のサイズと描画領域($w, $h)の値により表示がいろいろあります。<?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, ''); $pdf->Image('test-logo.png', null, null, 0, 0, 'PNG', '', 'N'); $unit = $pdf->pixelsToUnits(100);//px => mm $strOut = '画像の横幅(100px ==> mm 換算):'.$unit.'mm (pixelsToUnitsメソッド使用)'; $pdf->MultiCell( 0, 0, $strOut, 0, '', false, 1, 50, 18); $unit = $pdf->pixelsToUnits(30);//px => mm $strOut = '画像の高さ( 30px ==> mm 換算):'.$unit.'mm (pixelsToUnitsメソッド使用)'; $pdf->MultiCell( 0, 0, $strOut, 0, '', false, 1, 50, 23); // 引数「fitbox」用alignment $h_align = array('L', 'C', 'R'); $v_align = array('T', 'M', 'B'); $x = 15; $y = 32; $w = 30; $h = 7; // 横方向のアライメント for ($i = 0; $i < 3; ++$i) { $x = 15; for ($j = 0; $j < 3; ++$j) { $fitbox = $h_align[$i].$v_align[$j]; $pdf->Rect($x, $y, $w, $h, 'F', array(), array(128,255,128)); $pdf->Image('test-logo.png', $x, $y, $w, $h, 'PNG', '', '', false, 300, '', false, false, 0, $fitbox, false, false); $pdf->MultiCell( 0, 0, '$fitbox = '.$fitbox, 0, '', false, 1, $x, $y + $h); $x += 62; // カラムを右へ } $y += 14; // 次の行 } $x = 15; $y += 2; $w = 30; $h = 15; // 縦方向のアライメント for ($i = 0; $i < 3; ++$i) { $x = 15; for ($j = 0; $j < 3; ++$j) { $fitbox = $h_align[$i].$v_align[$j]; $pdf->Rect($x, $y, $w, $h, 'F', array(), array(255,128,128)); $pdf->Image('test-logo.png', $x, $y, $w, $h, 'PNG', '', '', false, 300, '', false, false, 0, $fitbox, false, false); $pdf->MultiCell( 0, 0, '$fitbox = '.$fitbox, 0, '', false, 1, $x, $y + $h); $x += 62; // カラムを右へ } $y += ($h + 6); // 次の行 } // pdf表示設定 $pdf->Output('pdf-img-5-3.pdf', 'I'); ?>
実行結果は以下の様な表示になります。
この表示領域の配置指定は、画像のサイズと描画領域($w, $h)の値により表示のされ方が独特です。
最初の9個のブロック(背景が黄緑色)は1文字目の指定の水平方向しか動作していない様に見えます。
また、その下の9個のブロック(背景が薄赤色)は2文字目の指定の垂直方向しか動作していない様に見えます。
最初のブロックの場合、「$w = 30」「$h = 7」(単位はmm)で指定しています。
画像の大きさは「100×30px」ですので横を基準とした場合の「縦」を計算します。
「縦」=「30($w)」×(「30px」/「100px」)=「9」mm
「縦=9mm」では指定の「$h = 7」を超えてしまうので、逆に「$h = 7」を基準にして「横」を計算します。
「横」=「7($h)」×(「100px」/「30px」)=「23.3…」mm
「横=23.3…mm」で指定の「$w = 30」におさまります。 よって、垂直方向は一杯になり水平方向しか配置が動作しない様に見えるわけです。
2番目のブロックの場合、「$w = 30」「$h = 15」(単位はmm)で指定しています。
画像の大きさは「100×30px」ですので横を基準とした場合の「縦」を計算します。
「縦」=「30($w)」×(「30px」/「100px」)=「9」mm
さらにに「$h = 15」を基準にして「横」を計算します。
「横」=「15($h)」×(「100px」/「30px」)=「50」mm
「横=50mm」のため「$w = 30」の指定を超えてしまいます。 よって、「縦=9mm」の画像として、水平方向は一杯になり垂直方向しか配置が動作しない様に見えるわけです。