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
| Format | Ekstensi | Catatan |
|---|---|---|
| TrueType | .ttf | Dukungan glyph outline penuh, format paling umum |
| OpenType | .otf | Varian CFF dan TrueType outline keduanya didukung |
| Type1 | .pfb + .afm | Font 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.
| Family | Style |
|---|---|
| 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 — 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.
$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.
$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.
// 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 kecilMengapa 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:
$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.
$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.
$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 + RTLReordering 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.
$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
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');