Шрифты
TCPDF-Next поддерживает шрифты TrueType, OpenType и Type1 с автоматическим подмножественным встраиванием, рендерингом CJK и двунаправленным текстом. Шрифты загружаются через метод addFont() класса Document или управляются напрямую через FontManager.
Поддерживаемые форматы шрифтов
| Формат | Расширения | Примечания |
|---|---|---|
| TrueType | .ttf | Полная поддержка контуров глифов, наиболее распространённый формат |
| OpenType | .otf | Поддерживаются варианты CFF и TrueType |
| Type1 | .pfb + .afm | Устаревшие PostScript-шрифты, требуется файл метрик |
Базовые шрифты
Спецификация PDF определяет 14 стандартных шрифтов («Base 14»), которые должен поддерживать каждый совместимый просмотрщик. Они не требуют встраивания, что минимизирует размер файла.
| Семейство | Стили |
|---|---|
| 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);Загрузка пользовательских шрифтов
addFont()
Зарегистрируйте файл TrueType или OpenType шрифта и используйте его сразу.
$pdf = Document::create()
->addFont('NotoSansTC', '', '/path/to/NotoSansTC-Regular.ttf')
->addPage()
->setFont('NotoSansTC', '', 12)
->cell(0, 10, '繁體中文文字', newLine: true);Семейства шрифтов с несколькими стилями
Зарегистрируйте каждый стилевой вариант под одним именем семейства. TCPDF-Next выбирает правильный файл при вызове setFont() со строкой стиля.
$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.
// Подмножественное встраивание выполняется автоматически — встраиваются только использованные глифы
$pdf = Document::create()
->addPage()
->setFont('DejaVuSans', '', 12)
->cell(0, 10, 'Only these glyphs are embedded');
// Результат: меньший размер PDF-файлаПочему подмножественное встраивание важно
Полный CJK-шрифт может превышать 15 МБ. Если ваш документ использует лишь несколько символов, подмножественное встраивание сокращает встроенные данные шрифта до нескольких килобайт. Это критически важно для веб-доставки и email-вложений.
Отключение подмножественного встраивания
В редких случаях (например, редактируемые поля формы, где пользователь может ввести любой символ) может потребоваться полный шрифт. Передайте false в параметр subsetting при регистрации:
$pdf->addFont('NotoSans', '', '/fonts/NotoSans-Regular.ttf', subset: false);Поддержка CJK
Китайский, японский и корейский текст требует шрифтов с большими наборами глифов. TCPDF-Next валидирует CJK-контент через CjkValidator и обеспечивает правильную кодировку в 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);CJK-шрифты всегда встраиваются как подмножества, если явно не отключено — экономия размера существенна.
Двунаправленный текст (BiDi)
BiDiResolver реализует алгоритм двунаправленного текста Unicode для корректного рендеринга скриптов справа-налево, таких как арабский и иврит, включая смешанный LTR/RTL контент.
$pdf = Document::create()
->addFont('NotoSansArabic', '', '/fonts/NotoSansArabic-Regular.ttf')
->addPage()
->setFont('NotoSansArabic', '', 14)
->cell(0, 10, 'مرحبا بالعالم', newLine: true) // Арабский
->write(10, 'Mixed: Hello مرحبا World'); // LTR + RTLBiDi-переупорядочивание применяется автоматически, когда текст содержит RTL-символы. Ручная настройка не требуется.
ToUnicode CMap
TCPDF-Next генерирует ToUnicode CMap для каждого встроенного шрифта. Это отображение позволяет PDF-просмотрщикам извлекать корректный Unicode-текст при копировании/вставке или при индексации документа поисковыми системами. Генерируется автоматически во время сериализации.
Метрики шрифтов
Классы FontInfo и FontMetrics предоставляют подробные типографические измерения.
$pdf->setFont('Helvetica', '', 12);
// Измерить конкретную строку текущим шрифтом
$width = $pdf->getStringWidth('Hello, World!');
// Использовать метрики для точной компоновки
$cellWidth = $pdf->getStringWidth('Total:') + 4; // добавить 4 мм отступа
$pdf->cell($cellWidth, 8, 'Total:');Метрики включают ascender, descender, межстрочный интервал, высоту заглавных, высоту строчных и ширины продвижения для каждого глифа — всё извлекается из внутренних таблиц шрифта.
Полный пример
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');