Skip to content

Трансформации (HasTransforms)

Trait HasTransforms предоставляет геометрические трансформации, изменяющие способ рендеринга последующих операций рисования. Трансформации работают с текущей матрицей трансформации (CTM) и должны быть обёрнуты в пары startTransform() / stopTransform() для изоляции их эффектов.

Все методы возвращают static, поэтому каждый вызов может быть объединён в цепочку.

Краткий справочник

МетодЭффект
startTransform()Сохранить состояние графики (push CTM)
stopTransform()Восстановить состояние графики (pop CTM)
rotate()Поворот вокруг точки
scale()Масштабирование по горизонтали и вертикали
translate()Перемещение начала координат
skew()Наклон по осям X и Y
mirrorH()Горизонтальное отражение
mirrorV()Вертикальное отражение
mirrorP()Отражение относительно точки
mirrorL()Отражение относительно произвольной линии

Базовый пример

php
use Yeeefang\TcpdfNext\Core\Document;

$pdf = Document::create()
    ->addPage()
    ->setFont('Helvetica', '', 12)

    // Повёрнутый текст
    ->startTransform()
    ->rotate(45, 105, 60)
    ->text(100, 55, 'Rotated 45°')
    ->stopTransform()

    // Масштабированный прямоугольник
    ->startTransform()
    ->scale(150, 150, 50, 150)
    ->rect(40, 140, 20, 20, 'DF')
    ->stopTransform()

    // Отражённый текст
    ->startTransform()
    ->mirrorH(105)
    ->text(100, 200, 'Mirrored')
    ->stopTransform();

WARNING

Всегда оборачивайте трансформации в пары startTransform() / stopTransform(). Забытый stopTransform() оставляет изменённое состояние графики для всех последующих операций.

startTransform / stopTransform

php
$pdf->startTransform();  // Сохранить текущее состояние графики
// ... операции рисования с трансформациями ...
$pdf->stopTransform();   // Извлечь и восстановить предыдущее состояние

Эти вызовы могут быть вложенными. Каждый startTransform() помещает новое состояние в стек.

rotate()

php
$pdf->rotate(float $angle, float $x = '', float $y = '');

Поворачивает последующий контент на $angle градусов против часовой стрелки вокруг точки (x, y). Если x и y опущены, используется текущая позиция.

scale()

php
$pdf->scale(float $sx, float $sy, float $x = '', float $y = '');

Масштабирует контент на $sx процентов по горизонтали и $sy процентов по вертикали относительно точки (x, y). Значение 100 означает без изменений; 200 удваивает размер.

translate()

php
$pdf->translate(float $tx, float $ty);

Сдвигает начало координат на $tx по горизонтали и $ty по вертикали. Все последующие координаты смещаются на эту величину до остановки трансформации.

skew()

php
$pdf->skew(float $angleX, float $angleY, float $x = '', float $y = '');

Применяет наклонную трансформацию. $angleX наклоняет по оси X, а $angleY по оси Y, оба в градусах.

Методы отражения

php
$pdf->mirrorH(float $x = '');                              // Горизонтальное отражение относительно вертикальной оси в x
$pdf->mirrorV(float $y = '');                              // Вертикальное отражение относительно горизонтальной оси в y
$pdf->mirrorP(float $x = '', float $y = '');               // Отражение относительно точки
$pdf->mirrorL(float $angle, float $x = '', float $y = ''); // Отражение относительно линии через (x, y) под углом
php
$pdf->startTransform()
    ->mirrorH(105)
    ->setFont('Helvetica', '', 14)
    ->text(80, 50, 'Flipped horizontally')
    ->stopTransform();

Комбинирование трансформаций

Несколько трансформаций могут быть накоплены в одном блоке. Они применяются в порядке вызова.

php
$pdf->startTransform()
    ->translate(20, 20)
    ->rotate(30)
    ->scale(120, 120)
    ->rect(10, 10, 40, 20, 'DF')
    ->stopTransform();

Полная поддержка CTM

Для продвинутых сценариев базовая текущая матрица трансформации полностью доступна. Шестиэлементная матрица [a, b, c, d, e, f] соответствует стандартной матрице трансформации PDF, обеспечивая полный контроль над аффинными трансформациями, когда удобных методов недостаточно.

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