Skip to content

Documentos multi-página

Genera PDFs que abarcan múltiples páginas con saltos automáticos, headers/footers personalizados y numeración de páginas.

Ejemplo 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);

// -- Página 1: Portada --------------------------------------------------
$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);

// -- Páginas del cuerpo: Capítulos con salto de página automático ---------------------------
$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);

    // Repetir texto del cuerpo para activar saltos de página automáticos
    for ($i = 0; $i < 10; $i++) {
        $pdf->multiCell(0, 7, $body, align: Alignment::Justified);
    }
}

// -- Headers y footers (post-renderizado) -------------------------------------
$total = $pdf->getNumPages();

for ($p = 2; $p <= $total; $p++) {         // saltar portada
    $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;

Conceptos clave

Saltos de página automáticos

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

Cuando el cursor alcanza margin mm desde el borde inferior, se inserta una nueva página automáticamente y el contenido continúa en el margen superior.

Inserción manual de páginas

php
use TcpdfNext\Enums\Orientation;

->addPage()                                   // A4 portrait (predeterminado)
->addPage(orientation: Orientation::Landscape) // forzar landscape

Numeración de páginas

TCPDF-Next no inserta números de página automáticamente. Usa un enfoque de dos pasadas -- escribe todo el contenido primero, luego estampa los números en 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

El conteo total de páginas es desconocido hasta que todo el contenido ha sido escrito, por eso el patrón de dos pasadas es necesario.

Grupos de páginas

Usa startPageGroup() para numeración basada en secciones (ej., reiniciar en 1 para cada capítulo):

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

Márgenes

php
use TcpdfNext\Core\Margin;

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

O configúralos individualmente:

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

Salida

Este ejemplo genera un PDF multi-página con una portada centrada, tres capítulos que fluyen a través de páginas adicionales via salto de página automático, y un footer "Page X of Y" en cada página excepto la portada.

Distribuido bajo la licencia LGPL-3.0-or-later.