TCPDF+FPDIで標準及び太字フォントの追加

TCPDF+FPDIは、LaravelでPDFを取り扱う際に使用されるライブラリです。
TCPDFでは、HTMLによる描画が可能となっていますが、この時に、レギュラー(標準)フォントとボールド(太字)フォントを同居させる際に非常に苦労しましたので、その設定方法について解説したいと思います。
TCPDFとFPDIとは?
FPDIとは、既存のPDFファイルを読み込んで加工したり、再出力するための拡張ライブラリで、下記のようなことができます。
- 既存のPDFをテンプレートとして読み込む
- テンプレートに透かしやスタンプなど文字や画像を重ねられる
- 複数のPDFを統合できる
- 特定のページだけを抜き出すことができる
また、TCPDFでは、FPDI単体でもある程度の書き込みはできますが、HTMLやCSSを利用することができたり、図形の描画や枠線、塗りなどより細かな描写が可能となります。TCPDFはFPDIと完全互換なため、この組み合わせはPDFを取り扱う上では、非常に便利なライブラリです。
一つ注意しなければならないのは、FPDIで取り込まれるPDFは、見た目をそのまま複製して取り込むため、PDFにフォーム(Acro Form)を実装している場合には、それらは複製されませんので、フォーム機能などを取り込みたい場合には、このライブラリはそもそも選択肢から外した方がよさそうです。
また、PDFの複製や印刷などを制限するためには、有料のライブラリが必要となります。
前提
環境は下記になっています。既にライブラリはインストール済みです。
- Laravel11
- setasign/fpdi 2.6
- tecnickcom/tcpdf 6.10
TCPDFの日本語フォントは使いづらかった。。。
TCPDFは、日本語のフォント「cid0jp」を実装しており、そのままでも日本語表示ができるのですが、二つの点で別フォントを実装する必要がありました。

