Skip to content

Font

TCPDF-Next mendukung font TrueType, OpenType, dan Type1 dengan subsetting otomatis, rendering CJK, dan teks bidirectional. Font dimuat melalui method addFont() pada Document atau dikelola langsung melalui FontManager.

Tipe Font yang Didukung

FormatEkstensiCatatan
TrueType.ttfDukungan glyph outline penuh, format paling umum
OpenType.otfVarian CFF dan TrueType outline keduanya didukung
Type1.pfb + .afmFont PostScript legacy, file metrik diperlukan

Font Inti

Spesifikasi PDF mendefinisikan 14 font standar ("Base 14") yang harus didukung oleh setiap viewer yang sesuai. Font ini tidak memerlukan embedding, yang menjaga ukuran file tetap minimal.

FamilyStyle
HelveticaRegular, Bold, Italic, Bold Italic
TimesRegular, Bold, Italic, Bold Italic
CourierRegular, Bold, Italic, Bold Italic
SymbolRegular
ZapfDingbatsRegular
php
use Yeeefang\TcpdfNext\Core\Document;

$pdf = Document::create()
    ->addPage()
    ->setFont('Helvetica', '', 12)
    ->cell(0, 10, 'Helvetica — font andalan PDF', newLine: true)
    ->setFont('Times', 'I', 12)
    ->cell(0, 10, 'Times Italic — serif klasik', newLine: true)
    ->setFont('Courier', 'B', 12)
    ->cell(0, 10, 'Courier Bold — monospaced', newLine: true);

Loading Font Kustom

addFont()

Daftarkan file font TrueType atau OpenType dan langsung gunakan.

php
$pdf = Document::create()
    ->addFont('NotoSansTC', '', '/path/to/NotoSansTC-Regular.ttf')
    ->addPage()
    ->setFont('NotoSansTC', '', 12)
    ->cell(0, 10, '繁體中文文字', newLine: true);

Font Family dengan Beberapa Style

Daftarkan setiap varian style dengan nama family yang sama. TCPDF-Next memilih file yang benar saat Anda memanggil setFont() dengan string style.

php
$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, 'Berat regular', newLine: true)
    ->setFont('Roboto', 'B', 11)
    ->cell(0, 10, 'Berat bold', newLine: true)
    ->setFont('Roboto', 'I', 11)
    ->cell(0, 10, 'Style italic', newLine: true)
    ->setFont('Roboto', 'BI', 11)
    ->cell(0, 10, 'Bold Italic', newLine: true);

Font Subsetting

Secara default, TCPDF-Next hanya menyematkan glyph yang muncul dalam dokumen. FontSubsetter menangani ini secara otomatis selama serialisasi PDF.

php
// Font subsetting otomatis — hanya glyph yang digunakan yang di-embed
$pdf = Document::create()
    ->addPage()
    ->setFont('DejaVuSans', '', 12)
    ->cell(0, 10, 'Hanya glyph ini yang di-embed');
// Hasil: ukuran file PDF lebih kecil

Mengapa Subsetting Penting

Font CJK penuh bisa melebihi 15 MB. Jika dokumen Anda hanya menggunakan beberapa karakter, subsetting mengurangi data font yang di-embed menjadi beberapa kilobyte. Ini penting untuk pengiriman web dan lampiran email.

Menonaktifkan Subsetting

Dalam kasus jarang (misalnya field formulir yang bisa diedit di mana pengguna mungkin mengetik karakter apapun), Anda mungkin memerlukan font penuh. Berikan false ke parameter subsetting saat mendaftarkan:

php
$pdf->addFont('NotoSans', '', '/fonts/NotoSans-Regular.ttf', subset: false);

Dukungan CJK

Teks China, Jepang, dan Korea memerlukan font dengan set glyph besar. TCPDF-Next memvalidasi konten CJK melalui CjkValidator dan memastikan encoding yang benar dalam output PDF.

php
$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);

Font CJK selalu di-subset kecuali dinonaktifkan secara eksplisit — penghematan ukuran sangat substansial.

Teks Bidirectional (BiDi)

BiDiResolver mengimplementasikan Unicode Bidirectional Algorithm untuk rendering yang benar dari script right-to-left seperti Arab dan Ibrani, termasuk konten LTR/RTL campuran.

php
$pdf = Document::create()
    ->addFont('NotoSansArabic', '', '/fonts/NotoSansArabic-Regular.ttf')
    ->addPage()
    ->setFont('NotoSansArabic', '', 14)
    ->cell(0, 10, 'مرحبا بالعالم', newLine: true)   // Arab
    ->write(10, 'Campuran: Hello مرحبا World');       // LTR + RTL

Reordering BiDi diterapkan secara otomatis saat teks mengandung karakter RTL. Tidak diperlukan konfigurasi manual.

ToUnicode CMap

TCPDF-Next menghasilkan ToUnicode CMap untuk setiap font yang di-embed. Pemetaan ini memungkinkan viewer PDF mengekstrak teks Unicode yang benar saat pengguna copy/paste atau saat mesin pencari mengindeks dokumen. CMap dihasilkan secara otomatis selama serialisasi.

Metrik Font

Class FontInfo dan FontMetrics menyediakan pengukuran tipografi detail.

php
$pdf->setFont('Helvetica', '', 12);

// Ukur string tertentu dengan font saat ini
$width = $pdf->getStringWidth('Hello, World!');

// Gunakan metrik untuk layout presisi
$cellWidth = $pdf->getStringWidth('Total:') + 4; // tambah padding 4mm
$pdf->cell($cellWidth, 8, 'Total:');

Metrik mencakup ascender, descender, line gap, cap height, x-height, dan lebar advance per-glyph — semua berasal dari tabel internal font.

Contoh Lengkap

php
use Yeeefang\TcpdfNext\Core\Document;

$pdf = Document::create()
    // Daftarkan font
    ->addFont('Roboto', '', '/fonts/Roboto-Regular.ttf')
    ->addFont('Roboto', 'B', '/fonts/Roboto-Bold.ttf')
    ->addFont('NotoSansTC', '', '/fonts/NotoSansTC-Regular.ttf')

    ->addPage()

    // Heading bahasa Inggris
    ->setFont('Roboto', 'B', 18)
    ->cell(0, 12, 'Multilingual Invoice', newLine: true)
    ->ln(3)

    // Body bahasa Inggris
    ->setFont('Roboto', '', 11)
    ->cell(0, 8, 'Customer: Acme Corporation', newLine: true)
    ->cell(0, 8, 'Date: 2026-02-16', newLine: true)
    ->ln(5)

    // Bagian bahasa China
    ->setFont('NotoSansTC', '', 11)
    ->cell(0, 8, '客戶名稱:台灣科技有限公司', newLine: true)
    ->cell(0, 8, '發票日期:2026年2月16日', newLine: true)

    ->save('multilingual-invoice.pdf');

Didistribusikan di bawah lisensi LGPL-3.0-or-later.