Fuentes
TCPDF-Next soporta fuentes TrueType, OpenType y Type1 con subconjuntos automáticos, renderizado CJK y texto bidireccional. Las fuentes se cargan a través del método addFont() en Document o se gestionan directamente a través del FontManager.
Tipos de fuentes soportados
| Formato | Extensiones | Notas |
|---|---|---|
| TrueType | .ttf | Soporte completo de contornos de glifos, formato más común |
| OpenType | .otf | Variantes de contorno CFF y TrueType soportadas |
| Type1 | .pfb + .afm | Fuentes PostScript heredadas, requiere archivo de métricas |
Fuentes base
La especificación PDF define 14 fuentes estándar (las "Base 14") que todo visor conforme debe soportar. Estas no requieren incrustación, lo que mantiene el tamaño de archivo mínimo.
| Familia | Estilos |
|---|---|
| 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);Carga de fuentes personalizadas
addFont()
Registra un archivo de fuente TrueType u OpenType y úsalo inmediatamente.
$pdf = Document::create()
->addFont('NotoSansTC', '', '/path/to/NotoSansTC-Regular.ttf')
->addPage()
->setFont('NotoSansTC', '', 12)
->cell(0, 10, '繁體中文文字', newLine: true);Familias de fuentes con múltiples estilos
Registra cada variante de estilo bajo el mismo nombre de familia. TCPDF-Next selecciona el archivo correcto cuando llamas a setFont() con una cadena de estilo.
$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);Subconjuntos de fuentes
Por defecto, TCPDF-Next incrusta solo los glifos que aparecen en el documento. El FontSubsetter maneja esto automáticamente durante la serialización PDF.
// Los subconjuntos de fuentes son automáticos — solo los glifos usados se incrustan
$pdf = Document::create()
->addPage()
->setFont('DejaVuSans', '', 12)
->cell(0, 10, 'Only these glyphs are embedded');
// Resultado: tamaño de archivo PDF más pequeñoPor qué importan los subconjuntos
Una fuente CJK completa puede exceder los 15 MB. Si tu documento usa solo un puñado de caracteres, los subconjuntos reducen los datos de fuente incrustados a unos pocos kilobytes. Esto es crítico para la entrega web y los archivos adjuntos de correo electrónico.
Desactivar subconjuntos
En casos raros (por ejemplo, campos de formulario editables donde el usuario puede escribir cualquier carácter), puedes necesitar la fuente completa. Pasa false al parámetro de subconjuntos al registrar:
$pdf->addFont('NotoSans', '', '/fonts/NotoSans-Regular.ttf', subset: false);Soporte CJK
El texto en chino, japonés y coreano requiere fuentes con conjuntos de glifos grandes. TCPDF-Next valida el contenido CJK a través del CjkValidator y asegura la codificación correcta en la salida 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);Las fuentes CJK siempre se generan como subconjuntos a menos que se desactive explícitamente — el ahorro de tamaño es sustancial.
Texto bidireccional (BiDi)
El BiDiResolver implementa el Algoritmo Bidireccional Unicode para el renderizado correcto de scripts de derecha a izquierda como árabe y hebreo, incluyendo contenido mixto LTR/RTL.
$pdf = Document::create()
->addFont('NotoSansArabic', '', '/fonts/NotoSansArabic-Regular.ttf')
->addPage()
->setFont('NotoSansArabic', '', 14)
->cell(0, 10, 'مرحبا بالعالم', newLine: true) // Árabe
->write(10, 'Mixed: Hello مرحبا World'); // LTR + RTLEl reordenamiento BiDi se aplica automáticamente cuando el texto contiene caracteres RTL. No se requiere configuración manual.
ToUnicode CMap
TCPDF-Next genera un ToUnicode CMap para cada fuente incrustada. Este mapeo permite a los visores PDF extraer texto Unicode correcto cuando los usuarios copian/pegan o cuando los motores de búsqueda indexan el documento. Se genera automáticamente durante la serialización.
Métricas de fuentes
Las clases FontInfo y FontMetrics exponen mediciones tipográficas detalladas.
$pdf->setFont('Helvetica', '', 12);
// Medir una cadena específica en la fuente actual
$width = $pdf->getStringWidth('Hello, World!');
// Usar métricas para diseño preciso
$cellWidth = $pdf->getStringWidth('Total:') + 4; // agregar 4mm de relleno
$pdf->cell($cellWidth, 8, 'Total:');Las métricas incluyen ascendente, descendente, interlineado, altura de mayúsculas, altura x y anchos de avance por glifo — todo derivado de las tablas internas de la fuente.
Ejemplo completo
use Yeeefang\TcpdfNext\Core\Document;
$pdf = Document::create()
// Registrar fuentes
->addFont('Roboto', '', '/fonts/Roboto-Regular.ttf')
->addFont('Roboto', 'B', '/fonts/Roboto-Bold.ttf')
->addFont('NotoSansTC', '', '/fonts/NotoSansTC-Regular.ttf')
->addPage()
// Encabezado en inglés
->setFont('Roboto', 'B', 18)
->cell(0, 12, 'Multilingual Invoice', newLine: true)
->ln(3)
// Cuerpo en inglés
->setFont('Roboto', '', 11)
->cell(0, 8, 'Customer: Acme Corporation', newLine: true)
->cell(0, 8, 'Date: 2026-02-16', newLine: true)
->ln(5)
// Sección en chino
->setFont('NotoSansTC', '', 11)
->cell(0, 8, '客戶名稱:台灣科技有限公司', newLine: true)
->cell(0, 8, '發票日期:2026年2月16日', newLine: true)
->save('multilingual-invoice.pdf');