サンプルプログラム

TCPDF – SetFont (ipag.ttf) で太字が使えない ~ 太字メソッドを追加して解決する

TCPDF - SetFont (ipag.ttf) で太字が使えない ~ クラス拡張で解決する

TCPDF – SetFont メソッドで “B”(太字)を指定しても太字にならない場合、独自にメソッドを追加することで解決できます。その方法をご紹介いたします。

※参考サイトは最下部に記載しております。

TCPDF ライブラリ

TCPDF ライブラリは PHP で PDF ファイルを簡単に作成するためのライブラリです。

SetFont メソッド

TCPDF ライブラリの SetFont() メソッドは、使用するフォントを変更するためのメソッドですが、この第2引数に “B”(ボールド)を指定すると太字になるのですが… “ipag.ttf” や “ipam.ttf” などの日本語フォントを使っている場合には、太字に対応していないため “B”(ボールド)を指定しても 太字になりません、、

TCPDF で使えるフォントの例.

TCPDF 用のフォントとして(実際に使用できるもの)は、以下のようなものがあります。

  • ipag.ttf … ゴシック体
  • ipam.ttf … 明朝体
  • aoyagi_reisho.ttf … 隷書フォント
  • rounded-mplus-2m-regular.ttf … 丸ゴシック体

拡張子 “ttf” とは?

拡張子 “ttf” は「True Type Font」の略です。True Type フォントは、Apple Computer が開発したデジタルフォントの規格で 2次ベジェ曲線を接続したもので曲線を表現しています(ビットマップを定義している訳ではないため、フォントサイズを拡大しても美しく表示することが可能です)。

太字メソッドを独自に追加する

例えば Write() メソッドを使う際に(少し手間ですが)X / Y 座標をぐるっと一周 上に少しずらして印字し、右に少しずらして印字し 下に少しずらして印字し 左に少しずらして印字する…と、太字で書いたように見せることができます。ただ、毎回それを書くとやっかいなので、クラスを拡張して新しいメソッドを作っておきます。

TCPDF ライブラリ は TCPDF クラス が定義されてますので、この TCPDF クラスを拡張することで オリジナルメソッドの作成が可能です!

サンプルプログラム

別記事「PHP4行で PDF作成できる ~ TCPDF サンプルプログラム」で紹介したように 最もシンプルな TCPDF サンプルプログラムは以下の通りです…

<?php
	//TCPDF ライブラリを読む込む
	require_once('lib/tcpdf/tcpdf.php');
	
	//TCPDF オブジェクト初期化
	$pdf = new TCPDF("L", "mm", "A4", true, "UTF-8");
	$pdf->setPrintHeader(FALSE);
	$pdf->setPrintFooter(FALSE);
	
	//フォント定義
	$GOTHIC = $pdf->addTTFfont('lib/tcpdf/fonts/ipag.ttf');
	$MARUGOTHIC = $pdf->addTTFfont('lib/tcpdf/fonts/rounded-mplus-2m-regular.ttf');
	$MINCHO = $pdf->addTTFfont('lib/tcpdf/fonts/ipam.ttf');
	
	//ページ追加
	$pdf->AddPage("P");//P:Portrait(縦長) L:Landscape(横長)
	
	//フォント設定
	$pdf->SetFont($GOTHIC, "", 9);
	
	//現在時刻の出力
	$pdf->Write(4, date("Y年n月j日 H:i"));
	
	//ブラウザ出力
	$pdf->Output("sample-tcpdf-3.pdf", "I");
?>

この22行目 Write() メソッドで現在時刻を出力する箇所を、新しく WriteBold() メソッドを作って 太字で書き出してみましょう!

TCPDF クラスを継承する

TCPDF クラスを継承して、新しいクラス “MyTCPDF” を作り WriteBold() メソッドを定義するには以下のようなコードを 上記の5行目「TCPDF クラス初期化」の前に書いてやります…

※WriteBold() メソッドには Write() メソッドと同じように「行の高さ」と「テキスト」の2つの引数を用意します。

class MyTCPDF extends TCPDF {
	
	public function WriteBold($sngLineHeight, $strText){
	}
}

WriteBold メソッドを追加する

WriteBold() メソッドの中には、以下の内容のコードを書き足します…

  1. 現在の X 座標、Y 座標を取得しておきます。
  2. 上に 0.01mm ずらした位置に印字出力します。
  3. 右に 0.01mm ずらした位置に印字出力します。
  4. 下に 0.01mm ずらした位置に印字出力します。
  5. 左に 0.01mm ずらした位置に印字出力します。
  6. 本来の位置に印字出力します。

