Multi-colonnes

Cet exemple est une variation du précédent montrant comment formater le texte sur plusieurs colonnes.

<?php
define('FPDF_FONTPATH','font/');
require(
'fpdf.php');

class
PDF extends FPDF
{
//Colonne courante
var $col=0;
//Ordonnée du début des colonnes
var $y0;

function
Header()
{
    
//En-tête
    
global $titre;

    
$this->SetFont('Arial','B',15);
    
$w=$this->GetStringWidth($titre)+6;
    
$this->SetX((210-$w)/2);
    
$this->SetDrawColor(0,80,180);
    
$this->SetFillColor(230,230,0);
    
$this->SetTextColor(220,50,50);
    
$this->SetLineWidth(1);
    
$this->Cell($w,9,$titre,1,1,'C',1);
    
$this->Ln(10);
    
//Sauvegarde de l'ordonnée
    
$this->y0=$this->GetY();
}

function
Footer()
{
    
//Pied de page
    
$this->SetY(-15);
    
$this->SetFont('Arial','I',8);
    
$this->SetTextColor(128);
    
$this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
}

function
SetCol($col)
{
    
//Positionnement sur une colonne
    
$this->col=$col;
    
$x=10+$col*65;
    
$this->SetLeftMargin($x);
    
$this->SetX($x);
}

function
AcceptPageBreak()
{
    
//Méthode autorisant ou non le saut de page automatique
    
if($this->col<2)
    {
        
//Passage à la colonne suivante
        
$this->SetCol($this->col+1);
        
//Ordonnée en haut
        
$this->SetY($this->y0);
        
//On reste sur la page
        
return false;
    }
    else
    {
        
//Retour en première colonne
        
$this->SetCol(0);
        
//Saut de page
        
return true;
    }
}

function
TitreChapitre($num,$lib)
{
    
//Titre
    
$this->SetFont('Arial','',12);
    
$this->SetFillColor(200,220,255);
    
$this->Cell(0,6,"Chapitre $num : $lib",0,1,'L',1);
    
$this->Ln(4);
    
//Sauvegarde de l'ordonnée
    
$this->y0=$this->GetY();
}

function
CorpsChapitre($fichier)
{
    
//Lecture du fichier texte
    
$f=fopen($fichier,'r');
    
$txt=fread($f,filesize($fichier));
    
fclose($f);
    
//Police
    
$this->SetFont('Times','',12);
    
//Sortie du texte sur 6 cm de largeur
    
$this->MultiCell(60,5,$txt);
    
$this->Ln();
    
//Mention
    
$this->SetFont('','I');
    
$this->Cell(0,5,'(fin de l\'extrait)');
    
//Retour en première colonne
    
$this->SetCol(0);
}

function
AjouterChapitre($num,$titre,$fichier)
{
    
//Ajout du chapitre
    
$this->AddPage();
    
$this->TitreChapitre($num,$titre);
    
$this->CorpsChapitre($fichier);
}
}

$pdf=new PDF();
$titre='Vingt mille lieues sous les mers';
$pdf->SetTitle($titre);
$pdf->SetAuthor('Jules Verne');
$pdf->AjouterChapitre(1,'UN ÉCUEIL FUYANT','20k_c1.txt');
$pdf->AjouterChapitre(2,'LE POUR ET LE CONTRE','20k_c2.txt');
$pdf->Output();
?>

La méthode-clé utilisée est AcceptPageBreak(). Elle permet d'accepter ou non un saut de page automatique. En refusant le saut et en modifiant la marge gauche (par SetLeftMargin()), on obtient le formatage en colonnes.
Pour le reste, peu de changements ; deux propriétés ont été ajoutées à la classe pour mémoriser le numéro de colonne courant ainsi que l'ordonnée du début des colonnes, et l'appel à MultiCell() spécifie que le texte a 6 cm de largeur.