Skip to content

Шрифты

TCPDF-Next поддерживает шрифты TrueType, OpenType и Type1 с автоматическим подмножественным встраиванием, рендерингом CJK и двунаправленным текстом. Шрифты загружаются через метод addFont() класса Document или управляются напрямую через FontManager.

Поддерживаемые форматы шрифтов

ФорматРасширенияПримечания
TrueType.ttfПолная поддержка контуров глифов, наиболее распространённый формат
OpenType.otfПоддерживаются варианты CFF и TrueType
Type1.pfb + .afmУстаревшие PostScript-шрифты, требуется файл метрик

Базовые шрифты

Спецификация PDF определяет 14 стандартных шрифтов («Base 14»), которые должен поддерживать каждый совместимый просмотрщик. Они не требуют встраивания, что минимизирует размер файла.

СемействоСтили
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);

Загрузка пользовательских шрифтов

addFont()

Зарегистрируйте файл TrueType или OpenType шрифта и используйте его сразу.

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

Семейства шрифтов с несколькими стилями

Зарегистрируйте каждый стилевой вариант под одним именем семейства. TCPDF-Next выбирает правильный файл при вызове setFont() со строкой стиля.

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

Подмножественное встраивание шрифтов

По умолчанию TCPDF-Next встраивает только те глифы, которые присутствуют в документе. FontSubsetter обрабатывает это автоматически во время сериализации PDF.

php
// Подмножественное встраивание выполняется автоматически — встраиваются только использованные глифы
$pdf = Document::create()
    ->addPage()
    ->setFont('DejaVuSans', '', 12)
    ->cell(0, 10, 'Only these glyphs are embedded');
// Результат: меньший размер PDF-файла

Почему подмножественное встраивание важно

Полный CJK-шрифт может превышать 15 МБ. Если ваш документ использует лишь несколько символов, подмножественное встраивание сокращает встроенные данные шрифта до нескольких килобайт. Это критически важно для веб-доставки и email-вложений.

Отключение подмножественного встраивания

В редких случаях (например, редактируемые поля формы, где пользователь может ввести любой символ) может потребоваться полный шрифт. Передайте false в параметр subsetting при регистрации:

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

Поддержка CJK

Китайский, японский и корейский текст требует шрифтов с большими наборами глифов. TCPDF-Next валидирует CJK-контент через CjkValidator и обеспечивает правильную кодировку в 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);

CJK-шрифты всегда встраиваются как подмножества, если явно не отключено — экономия размера существенна.

Двунаправленный текст (BiDi)

BiDiResolver реализует алгоритм двунаправленного текста Unicode для корректного рендеринга скриптов справа-налево, таких как арабский и иврит, включая смешанный LTR/RTL контент.

php
$pdf = Document::create()
    ->addFont('NotoSansArabic', '', '/fonts/NotoSansArabic-Regular.ttf')
    ->addPage()
    ->setFont('NotoSansArabic', '', 14)
    ->cell(0, 10, 'مرحبا بالعالم', newLine: true)   // Арабский
    ->write(10, 'Mixed: Hello مرحبا World');          // LTR + RTL

BiDi-переупорядочивание применяется автоматически, когда текст содержит RTL-символы. Ручная настройка не требуется.

ToUnicode CMap

TCPDF-Next генерирует ToUnicode CMap для каждого встроенного шрифта. Это отображение позволяет PDF-просмотрщикам извлекать корректный Unicode-текст при копировании/вставке или при индексации документа поисковыми системами. Генерируется автоматически во время сериализации.

Метрики шрифтов

Классы FontInfo и FontMetrics предоставляют подробные типографические измерения.

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

// Измерить конкретную строку текущим шрифтом
$width = $pdf->getStringWidth('Hello, World!');

// Использовать метрики для точной компоновки
$cellWidth = $pdf->getStringWidth('Total:') + 4; // добавить 4 мм отступа
$pdf->cell($cellWidth, 8, 'Total:');

Метрики включают ascender, descender, межстрочный интервал, высоту заглавных, высоту строчных и ширины продвижения для каждого глифа — всё извлекается из внутренних таблиц шрифта.

Полный пример

php
use Yeeefang\TcpdfNext\Core\Document;

$pdf = Document::create()
    // Регистрация шрифтов
    ->addFont('Roboto', '', '/fonts/Roboto-Regular.ttf')
    ->addFont('Roboto', 'B', '/fonts/Roboto-Bold.ttf')
    ->addFont('NotoSansTC', '', '/fonts/NotoSansTC-Regular.ttf')

    ->addPage()

    // Английский заголовок
    ->setFont('Roboto', 'B', 18)
    ->cell(0, 12, 'Multilingual Invoice', newLine: true)
    ->ln(3)

    // Английский текст
    ->setFont('Roboto', '', 11)
    ->cell(0, 8, 'Customer: Acme Corporation', newLine: true)
    ->cell(0, 8, 'Date: 2026-02-16', newLine: true)
    ->ln(5)

    // Китайская секция
    ->setFont('NotoSansTC', '', 11)
    ->cell(0, 8, '客戶名稱:台灣科技有限公司', newLine: true)
    ->cell(0, 8, '發票日期:2026年2月16日', newLine: true)

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

Распространяется по лицензии LGPL-3.0-or-later.