忍者ブログ

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

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

PHP TCPDFの画像ファイルの出力について(imageメソッド)・その2

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座標」は次のページの先頭になる様です。 この点は注意が必要かと思います。

(この画像は1画面で2ページを表示しています)

■画像が回転して表示される場合の処理(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');
?>

実行結果は以下の様な表示になります。


回転処理は全てをテストしていませんので、悪しからずお願いします。












PR

コメント

コメントを書く