忍者ブログ

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

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

PHP PDF出力の方法について・マージンとヘッダ/フッタ(TCPDF)

初回の 「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











PR

コメント

コメントを書く