Skip to content

Documents multi-pages

Générez des PDF qui s'étendent sur plusieurs pages avec sauts automatiques, en-têtes/pieds de page personnalisés et numérotation de pages.

Exemple complet

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 : Page de titre --------------------------------------------------
$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);

// -- Pages de corps : Chapitres avec saut de page auto ---------------------------
$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);

    // Répéter le texte du corps pour déclencher sauts de page automatiques
    for ($i = 0; $i < 10; $i++) {
        $pdf->multiCell(0, 7, $body, align: Alignment::Justified);
    }
}

// -- En-têtes & pieds de page (post-rendu) -------------------------------------
$total = $pdf->getNumPages();

for ($p = 2; $p <= $total; $p++) {         // sauter page de titre
    $pdf->setPage($p)
        // En-tête
        ->setFont('helvetica', style: 'I', size: 8)
        ->setTextColor(150, 150, 150)
        ->setXY(15, 8)
        ->cell(0, 5, 'Acme Corporation -- Annual Report 2026')
        // Pied de page
        ->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;

Concepts clés

Sauts de page automatiques

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

Quand le curseur atteint margin mm du bord inférieur, une nouvelle page est insérée automatiquement et le contenu continue à la marge supérieure.

Insertion de page manuelle

php
use TcpdfNext\Enums\Orientation;

->addPage()                                   // A4 portrait (par défaut)
->addPage(orientation: Orientation::Landscape) // forcer paysage

Numérotation de pages

TCPDF-Next n'insère pas de numéros de page automatiquement. Utilisez une approche en deux passes -- écrivez tout le contenu d'abord, puis tamponnez les numéros sur chaque page :

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

Le nombre total de pages est inconnu jusqu'à ce que tout le contenu ait été écrit, c'est pourquoi le pattern en deux passes est nécessaire.

Groupes de pages

Utilisez startPageGroup() pour numérotation basée sur section (ex : redémarrer à 1 pour chaque chapitre) :

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

Marges

php
use TcpdfNext\Core\Margin;

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

Ou définissez-les individuellement :

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

Sortie

Cet exemple génère un PDF multi-pages avec une page de titre centrée, trois chapitres qui s'écoulent sur des pages supplémentaires via saut de page auto, et un pied de page "Page X of Y" sur chaque page sauf la page de titre.

Distribué sous licence LGPL-3.0-or-later.