Skip to content

Documentos Multi-Página

Gere PDFs que abrangem múltiplas páginas com quebras automáticas, cabeçalhos/rodapés personalizados e numeração de páginas.

Exemplo Completo

php
<?php

declare(strict_types=1);

require __DIR__ . '/vendor/autoload.php';

use TcpdfNext\Document;
use TcpdfNext\Enums\Alignment;

$pdf = Document::create()
    ->setTitle('Annual Report 2026')
    ->setAutoPageBreak(enabled: true, margin: 25);

// -- Page 1: Title Page --------------------------------------------------
$pdf->addPage()
    ->setY(100)
    ->setFont('helvetica', style: 'B', size: 28)
    ->cell(0, 15, 'Annual Report 2026', align: Alignment::Center, newLine: true)
    ->setFont('helvetica', size: 14)
    ->setTextColor(108, 117, 125)
    ->cell(0, 10, 'Acme Corporation', align: Alignment::Center, newLine: true)
    ->setTextColor(33, 37, 41);

// -- Body Pages: Chapters with auto page break ---------------------------
$chapters = [
    'Executive Summary'    => 'Revenue grew 18% year-over-year to $5.8 billion, driven by strong demand across all product lines and geographic expansion into Southeast Asia.',
    'Market Analysis'      => 'The global widget market reached $42 billion with a 7.2% CAGR. Our market share increased from 12.1% to 13.8%, placing us second worldwide.',
    'Financial Statements' => 'Operating income rose to $870 million. Free cash flow exceeded $400 million, enabling continued investment in R&D and strategic acquisitions.',
];

foreach ($chapters as $title => $body) {
    $pdf->addPage()
        ->setFont('helvetica', style: 'B', size: 20)
        ->cell(0, 12, $title, newLine: true)
        ->setFont('helvetica', size: 11);

    // Repeat body text to trigger automatic page breaks
    for ($i = 0; $i < 10; $i++) {
        $pdf->multiCell(0, 7, $body, align: Alignment::Justified);
    }
}

// -- Headers & Footers (post-render) -------------------------------------
$total = $pdf->getNumPages();

for ($p = 2; $p <= $total; $p++) {         // skip title page
    $pdf->setPage($p)
        // Header
        ->setFont('helvetica', style: 'I', size: 8)
        ->setTextColor(150, 150, 150)
        ->setXY(15, 8)
        ->cell(0, 5, 'Acme Corporation -- Annual Report 2026')
        // Footer
        ->setXY(0, 285)
        ->cell(210, 5, "Page {$p} of {$total}", align: Alignment::Center);
}

$pdf->setTextColor(33, 37, 41)
    ->save(__DIR__ . '/multi-page.pdf');

echo "PDF created -- {$total} pages." . PHP_EOL;

Conceitos-Chave

Quebras de Página Automáticas

php
->setAutoPageBreak(enabled: true, margin: 25)

Quando o cursor atinge margin mm da borda inferior, uma nova página é inserida automaticamente e o conteúdo continua na margem superior.

Inserção Manual de Página

php
use TcpdfNext\Enums\Orientation;

->addPage()                                   // A4 portrait (default)
->addPage(orientation: Orientation::Landscape) // force landscape

Numeração de Páginas

O TCPDF-Next não insere números de página automaticamente. Use uma abordagem de dois passos -- escreva todo o conteúdo primeiro, depois estampe os números em cada página:

php
$total = $pdf->getNumPages();

for ($p = 1; $p <= $total; $p++) {
    $pdf->setPage($p)
        ->setXY(0, 285)
        ->cell(210, 5, "Page {$p} of {$total}", align: Alignment::Center);
}

TIP

A contagem total de páginas é desconhecida até que todo o conteúdo tenha sido escrito, razão pela qual o padrão de dois passos é necessário.

Grupos de Páginas

Use startPageGroup() para numeração baseada em seção (ex.: reiniciar em 1 para cada capítulo):

php
$pdf->startPageGroup();
$currentGroupPage = $pdf->getGroupPageNo();

Margens

php
use TcpdfNext\Core\Margin;

->setMargins(new Margin(left: 15, top: 20, right: 15))

Ou defina individualmente:

php
->setLeftMargin(15)
->setTopMargin(20)
->setRightMargin(15)

Saída

Este exemplo gera um PDF multi-página com uma página de título centralizada, três capítulos que fluem por páginas adicionais via quebra automática de página, e um rodapé "Page X of Y" em todas as páginas exceto a página de título.

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