Changer le nombre de colonnes avec FPDF

jeudi 29 mars 2007

Il existe de nombreuses API pour générer des documents PDF à la volée depuis un script PHP. L'API FPDF présente de très nombreux avantages: lègère, puissance, très facile d'utilisation, opensource, gratuite. Cependant, on peut rencontrer un problème lors de la rédaction du code qui génèrera le PDF: comment mélanger des pages qui affichent le texte sur plusieurs colonnes avec des pages qui affichent le texte sur une seule colonne ? Voici la réponse.

Il existe de nombreuses API pour générer des documents PDF à la volée depuis un script PHP. L’API FPDF présente de très nombreux avantages: lègère, puissance, très facile d’utilisation, opensource, gratuite. Cependant, on peut rencontrer un problème lors de la rédaction du code qui génèrera le PDF: comment mélanger des pages qui affichent le texte sur plusieurs colonnes avec des pages qui affichent le texte sur une seule colonne ? Voici la réponse.

Sur le site de FPDF, on peut trouver un tutoriel montrant comment disposer le texte de la page sur plusieurs colonnes. Pour reprendre cet exemple, le code à rajouter est le suivant:


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


/* Pour placer les annexes sur 3 colonnes lorsque c’est nécessaire */
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(60);
//On reste sur la page
return false;
}
else
{
//Retour en première colonne
$this->SetCol(0);
//Ordonnée en haut
$this->SetY(60);
//Saut de page
return true;
}
}

La fonction AcceptPageBreak() est appelée à chaque fois que le curseur atteint le bas de la page. Le code ci-dessus a pour effet de rediriger l’appel de AcceptPageBreak() vers la fonction SetCol() et d’effectuer un petit test: est-ce qu’on en est à la troisième colonne ? Si oui, passer à la page suivante. Sinon, aller à la prochaine colonne, en restant sur la même page.

L’idée principale du mécanisme est la suivante: si AcceptPageBreak() renvoie TRUE, le curseur passe à la page suivante. Si elel renvoie FALSE, le curseur reste sur la même page.

Or, dans l’exemple précédent, AcceptPageBreak() est surchargée. Cela signifie qu’elle n’admet qu’une seule implémentation, ce qui a pour conséquence d’imposer la même politique (une seule colonne ou 3 colonnes) dans tout le document.

Comment, dès lors, faire pour indiquer que l’on veut telle ou telle page sur 3 colonne et telle autre page sur une seule colonne ?

Voici l’astuce:

1) Renommer la fonction AcceptPageBreak() ci-dessus, pour l’appeler, par exemple, PageBreak().

2) Créer une variable de classe appelée par exemple $colonnes

3) Créer une nouvelle fonction AcceptPageBreak(), et la défini ainsi:


/* Fonction appelée à chaque changement de page */
function AcceptPageBreak()
{
// Mettre la variable $colonnes à TRUE pour répartir le texte sur 3 colonnes.
if($this->colonnes)
return $this->PageBreak();
else
return $this->AutoPageBreak; // appel à la méthode parent
}

3) Dans le code, changer la valeur de la variable $colonnes.

Imaginons que nous ayons créer un nouvel objet FPDF de cette manière:

$pdf = new FPDF();

il suffira alors d’écrire:


$pdf->colonnes = TRUE;

// tout ce qui se situe ici sera sur 3 colonnes
</span>


$pdf->colonnes = FALSE;

// tout ce qui se situe ici sera sur 1 colonne
</span>