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