Производительность
TCPDF-Next спроектирован для высокопроизводительной генерации документов. Эта страница описывает встроенные оптимизации и лучшие практики для максимальной отдачи от библиотеки.
Жизненный цикл воркера
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 шрифтов перед встраиванием.
Это может сократить данные шрифтов с нескольких мегабайт до нескольких килобайт для документов с небольшим набором символов.
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() работают независимо от размера документа.
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:
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() на каждой странице, если шрифт фактически не меняется:
$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 |