初回の 「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
コメント