Skip to content

Производительность

TCPDF-Next спроектирован для высокопроизводительной генерации документов. Эта страница описывает встроенные оптимизации и лучшие практики для максимальной отдачи от библиотеки.

Жизненный цикл воркера

mermaid
graph TB
    Boot["Boot: DocumentFactory"] --> Lock["Lock Registries"]
    Lock --> Loop{"HTTP Request"}
    Loop --> Create["factory.create()"]
    Create --> Gen["Generate PDF"]
    Gen --> Dispose["Dispose Document"]
    Dispose --> Loop

Ленивая инициализация под-движков

Класс Document хранит ссылки на более чем 20 под-движков (Graphics, Typography, Barcode, Forms, Layers и т.д.), но большинство из них инициализируются лениво — они создаются только при первом обращении.

Простой текстовый PDF никогда не создаст экземпляр SVG-парсера, движка штрихкодов или менеджера полей форм. Это поддерживает потребление памяти пропорциональным фактически используемым функциям.

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

По умолчанию TCPDF-Next встраивает только фактически используемые в документе глифы. FontSubsetter анализирует весь текстовый контент и удаляет неиспользуемые глифы из TrueType/OpenType шрифтов перед встраиванием.

Это может сократить данные шрифтов с нескольких мегабайт до нескольких килобайт для документов с небольшим набором символов.

php
use Yeeefang\TcpdfNext\Core\Document;

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

Сжатие FlateDecode

Все потоки контента сжимаются с помощью zlib (FlateDecode). Это включено по умолчанию и требует расширения ext-zlib в PHP. Сжатие обычно уменьшает размер PDF на 60-80%.

Потоковый вывод (PdfWriterChunked)

Для очень больших документов порционный писатель сбрасывает финализированные данные страниц инкрементально, вместо хранения всего PDF в памяти. Это прозрачно — те же методы save() и output() работают независимо от размера документа.

php
use Yeeefang\TcpdfNext\Core\Document;

// Потоковый вывод для большого документа
$pdf = Document::create();
$pdf->addPage()->setFont('Helvetica', '', 10);

for ($i = 0; $i < 5000; $i++) {
    $pdf->cell(0, 5, "Row {$i}: data content here", newLine: true);
}

$pdf->save('large-document.pdf');
// Подмножественное встраивание и сжатие FlateDecode выполняются автоматически

Потоки перекрёстных ссылок

TCPDF-Next использует потоки перекрёстных ссылок (PDF 1.5+) вместо традиционных таблиц xref. Потоки перекрёстных ссылок сами сжимаются, что даёт меньший размер файла — особенно для документов с множеством объектов.

Линеаризация (быстрый веб-просмотр)

Линеаризация переупорядочивает PDF-объекты, чтобы первая страница могла быть отображена до полной загрузки файла. Включайте для любого PDF, обслуживаемого по HTTP:

php
use Yeeefang\TcpdfNext\Core\Document;

$pdf = Document::create()
    ->setLinearization(true)
    ->addPage()
    ->cell(0, 10, 'Progressive rendering in the browser')
    ->save('web-optimized.pdf');

Linearizer вставляет потоки подсказок, сообщающие просмотрщикам, как загружать страницы по требованию.

Лимит страниц

Константа Document::MAX_PAGES по умолчанию равна 10,000 страниц. Это защита от бесконечных циклов при генерации. Вы можете переопределить её, расширив класс, если ваш сценарий требует большего.

Лучшие практики

Повторное использование экземпляров шрифтов между страницами

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

php
$pdf = Document::create()
    ->setFont('Helvetica', '', 10);

for ($i = 0; $i < 100; $i++) {
    $pdf->addPage()
        ->cell(0, 5, "Page {$i} content");
}

Используйте шаблоны (XObjects) для повторяющегося контента

Если каждая страница имеет одинаковый колонтитул или водяной знак, создайте его один раз как шаблон и размещайте на каждой странице. Это хранит контент как один PDF-объект, на который ссылаются многократно, вместо дублирования.

Включите сжатие

Сжатие включено по умолчанию. Не отключайте его, если вам не нужно инспектировать сырые PDF-потоки для отладки.

Используйте потоковый вывод для больших документов

Для документов, превышающих несколько сотен страниц, потоковый вывод поддерживает постоянное потребление памяти независимо от количества страниц.

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

Подмножественное встраивание включено по умолчанию. Убедитесь, что не отключаете его в продакшене — полное встраивание шрифтов может добавить мегабайты к размеру файла.

Минимизируйте область транзакций

Транзакции хранят полный снимок документа. Делайте их кратковременными, чтобы избежать удвоения потребления памяти. Подробности см. в Транзакции.

Итого

ФункцияПо умолчаниюЭффект
Подмножественное встраивание шрифтовВключеноМеньшие шрифты (КБ вместо МБ)
Сжатие FlateDecodeВключеноПотоки меньше на 60-80%
Потоки перекрёстных ссылокВключеноМеньшие данные xref
Ленивая инициализацияВключенаПамять пропорциональна используемым функциям
Потоковый выводАвтоматическиПостоянная память для больших документов
ЛинеаризацияВыключенаВключайте для веб-доставки PDF

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