créer un sommaire avec liens en utilisant FPDF

    13:15 18 12 2011

 

Dernier volet de mes tutoriels sur l’utilisation de FPDF avec PHP, nous allons voir aujourd’hui comment générer un sommaire avec des liens dans un document PDF.

FPDF propose nativement des méthodes pour générer des liens internes dans un  document :

 

  • addlink() qui créé un lien et retourne son identifiant. Pour le moment, notre lien n’est qu’une ressource, il va maintenant falloir l’associer à un texte et ensuite préciser où ce lien doit pointer. Pour cela, il faut utiliser par exemple, la méthode cell() (qui permet d’écrire du texte) en lui passant en paramètre  l’identifiant du lien.

 

  • SetLink() va enfin nous permettre de préciser la destination du lien. Nous l’utiliserons sur la page où le lien doit pointer

 

Le mode de fonctionnement de FPDF nous impose de créer les page les unes après les autres. Une fois une page créé, il n’est pas possible de revenir dessus. Il devient donc évident que, dans le cadre d’un sommaire, nous allons d’abord devoir créer tous les liens (un par entrée de notre sommaire), puis, page par page, assigner la destination de ces liens.
La première étape va donc consister a créer un conteneur pour stocker tous nos liens. Nous allons donc ajouter un nouvel attribut, en l’occurrence un tableau, à notre classe FPDF :
class myfpdf extends fpdf {
    public $myLinks = array();
}

Au moment de générer notre sommaire, nous allons créer les liens et les ajouter, un par un à notre tableau. Voici un exemple de code à adapter à votre document :

<?php
...
//le numéro de la page
$numPage = 1;

//le titre de la page
$titrePage = 'première page';

//on créé un lien
$fpdi->myLinks[$numPage] = $fpdi->addLink();

// on écrit le nom de la page et on y associe le lien
$fpdi->cell(185,5,$titrePage,0,0,'L',$fpdi->myLinks[$numPage];

//on écrit le numéro de la page
$fpdi->cell(5,5,$numPage,0,2,'R',TRUE);

?>

Cette opération doit être renouvelée pour chaque ligne apparaissant dans notre sommaire, le plus simple est donc de boucler dessus.

Voilà, nous avons écrit notre sommaire, il va maintenant falloir associer les bonnes pages aux liens.
La solution basique serait de le faire manuellement dans notre code à chaque création de page.
Mais comme un bon développeur est un développeur feignant, nous allons plutôt réécrire la méthode addPage() de FPDF afin d’automatiser l’action et que cela se fasse tout seul par la suite dans notre document :

<?php
class myfpdf extends fpdf {
    public $myLinks = array();

    public function addPage() {
        //on génère la page en appelant la méthode 
        //parente addPage()
        parent::addPage();

        // si un lien existe pour ce numéro de page, 
        //on l'associe à la page
        $page = $this->pageNo();
        if (isset($this->myLinks[$page])) {
            $this->setLink($this->myLink[$page]);
        }
    }

}
?>

Voilà, à chaque nouvelle page, si un lien y est associé, il sera automatiquement ajouté.

 

Si vous souhaitez voir le résultat, vous pouvez aller consulter le catalogue de formations d’AlliaForm, en bas à gauche du menu.

 

Le document est entièrement généré en PHP avec FPDI ( la version que vous y verrez est un version statique en cache, je ne le génère qu’une seule fois lorsque des modifications y sont apportées).



Vers l’infini et au delà!

    21:25 14 11 2008

Mon fils est un grand fan de Toy Story et ce depuis qu’il a 1 an 1/2. Il en à maintenant 3 et 1/2, le calcul est vite fait, 2 ans de « vers l’infini et au delà! ».
A force de les voir et revoir, je pense que j’en connais toutes les répliques.
Toujours est il qu’en 2 ans, j’ai eu le temps de lui acheter quelques dérivés Disney que ce soit dans les boutiques officielles ou sur ebay étant donné que les produits deviennent rares en boutiques (ils vont bientôt revenir, Toy Story 3 est prévu pour 2010).

Donc ce soir, avec Adam, on a décidé de faire une photo de sa collection, et voilà le résultat. A noter qu’on s’est rendu compte, après coup, qu’il manquait son assiette Buzz l’éclair, ses verres Buzz l’éclair, ses DVDs, ses pyjamas Buzz l’éclair, etc…

buzz l\'éclair, toy story, woody, woody et buzz