これを PHP で書くと、こうなります…

※なぜ「0.01mmか?」というと、実際にやってみた感じ ちょうど良かったからです。

	class MyTCPDF extends TCPDF {
		
		public function WriteBold($sngLineHeight, $strText){
			
			//現在の座標を取得しておきます
			$sngCurrentX = $this->GetX();
			$sngCurrentY = $this->GetY();
			
			//上に 0.01mm ずらした位置に印字出力します
			$this->SetXY($sngCurrentX, $sngCurrentY - 0.01);
			$this->Write($sngLineHeight, $strText);
			//右に 0.01mm ずらした位置に印字出力します
			$this->SetXY($sngCurrentX + 0.01, $sngCurrentY);
			$this->Write($sngLineHeight, $strText);
			//下に 0.01mm ずらした位置に印字出力します
			$this->SetXY($sngCurrentX, $sngCurrentY + 0.01);
			$this->Write($sngLineHeight, $strText);
			//左に 0.01mm ずらした位置に印字出力します
			$this->SetXY($sngCurrentX - 0.01, $sngCurrentY);
			$this->Write($sngLineHeight, $strText);
			
			//本来の位置に印字出力します
			$this->SetXY($sngCurrentX, $sngCurrentY);
			$this->Write($sngLineHeight, $strText);
		}
	}

完成

上記のサンプルの6行目 new TCPDF を new MyTCPDF に、22行目 Write() メソッドを WriteBold() メソッドに置き換えると完成です…

<?php
	//TCPDF ライブラリを読む込む
	require_once('lib/tcpdf/tcpdf.php');
	
	class MyTCPDF extends TCPDF {
		
		public function WriteBold($sngLineHeight, $strText){
			
			//現在の座標を取得しておきます
			$sngCurrentX = $this->GetX();
			$sngCurrentY = $this->GetY();
			
			//上に 0.01mm ずらした位置に印字出力します
			$this->SetXY($sngCurrentX, $sngCurrentY - 0.01);
			$this->Write($sngLineHeight, $strText);
			//右に 0.01mm ずらした位置に印字出力します
			$this->SetXY($sngCurrentX + 0.01, $sngCurrentY);
			$this->Write($sngLineHeight, $strText);
			//下に 0.01mm ずらした位置に印字出力します
			$this->SetXY($sngCurrentX, $sngCurrentY + 0.01);
			$this->Write($sngLineHeight, $strText);
			//左に 0.01mm ずらした位置に印字出力します
			$this->SetXY($sngCurrentX - 0.01, $sngCurrentY);
			$this->Write($sngLineHeight, $strText);
			
			//本来の位置に印字出力します
			$this->SetXY($sngCurrentX, $sngCurrentY);
			$this->Write($sngLineHeight, $strText);
		}
	}
	
	//TCPDF オブジェクト初期化
	$pdf = new MyTCPDF("L", "mm", "A4", true, "UTF-8");
	$pdf->setPrintHeader(FALSE);
	$pdf->setPrintFooter(FALSE);
	
	//フォント定義
	$GOTHIC = $pdf->addTTFfont('lib/tcpdf/fonts/ipag.ttf');
	$MARUGOTHIC = $pdf->addTTFfont('lib/tcpdf/fonts/rounded-mplus-2m-regular.ttf');
	$MINCHO = $pdf->addTTFfont('lib/tcpdf/fonts/ipam.ttf');
	
	//ページ追加
	$pdf->AddPage("P");//P:Portrait(縦長) L:Landscape(横長)
	
	//フォント設定
	$pdf->SetFont($GOTHIC, "", 9);
	
	//現在時刻の出力
	$pdf->WriteBold(4, date("Y年n月j日 H:i"));
	
	//ブラウザ出力
	$pdf->Output("sample.pdf", "I");
?>

動作確認

実際に表示させてみると こんな 感じになります!

参考サイト

別記事「PHP4行で PDF作成できる ~ TCPDF サンプルプログラム」
https://blog.soln-sns.net/4-lines-php-sample-how-to-generate-pdf-using-tcpdf/
Write : TCPDFマニュアル(勝手訳)
http://tcpdf.penlabo.net/method/w/Write.html