Skip to content

Desempenho

O TCPDF-Next é projetado para geração de documentos de alto throughput. Esta página cobre as otimizações embutidas e melhores práticas para obter o máximo da biblioteca.

Ciclo de Vida do Worker

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

Inicialização Lazy de Sub-Engines

A classe Document mantém referências a mais de 20 sub-engines (Graphics, Typography, Barcode, Forms, Layers, etc.), mas a maioria é inicializada de forma lazy — são criados apenas quando acessados pela primeira vez.

Um PDF simples apenas com texto nunca instanciará o analisador SVG, motor de códigos de barras ou gerenciador de campos de formulário. Isso mantém o uso de memória proporcional às funcionalidades que você realmente usa.

Subconjuntos de Fontes

Por padrão, o TCPDF-Next incorpora apenas os glifos realmente usados no documento. O FontSubsetter analisa todo o conteúdo de texto e remove glifos não usados das fontes TrueType/OpenType antes de incorporar.

Isso pode reduzir dados de fontes de vários megabytes para poucos kilobytes em documentos que usam um conjunto pequeno de caracteres.

php
use Yeeefang\TcpdfNext\Core\Document;

// Subconjuntos de fontes estão ligados por padrão — nada para habilitar
$pdf = Document::create()
    ->addPage()
    ->setFont('DejaVuSans', '', 12)
    ->cell(0, 10, 'Only these glyphs are embedded.');

Compressão FlateDecode

Todos os streams de conteúdo são comprimidos usando zlib (FlateDecode). Isso é habilitado por padrão e requer a extensão PHP ext-zlib. A compressão tipicamente reduz o tamanho do PDF em 60-80%.

Saída Streaming (PdfWriterChunked)

Para documentos muito grandes, o escritor em chunks descarrega dados de página finalizados incrementalmente em vez de manter todo o PDF na memória. Isso é transparente — os mesmos métodos save() e output() funcionam independentemente do tamanho do documento.

php
use Yeeefang\TcpdfNext\Core\Document;

// Saída streaming para documento grande
$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');
// Subconjuntos de fontes e compressão FlateDecode acontecem automaticamente

Streams de Referência Cruzada

O TCPDF-Next usa streams de referência cruzada (PDF 1.5+) em vez de tabelas xref tradicionais. Streams de referência cruzada são comprimidos, resultando em tamanhos de arquivo menores — especialmente para documentos com muitos objetos.

Linearização (Visualização Web Rápida)

A linearização reordena objetos PDF para que a primeira página possa ser exibida antes que o arquivo inteiro seja baixado. Habilite para qualquer PDF servido via 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');

O Linearizer insere hint streams que dizem aos visualizadores como buscar páginas sob demanda.

Limite de Páginas

A constante Document::MAX_PAGES padrão é 10.000 páginas. Essa é uma proteção de segurança contra loops infinitos durante a geração. Você pode sobrescrevê-la estendendo a classe se seu caso de uso requer mais.

Melhores Práticas

Reutilize Instâncias de Fontes Entre Páginas

Defina a fonte uma vez e deixe-a persistir entre páginas. Evite chamar setFont() em cada página a menos que a fonte realmente mude:

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

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

Use Templates (XObjects) para Conteúdo Repetido

Se toda página tem o mesmo cabeçalho, rodapé ou marca d'água, crie-o uma vez como template e estampe em cada página. Isso armazena o conteúdo como um único objeto PDF referenciado múltiplas vezes, ao invés de duplicá-lo.

Habilite Compressão

A compressão está ligada por padrão. Não desabilite a menos que precise inspecionar streams PDF brutos para depuração.

Use Saída Streaming para Documentos Grandes

Para documentos com mais de algumas centenas de páginas, a saída streaming mantém o uso de memória constante independentemente da contagem de páginas.

Subconjuntos de Fontes

Subconjuntos de fontes estão ligados por padrão. Certifique-se de não desabilitá-los em produção — incorporação completa de fontes pode adicionar megabytes ao tamanho do arquivo.

Minimize o Escopo de Transações

Transações armazenam um snapshot completo do documento. Mantenha-as de curta duração para evitar dobrar o uso de memória. Veja Transações para detalhes.

Resumo

FuncionalidadePadrãoImpacto
Subconjuntos de fontesLigadoFontes menores (KB vs MB)
Compressão FlateDecodeLigadoStreams 60-80% menores
Streams de referência cruzadaLigadoDados xref menores
Inicialização lazyLigadoMemória proporcional às funcionalidades usadas
Saída streamingAutomáticoMemória constante para documentos grandes
LinearizaçãoDesligadoHabilite para PDFs entregues via web

Distribuído sob a licença LGPL-3.0-or-later.