Типографика (HasTypography)
Trait HasTypography управляет визуальным представлением текста: семейство шрифта, стиль, размер, интервал, масштабирование, цвет, тень и режим рендеринга. Все методы возвращают static для fluent-цепочки.
Установка шрифтов
setFont()
Устанавливает текущее семейство шрифта, стиль и размер одним вызовом.
use Yeeefang\TcpdfNext\Core\Document;
$pdf = Document::create()
->addPage()
->setFont('Helvetica', '', 12)
->cell(0, 10, 'Normal text', newLine: true)
->setFont('Helvetica', 'B', 14)
->cell(0, 10, 'Bold text', newLine: true)
->setFont('Helvetica', 'BI', 16)
->cell(0, 10, 'Bold Italic text', newLine: true);Стили шрифта
Комбинируйте символы стилей для применения нескольких эффектов:
| Код | Стиль |
|---|---|
'' | Обычный |
'B' | Жирный |
'I' | Курсив |
'BI' | Жирный курсив |
'U' | Подчёркивание |
'D' | Зачёркивание |
'O' | Надчёркивание |
Стили можно свободно комбинировать: 'BIU' создаёт жирный курсивный подчёркнутый текст.
$pdf->setFont('Helvetica', 'BU', 12)
->cell(0, 10, 'Bold + Underline', newLine: true)
->setFont('Helvetica', 'ID', 12)
->cell(0, 10, 'Italic + Strikethrough', newLine: true)
->setFont('Helvetica', 'BO', 12)
->cell(0, 10, 'Bold + Overline', newLine: true);setFontSize()
Изменяет размер шрифта без смены семейства или стиля.
$pdf->setFont('Helvetica', 'B', 12)
->cell(0, 10, '12pt heading', newLine: true)
->setFontSize(10)
->cell(0, 10, '10pt body text', newLine: true)
->setFontSize(8)
->cell(0, 10, '8pt footnote', newLine: true);Интервал и масштабирование
setFontSpacing()
Регулирует дополнительное расстояние (в пунктах), вставляемое между каждой парой символов.
$pdf->setFont('Helvetica', '', 12)
->setFontSpacing(0)
->cell(0, 10, 'Normal spacing', newLine: true)
->setFontSpacing(1.5)
->cell(0, 10, 'Expanded spacing', newLine: true)
->setFontSpacing(-0.5)
->cell(0, 10, 'Tight spacing', newLine: true)
->setFontSpacing(0);setFontStretching()
Применяет горизонтальное масштабирование к глифам. Значение 100 — нормальная ширина.
$pdf->setFont('Helvetica', '', 14)
->setFontStretching(100)
->cell(0, 10, 'Normal width (100%)', newLine: true)
->setFontStretching(130)
->cell(0, 10, 'Stretched (130%)', newLine: true)
->setFontStretching(75)
->cell(0, 10, 'Condensed (75%)', newLine: true)
->setFontStretching(100);Измерение текста
getStringWidth()
Возвращает ширину (в пользовательских единицах) строки, отрендеренной текущим шрифтом и размером. Полезно для расчёта компоновки перед отрисовкой.
$pdf->setFont('Helvetica', '', 12);
$width = $pdf->getStringWidth('Invoice Total: $1,250.00');
// Использование измеренной ширины для выравнивания ячейки вправо
$pageWidth = $pdf->getPageWidth();
$rightMargin = $pdf->getRightMargin();
$pdf->setX($pageWidth - $rightMargin - $width)
->cell($width, 10, 'Invoice Total: $1,250.00');Режимы рендеринга текста
PDF определяет 8 режимов рендеринга текста через enum TextRenderer. Они управляют тем, заполняется ли текст, обводится, используется как контур отсечения или скрывается.
| Режим | Значение | Эффект |
|---|---|---|
| Fill | 0 | Обычный заполненный текст (по умолчанию) |
| Stroke | 1 | Только контур |
| FillStroke | 2 | Заполненный с контуром |
| Invisible | 3 | Скрытый, но выделяемый/доступный для поиска |
| FillClip | 4 | Заливка, затем добавление в контур отсечения |
| StrokeClip | 5 | Обводка, затем добавление в контур отсечения |
| FillStrokeClip | 6 | Заливка + обводка, затем отсечение |
| Clip | 7 | Только добавление в контур отсечения |
$pdf->setFont('Helvetica', 'B', 36)
->setTextRenderingMode(0)
->cell(0, 15, 'Filled text', newLine: true)
->setTextRenderingMode(1)
->cell(0, 15, 'Outlined text', newLine: true)
->setTextRenderingMode(2)
->cell(0, 15, 'Fill + Stroke', newLine: true)
->setTextRenderingMode(3)
->cell(0, 15, 'Invisible (but searchable)', newLine: true)
->setTextRenderingMode(0);Невидимый режим (3) особенно полезен для OCR-наложений — вы размещаете распознанный текст поверх отсканированного изображения, чтобы PDF был доступен для поиска, в то время как изображение остаётся видимым.
Цвет текста
setTextColor()
Устанавливает цвет текста с использованием значений RGB.
$pdf->setTextColor(0, 0, 0) // Чёрный
->cell(0, 10, 'Black text', newLine: true)
->setTextColor(220, 50, 50) // Красный
->cell(0, 10, 'Red text', newLine: true)
->setTextColor(0, 102, 204) // Синий
->cell(0, 10, 'Blue text', newLine: true)
->setTextColor(0, 0, 0); // Сброс на чёрныйПри вызове с одним аргументом устанавливается значение оттенка серого (0 = чёрный, 255 = белый).
$pdf->setTextColor(128)
->cell(0, 10, 'Gray text', newLine: true);Тень текста
setTextShadow()
Применяет эффект тени под текстом. Тень определяется как ассоциативный массив.
$pdf->setFont('Helvetica', 'B', 28)
->setTextShadow([
'enabled' => true,
'depth_w' => 0.4, // Горизонтальное смещение (мм)
'depth_h' => 0.4, // Вертикальное смещение (мм)
'color' => [180, 180, 180],
'opacity' => 0.5,
'blend_mode' => 'Normal',
])
->cell(0, 15, 'Heading with Shadow', newLine: true)
->setTextShadow(['enabled' => false]);Полный пример
use Yeeefang\TcpdfNext\Core\Document;
$pdf = Document::create()
->addPage()
// Заголовок — крупный, жирный, синий
->setFont('Helvetica', 'B', 24)
->setTextColor(0, 51, 102)
->cell(0, 14, 'Monthly Report', newLine: true)
// Подзаголовок — обычный, серый, с дополнительным интервалом
->setFont('Helvetica', '', 12)
->setTextColor(100, 100, 100)
->setFontSpacing(1.0)
->cell(0, 10, 'February 2026', newLine: true)
->setFontSpacing(0)
->ln(5)
// Основной текст — чёрный, обычный
->setFont('Times', '', 11)
->setTextColor(0, 0, 0)
->multiCell(0, 6, 'Revenue increased 12% compared to the previous quarter. Operating costs remained stable, and net margin improved by 3 percentage points.')
->ln(3)
// Сноска — мелкий, курсив, серый
->setFont('Times', 'I', 8)
->setTextColor(150, 150, 150)
->cell(0, 5, '* All figures are unaudited.')
->save('report.pdf');