Skip to content

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

FormatoExtensionesNotas
TrueType.ttfSoporte completo de contornos de glifos, formato más común
OpenType.otfVariantes de contorno CFF y TrueType soportadas
Type1.pfb + .afmFuentes 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.

FamiliaEstilos
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 — 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.

php
$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.

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, '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.

php
// 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ño

Por 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:

php
$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.

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

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.

php
$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 + RTL

El 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.

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

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

Distribuido bajo la licencia LGPL-3.0-or-later.