上記は、英文字の大文字と小文字を出力した例です。
一つ目として、半角英語のカーニングがむちゃくちゃで、「J」や「l」などの小文字は、隣にくっついてしまって可読性が非常に悪いという点です。
二つ目に、太字フォントが無いということです。もちろん、斜体もなく、1種類です。そうなると、HTMLが使えたとしても文中で、<b>タグを使っても太字になりません。
そこで、別のフォントをインストールして使用する必要がありました。
TCPDFのフォント設定の変更
まずは、別フォントをインストールするための準備としてTCPDFの設定を変更します。
fontsフォルダの作成
Laravel内にフォントを保存するフォルダを作成します。今回は、下記にフォルダを作成しました。
storage/fonts
TCPDFのデフォルトのフォントディレクトリを変更する
この段階では、「vendor/tecnickcom/tcpdf/fonts」ディレクトリがデフォルトのフォントディレクトリになっているので、これを「storage/fonts」ディレクトリに変更します。
<?php
namespace App\Providers;
class AppServiceProvider extends ServiceProvider
{
public function register(): void
{
・・・
// TCPDF + FPDIでフォント設定用
if (!defined('K_PATH_FONTS')) {
define('K_PATH_FONTS', storage_path('fonts') . '/');
}
・・・
}
・・・
}
上のように「app/Providers/AppServiceProvider.php」に設定を追記します。
TCPDFのフォントをコピー
プロジェクトディレクトリ内で下記コマンドを実行します。
cp vendor/tecnickcom/tcpdf/fonts/* storage/fonts/
これで大量のデフォルトフォントが、storage/fontsディレクトリに複製されます。
フォントの複製を行わないと新しいフォントを追加したとしても、「TCPDF ERROR:Could not include font definition file: helvetica」などのようにエラーが表示されてしまいます。
これでTCPDFの基本的な設定は完了しました。
Google FontのNoto Sansを設定してみる
Fontのダウンロード
Google FontでNoto Sansを検索します。
https://fonts.google.com/?query=Noto+Sans

上記は、Laanguageを「Japanese」に絞った場合です。
「人類社会の~」の部分をクリックします。

右上の「GET」ボタンをクリックします。

「Download all(1)」ボタンをクリックすると、圧縮ファイル「Noto_Sans_JP.zip」がダウンロードされますので、解凍します。

staticフォルダ内は下記の通り、各太さのフォントが入っています。

今回は、通常フォントとして「NotoSansJP-Regular.ttf」、太字フォントとして「NotoSansJP-Bold.ttf」を使用します。
フォントの移動
上記二つのフォント「NotoSansJP-Regular.ttf」と「NotoSansJP-Bold.ttf」をLaravel内の「storage/fonts」に複製又は移動します。
TCPDFにフォントを登録する
基本的コマンド
まずは、この後、実行するコマンドについて解説します。
php vendor/tecnickcom/tcpdf/tools/tcpdf_addfont.php \
-i storage/fonts/NotoSansJP-Regular.ttf \
-o storage/fonts \
-t TrueTypeUnicode \
-s B
先頭の「php」は、phpで「tcpdf_addfont.php」を実行するという意味です。
「tcpdf_addfont.php」は、TCPDFのフォントを登録するための付属ツールです。このツールにより、TTFやOTFなどのフォントファイルをTCPDFが使える形式に変換します。
「-i」オプションは、input、つまり、変換するファイルの指定です。
「-o」オプションは、output、変換後に作成されるファイルを吐き出すフォルダです。
「-t」オプションは、フォントの種類を指定します。「TrueTypeUnicode」は、Unicode 文字を扱えるTrueTypeフォントのことを意味すます。
「-s」オプションは、フォントのスタイルを指定します。これにより、ファイル名の最後に「b」が追加されます。
ただし、フォント名にBoldやItalicが入っていると自動的に「b」や「i」が入るようなので、意味が無いように見える場合もあります。
- R – Regular(標準:省略可)
- B – Bold(太字)
- I – Italic(斜体)
- BI – Bold Italic(太字+斜体)
「-n」オプションに注意
「-n」オプションは、上記には入っていませんが、nameオプションで、吐き出すファイルのファイル名(フォントファミリー名)を指定することができます。
しかし、このオプションを設定すると、フォントファイルが大きい場合などに、吐き出されるphpファイルが0KBとなってしまうという不具合があるようです。
そうなると正常にフォントとして利用することができなくなるため注意が必要です。
コマンドの実行
下記コマンドを実行します。
php vendor/tecnickcom/tcpdf/tools/tcpdf_addfont.php -i storage/fonts/NotoSansJP-Regular.ttf -o storage/fonts -t TrueTypeUnicode
まずは、Regularフォントの変換です。「-s」オプションはつけていません。これにより下記3つのファイルが作成されます。
- notosansjp.php
- notosansjp.z
- notosansjp.ctg.z
php vendor/tecnickcom/tcpdf/tools/tcpdf_addfont.php -i storage/fonts/NotoSansJP-Bold.ttf -o storage/fonts -t TrueTypeUnicode -s B
Boldフォントの変換です。上述通り、今回は関係ありませんが、一応「-s B」を指定しています。そして、下記3つのファイルが作成されます。
- notosansjpb.php
- notosansjpb.z
- notosansjpb.ctg.z
ファイルのアップロード
上記で作成された6つのファイルをアップロードします。
フォントファミリーとして認識させるには?
上記の二つのファイルは、「notosansjp.php」と「notosansjpb.php」という最後に「b」が付いているかいないかの違いでしたので問題はありません。
これが例えば「NotoSansJP-SemiBold.ttf」をBoldフォントとして認識させるには注意が必要です。
php vendor/tecnickcom/tcpdf/tools/tcpdf_addfont.php -i storage/fonts/NotoSansJP-SemiBold.ttf -o storage/fonts -t TrueTypeUnicode -s B
上記を実行すると「notosansjpsemib.php」などの3つのファイルが作成されますが、これだと「notosansjp.php」とファミリーであると認識されません。
TCPDFのフォントスタイルの設定では、下記のルールでファイルをファミリーとして認識します。
fonts/{$family}.php
fonts/{$family}b.php
(Bold)fonts/{$family}i.php
(Italic)fonts/{$family}bi.php
(Bold Italic)
従って、「NotoSansJP-SemiBold.ttf」をBoldフォントとして利用するためには、ファイル名及びファイルの内容を書き換える必要があります。
ファイル名の変更
- notosansjpsemib.php → notosansjpb.php
- notosansjpsemib.z → notosansjpb.z
- notosansjpsemib.ctg.z → notosansjpb.ctg.z
※「notosansjpsemib.z」及び「notosansjpsemib.ctg.z」の書き換えが必要かどうかは未検証です。
リネームしたnotosansjpb.phpファイルの書き換え
<?php
// TCPDF FONT FILE DESCRIPTION
$type='TrueTypeUnicode';
$name='NotoSansJP-SemiBold';
$up=-125;
$ut=50;
$dw=1000;
$diff='';
$originalsize=5444352;
$enc='';
$file='notosansjpsemib.z';
$ctg='notosansjpsemib.ctg.z';
・・・
上記の$file及び$ctgの内容をそれぞれ「notosansjpb.z」と「notosansjpb.ctg.z」に書き換えます。
以上で、フォントの設定は完了です。
使用法
上記ファイルのアップロードが完了すると、下記のように設定するとBoldフォントが使用できるようになります。
$pdf = new Fpdi();
$pdf->setFont('notosansjp', '', 12);
$pdf->setFont('notosansjp', 'B', 12);
まとめ
フライング・ハイ・ワークスでは、システム上でPDFを取り扱う機会がたびたびあります。
- 画像やテキストを埋め込んだPDFの制作
- 制作したPDFやアップロードしたPDFをマージしたPDFファイルの制作
- フォーム埋め込み(Acro Form)ファイルをマージしたPDFファイルの制作 など
上記のアップロードやダウンロード、表示など様々な経験がありますので、PDF関連のWebシステムをご検討されている場合に、ぜひお声がけください。
こんなお困りごとは
ございませんか?
-
ホームページで
何をゴールにすればよいかが
わからないホームページで
達成したい成果をまず設定MORE
-
ホームページをリニューアルしたいけど
どこから手を付ければいいか
わからない今のサイトをよりよくするため
情報整理から始めましょう!MORE
-
デザインだけではなく
Webシステム制作も一緒にやってほしいホームページにおける
Webシステム制作の実績は豊富ですMORE
-
コンバージョンにつながる
ツールはないだろうか?Webチャットツール - Fチャットで
お客様をサポートMORE
-
どれくらいの費用がかかるか
ざっくりでいいから知りたい3つの規模感で
ざっくりこんな感じですMORE
-
ホームページ制作の
進め方のイメージが湧かないホームページ制作
の流れを紹介MORE
-
公開後も継続的に
メンテナンスや保守をしてほしい更新毎のお見積りや
月額制の更新などもご用意MORE
-
SEO対策は何から
始めればよいの?基礎的なSEOは
おまかせくださいMORE