フォント
TCPDF-Nextは、自動サブセット化、CJKレンダリング、双方向テキストをサポートするTrueType、OpenType、Type1フォントに対応しています。フォントは Document の addFont() メソッドを通じて読み込むか、FontManager を通じて直接管理します。
サポートされるフォント形式
| 形式 | 拡張子 | 備考 |
|---|---|---|
| TrueType | .ttf | 完全なグリフアウトラインサポート、最も一般的な形式 |
| OpenType | .otf | CFFおよびTrueTypeアウトラインの両方に対応 |
| Type1 | .pfb + .afm | レガシーPostScriptフォント、メトリクスファイルが必要 |
コアフォント
PDF仕様では、準拠するすべてのビューアがサポートしなければならない14の標準フォント(「Base 14」)が定義されています。これらは埋め込みが不要なため、ファイルサイズを最小限に抑えることができます。
| ファミリー | スタイル |
|---|---|
| Helvetica | Regular、Bold、Italic、Bold Italic |
| Times | Regular、Bold、Italic、Bold Italic |
| Courier | Regular、Bold、Italic、Bold Italic |
| Symbol | Regular |
| ZapfDingbats | Regular |
use Yeeefang\TcpdfNext\Core\Document;
$pdf = Document::create()
->addPage()
->setFont('Helvetica', '', 12)
->cell(0, 10, 'Helvetica — the PDF workhorse', newLine: true)
->setFont('Times', 'I', 12)
->cell(0, 10, 'Times Italic — classic serif', newLine: true)
->setFont('Courier', 'B', 12)
->cell(0, 10, 'Courier Bold — monospaced', newLine: true);カスタムフォントの読み込み
addFont()
TrueTypeまたはOpenTypeフォントファイルを登録してすぐに使用します。
$pdf = Document::create()
->addFont('NotoSansTC', '', '/path/to/NotoSansTC-Regular.ttf')
->addPage()
->setFont('NotoSansTC', '', 12)
->cell(0, 10, '繁體中文文字', newLine: true);複数スタイルのフォントファミリー
同じファミリー名で各スタイルバリアントを登録します。TCPDF-Nextは setFont() をスタイル文字列付きで呼び出した際に、正しいファイルを選択します。
$pdf = Document::create()
->addFont('Roboto', '', '/fonts/Roboto-Regular.ttf')
->addFont('Roboto', 'B', '/fonts/Roboto-Bold.ttf')
->addFont('Roboto', 'I', '/fonts/Roboto-Italic.ttf')
->addFont('Roboto', 'BI', '/fonts/Roboto-BoldItalic.ttf')
->addPage()
->setFont('Roboto', '', 11)
->cell(0, 10, 'Regular weight', newLine: true)
->setFont('Roboto', 'B', 11)
->cell(0, 10, 'Bold weight', newLine: true)
->setFont('Roboto', 'I', 11)
->cell(0, 10, 'Italic style', newLine: true)
->setFont('Roboto', 'BI', 11)
->cell(0, 10, 'Bold Italic', newLine: true);フォントサブセット化
デフォルトでは、TCPDF-Nextはドキュメントに表示されるグリフのみを埋め込みます。FontSubsetter がPDFシリアライゼーション中にこれを自動的に処理します。
// フォントサブセット化は自動 — 使用されたグリフのみが埋め込まれます
$pdf = Document::create()
->addPage()
->setFont('DejaVuSans', '', 12)
->cell(0, 10, 'Only these glyphs are embedded');
// 結果:より小さいPDFファイルサイズサブセット化が重要な理由
完全なCJKフォントは15MBを超えることがあります。ドキュメントで使用する文字が少数であれば、サブセット化により埋め込みフォントデータを数キロバイトに削減できます。これはWeb配信やメール添付にとって非常に重要です。
サブセット化の無効化
まれなケース(例:ユーザーが任意の文字を入力する可能性がある編集可能なフォームフィールド)では、完全なフォントが必要になることがあります。登録時にsubsetパラメータに false を渡します:
$pdf->addFont('NotoSans', '', '/fonts/NotoSans-Regular.ttf', subset: false);CJKサポート
中国語、日本語、韓国語のテキストには、大きなグリフセットを持つフォントが必要です。TCPDF-Nextは CjkValidator を通じてCJKコンテンツを検証し、PDF出力で正しいエンコーディングを保証します。
$pdf = Document::create()
->addFont('NotoSansCJK', '', '/fonts/NotoSansCJKtc-Regular.otf')
->addPage()
->setFont('NotoSansCJK', '', 12)
->cell(0, 10, '中文:你好世界', newLine: true)
->cell(0, 10, '日本語:こんにちは世界', newLine: true)
->cell(0, 10, '한국어:안녕하세요 세계', newLine: true);CJKフォントは、明示的に無効化しない限り常にサブセット化されます — サイズの節約は大きなものです。
双方向テキスト(BiDi)
BiDiResolver は、アラビア語やヘブライ語などの右から左に書く言語を正しくレンダリングするためのUnicode双方向アルゴリズムを実装しています。LTR/RTL混合コンテンツにも対応しています。
$pdf = Document::create()
->addFont('NotoSansArabic', '', '/fonts/NotoSansArabic-Regular.ttf')
->addPage()
->setFont('NotoSansArabic', '', 14)
->cell(0, 10, 'مرحبا بالعالم', newLine: true) // アラビア語
->write(10, 'Mixed: Hello مرحبا World'); // LTR + RTLBiDiの並び替えは、テキストにRTL文字が含まれている場合に自動的に適用されます。手動での設定は不要です。
ToUnicode CMap
TCPDF-Nextは、埋め込みフォントごとに ToUnicode CMapを生成します。このマッピングにより、ユーザーがコピー&ペーストする際や検索エンジンがドキュメントをインデックスする際に、PDFビューアが正しいUnicodeテキストを抽出できます。これはシリアライゼーション中に自動的に生成されます。
フォントメトリクス
FontInfo と FontMetrics クラスは、詳細なタイポグラフィ測定値を公開しています。
$pdf->setFont('Helvetica', '', 12);
// 現在のフォントで特定の文字列を測定
$width = $pdf->getStringWidth('Hello, World!');
// メトリクスを使用して正確なレイアウトを計算
$cellWidth = $pdf->getStringWidth('Total:') + 4; // 4mmのパディングを追加
$pdf->cell($cellWidth, 8, 'Total:');メトリクスには、アセンダー、ディセンダー、行間、キャップハイト、エックスハイト、およびグリフごとのアドバンス幅が含まれます — すべてフォントの内部テーブルから取得されます。
完全な例
use Yeeefang\TcpdfNext\Core\Document;
$pdf = Document::create()
// フォントの登録
->addFont('Roboto', '', '/fonts/Roboto-Regular.ttf')
->addFont('Roboto', 'B', '/fonts/Roboto-Bold.ttf')
->addFont('NotoSansTC', '', '/fonts/NotoSansTC-Regular.ttf')
->addPage()
// 英語の見出し
->setFont('Roboto', 'B', 18)
->cell(0, 12, 'Multilingual Invoice', newLine: true)
->ln(3)
// 英語の本文
->setFont('Roboto', '', 11)
->cell(0, 8, 'Customer: Acme Corporation', newLine: true)
->cell(0, 8, 'Date: 2026-02-16', newLine: true)
->ln(5)
// 中国語セクション
->setFont('NotoSansTC', '', 11)
->cell(0, 8, '客戶名稱:台灣科技有限公司', newLine: true)
->cell(0, 8, '發票日期:2026年2月16日', newLine: true)
->save('multilingual-invoice.pdf');