Template PDF par défaut avec FPDI
09:56 16 12 2011Dans le cadre de la création automatique du catalogue de formations PDF de AlliaForm, j’ai utilisé FPDI une classe dérivée de FPDF permettant d’importer des templates (modèles) de PDF.
FPDI est très pratique, on ouvre un fichier PDF existant, on importe une page et on s’en sert comme modele pour générer un nouveau PDF.
Seulement, j’ai rapidement rencontré un problème : si j’assigne un modele à un page, que j’écris un long texte dessus et que ce texte passe sur une page suivante (ce qui se fait automatiquement avec la méthode multicell()), la page suivante n’utilisera pas le modèle, elle sera générée à partir d’une feuille blanche.
J’ai bien sûr sorti la doc de FPDI, googlé pour trouver une solution rapide, mais la seule réponse que j’ai trouvé est « ce n’est pas possible avec FPDI ».
Je vous livre donc la solution (très simple) que j’ai implémentée.
Il suffit de dériver la classe FPDI et plus exactement, la méthode addPage() qui s’occupe d’ajouter une nouvelle page au document PDF pour y ajouter la fonctionnalité.
class myfpdi extends fpdi { public $defaultModele; public function AddPage() { parent::AddPage(); if ($this->defaultModele != '') { $this->setSourceFile($this->defaultModele); $tplidx = $this->ImportPage(1); $this->useTemplate($tplidx); } } }
On commence par appeler la méthode parente afin de ré-implémener le fonctionnement initial de addPAge(), puis on on lui assigne notre modèle par défaut qui se trouve dans le nouvel attribut $defaultModele.
De là je n’ai plus qu’à instancier un objet de type myfpdi() et lui assigner un fichier PDF par défaut dans l’attribut $defaultModele avant de créer de nouvelles pages :
$pdf = new myfpdi(); $pdf->defaultModele = 'fichier.pdf'; $pdf->addPage(); ... $pdf->ouput();
A chaque fois qu’une nouvelle page va être créée, la méthode addPage sera appelée et $defaultModele sera utilisé comme modèle par défaut.
Si à un moment dans mon PDF, je souhaite utiliser un autre modèle, il me suffira de changer la valeur de $defaultModele et si je ne veux plus de modèle, je passe sa valeur à ‘ ‘ (chaîne vide).
Bien sûr, dans un souci de lisibilité, le code présenté ci-dessus va au plus simple, tout cela est perfectible (accesseurs, test d’existence du fichier pdf, etc…)