Polices
TCPDF-Next supporte les polices TrueType, OpenType et Type1 avec subsetting automatique, rendu CJK et texte bidirectionnel. Les polices sont chargées via la méthode addFont() sur Document ou gérées directement via le FontManager.
Types de polices supportés
| Format | Extensions | Notes |
|---|---|---|
| TrueType | .ttf | Support complet outline de glyphes, format le plus courant |
| OpenType | .otf | Variantes outline CFF et TrueType toutes deux supportées |
| Type1 | .pfb + .afm | Polices PostScript legacy, fichier de métriques requis |
Polices de base
La spécification PDF définit 14 polices standard (les "Base 14") que chaque visionneuse conforme doit supporter. Elles ne nécessitent pas d'intégration, ce qui maintient la taille de fichier minimale.
| Famille | Styles |
|---|---|
| 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);Chargement de polices personnalisées
addFont()
Enregistrez un fichier de police TrueType ou OpenType et utilisez-le immédiatement.
$pdf = Document::create()
->addFont('NotoSansTC', '', '/path/to/NotoSansTC-Regular.ttf')
->addPage()
->setFont('NotoSansTC', '', 12)
->cell(0, 10, '繁體中文文字', newLine: true);Familles de polices avec styles multiples
Enregistrez chaque variante de style sous le même nom de famille. TCPDF-Next sélectionne le fichier correct quand vous appelez setFont() avec une chaîne de 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, '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);Subsetting de polices
Par défaut, TCPDF-Next intègre uniquement les glyphes qui apparaissent dans le document. Le FontSubsetter gère cela automatiquement durant la sérialisation PDF.
// Le subsetting de polices est automatique — seuls les glyphes utilisés sont intégrés
$pdf = Document::create()
->addPage()
->setFont('DejaVuSans', '', 12)
->cell(0, 10, 'Only these glyphs are embedded');
// Résultat : taille de fichier PDF plus petitePourquoi le subsetting est important
Une police CJK complète peut dépasser 15 MB. Si votre document utilise seulement une poignée de caractères, le subsetting réduit les données de police intégrées à quelques kilooctets. C'est critique pour la livraison web et les pièces jointes email.
Désactiver le subsetting
Dans de rares cas (par ex., champs de formulaire éditables où l'utilisateur peut taper n'importe quel caractère), vous pourriez avoir besoin de la police complète. Passez false au paramètre subsetting lors de l'enregistrement :
$pdf->addFont('NotoSans', '', '/fonts/NotoSans-Regular.ttf', subset: false);Support CJK
Le texte chinois, japonais et coréen nécessite des polices avec de grands ensembles de glyphes. TCPDF-Next valide le contenu CJK via le CjkValidator et assure un encodage correct dans la sortie 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);Les polices CJK sont toujours sous-ensembles sauf désactivation explicite — les économies de taille sont substantielles.
Texte bidirectionnel (BiDi)
Le BiDiResolver implémente l'algorithme bidirectionnel Unicode pour le rendu correct des écritures de droite à gauche comme l'arabe et l'hébreu, incluant le contenu mixte LTR/RTL.
$pdf = Document::create()
->addFont('NotoSansArabic', '', '/fonts/NotoSansArabic-Regular.ttf')
->addPage()
->setFont('NotoSansArabic', '', 14)
->cell(0, 10, 'مرحبا بالعالم', newLine: true) // Arabe
->write(10, 'Mixed: Hello مرحبا World'); // LTR + RTLLe réordonnancement BiDi est appliqué automatiquement quand le texte contient des caractères RTL. Aucune configuration manuelle n'est requise.
ToUnicode CMap
TCPDF-Next génère une CMap ToUnicode pour chaque police intégrée. Ce mapping permet aux visionneuses PDF d'extraire le texte Unicode correct quand les utilisateurs copient/collent ou quand les moteurs de recherche indexent le document. Elle est générée automatiquement durant la sérialisation.
Métriques de polices
Les classes FontInfo et FontMetrics exposent des mesures typographiques détaillées.
$pdf->setFont('Helvetica', '', 12);
// Mesurer une chaîne spécifique dans la police actuelle
$width = $pdf->getStringWidth('Hello, World!');
// Utiliser les métriques pour mise en page précise
$cellWidth = $pdf->getStringWidth('Total:') + 4; // ajouter 4mm padding
$pdf->cell($cellWidth, 8, 'Total:');Les métriques incluent ascender, descender, line gap, cap height, x-height et largeurs d'avancement par glyphe — toutes dérivées des tables internes de la police.
Exemple complet
use Yeeefang\TcpdfNext\Core\Document;
$pdf = Document::create()
// Enregistrer les polices
->addFont('Roboto', '', '/fonts/Roboto-Regular.ttf')
->addFont('Roboto', 'B', '/fonts/Roboto-Bold.ttf')
->addFont('NotoSansTC', '', '/fonts/NotoSansTC-Regular.ttf')
->addPage()
// En-tête anglais
->setFont('Roboto', 'B', 18)
->cell(0, 12, 'Multilingual Invoice', newLine: true)
->ln(3)
// Corps anglais
->setFont('Roboto', '', 11)
->cell(0, 8, 'Customer: Acme Corporation', newLine: true)
->cell(0, 8, 'Date: 2026-02-16', newLine: true)
->ln(5)
// Section chinoise
->setFont('NotoSansTC', '', 11)
->cell(0, 8, '客戶名稱:台灣科技有限公司', newLine: true)
->cell(0, 8, '發票日期:2026年2月16日', newLine: true)
->save('multilingual-invoice.pdf');