ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

PHP:TCPDFを使ってHTML形式で出力すると文字がはみ出る現象への対処

先日、TCPDFでHTML形式のデータを指定してPDF出力すると「-」で折り返してしまったので対処をしたことを書きました。
ajya.hatenablog.jp

このとき、別の現象にも気がついていました。
別の現象は、文字列をtableタグのtdタグで囲んで出力すると自動で折り返しますが、文字列の行の中に「±」が存在すると、文字がtdタグが出力する線をはみ出て出力されてしまっていました。

文字実体参照でも効果なし

「-」で折り返してしまった現象への対処と同じように、

  • TCPDFのバージョンを更新する。
  • 文字実体参照に置き換えてみる。

を試してみましたが、現象は変わりませんでした。

フォントを変更できないか?

もしかしたら、「±」のフォントの幅が正しく認識されていないのか、「±」のフォントの幅情報がも正しくないのかもしれないと予想をしました。
使用しているフォントは、TCPDF標準で利用できる小塚ゴシックPro Mです。

TCPDF標準以外のフォントを利用する方法がないかと検索したら、以下のページを見つけました。
PHPから日本語フォントを使ってPDFを生成、出力する【TCPDF】|プログラムメモ

IPAゴシックを使えるとあるので試してみると、PDFファイル出力時にエラーがでました。

IPAゴシックを使う方法

エラーの内容がパーミッションが不足しているという内容なので、その対処をしました。
また、何が行われているのか状況を確認した結果、以下の手順で動作するようになりました。

  1. 「tcpdf/fonts」ディレクトリ内に「ttf」ディレクトリを作成する。
  2. http://ipafont.ipa.go.jp/old/ipafont/download.htmlからipag00303.zipをダウンロードする。
  3. ダウンロードしたipag00303.zipを展開して、作成されたディレクトリ内のipag.ttfを「tcpdf/fonts/ttf」ディレクトリにアップロードする。
  4. 「tcpdf/fonts/」ディレクトリ以下のパーミッションを777に変更する。
  5. PDFファイルを作成する処理実行すると、「tcpdf/fonts」ディレクトリにipag.z、ipag.ctg.z、ipag.phpが作成される。
  6. 「tcpdf/fonts/」ディレクトリ以下のパーミッションを元に戻す。

「tcpdf/fonts/」ディレクトリにファイルを作成するためのパーミッションが不足していてエラーになっていました。
対処として、一時的にパーミッションを変更しています。

PHPのコードは以下のようになります。

require_once("tcpdf/tcpdf.php");
$pdf = new TCPDF("P", "mm", "A4", true, "UTF-8" );

$font = new TCPDF_FONTS();
$ipafont = $font->addTTFfont('tcpdf/fonts/ttf/ipag.ttf');
$pdf->SetFont(ipafont, '', 32,'',true);

「tcpdf/fonts」ディレクトリにIPAゴシックのファイルがない状態では上記のようにする必要があります。
実行するとIPAゴシックのファイルipag.z、ipag.ctg.z、ipag.phpが作成されますが、2回目からは作成されません。

2回目以降は以下のコードでも動作します。

require_once("tcpdf/tcpdf.php");
$pdf = new TCPDF("P", "mm", "A4", true, "UTF-8" );

$pdf->setFont('ipag', '', 12);

IPAゴシックを使った結果

文字列の行の中に「±」が存在すると、文字がtdタグが出力する線をはみ出て出力されてしまう現象は、発生しなくなりました。

まとめ

フォントを変更したので、同じ文字でもゼロの中に斜線が入ったりして見た目が変わります。
はみ出る現象を発生させないという目的は達成できました。