IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[FPDF] Liens internes pour table des matières / sommaire


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 9
    Points : 5
    Points
    5
    Par défaut [FPDF] Liens internes pour table des matières / sommaire
    Bonjour,

    Je recherche de l'aide pour mettre des liens internes dans le sommaire d'un pdf qui redirigent vers la page concernée.

    J'ai fais quelques recherches sur l'utilisation de addLink() et setLink() liés à fpdf mais je n'arrive pas à appliquer le concept à mon code qui diffère un peu des exemples que j'ai trouvé.

    Mon code génère des pages à l'aide de fonctions dans lesquelles j'appelle les fonctions de fpdf. Ces fonctions sont définies dans la classe, alors que l'exemple que j'ai qui vient du tutoriel de fpdf.org ne procède pas de la même façon est c'est ce qui me dérange.

    Le tuto de fpdf.org :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    <?php
    require('fpdf.php');
     
    class PDF extends FPDF
    {
        protected $B = 0;
        protected $I = 0;
        protected $U = 0;
        protected $HREF = '';
     
        function WriteHTML($html)
        {
            // Parseur HTML
            $html = str_replace("\n", ' ', $html);
            $a = preg_split('/<(.*)>/U', $html, -1, PREG_SPLIT_DELIM_CAPTURE);
            foreach ($a as $i => $e) {
                if ($i % 2 == 0) {
                    // Texte
                    if ($this->HREF)
                        $this->PutLink($this->HREF, $e);
                    else
                        $this->Write(5, $e);
                } else {
                    // Balise
                    if ($e[0] == '/')
                        $this->CloseTag(strtoupper(substr($e, 1)));
                    else {
                        // Extraction des attributs
                        $a2 = explode(' ', $e);
                        $tag = strtoupper(array_shift($a2));
                        $attr = array();
                        foreach ($a2 as $v) {
                            if (preg_match('/([^=]*)=["\']?([^"\']*)/', $v, $a3))
                                $attr[strtoupper($a3[1])] = $a3[2];
                        }
                        $this->OpenTag($tag, $attr);
                    }
                }
            }
        }
     
        function OpenTag($tag, $attr)
        {
            // Balise ouvrante
            if ($tag == 'B' || $tag == 'I' || $tag == 'U')
                $this->SetStyle($tag, true);
            if ($tag == 'A')
                $this->HREF = $attr['HREF'];
            if ($tag == 'BR')
                $this->Ln(5);
        }
     
        function CloseTag($tag)
        {
            // Balise fermante
            if ($tag == 'B' || $tag == 'I' || $tag == 'U')
                $this->SetStyle($tag, false);
            if ($tag == 'A')
                $this->HREF = '';
        }
     
        function SetStyle($tag, $enable)
        {
            // Modifie le style et sélectionne la police correspondante
            $this->$tag += ($enable ? 1 : -1);
            $style = '';
            foreach (array('B', 'I', 'U') as $s) {
                if ($this->$s > 0)
                    $style .= $s;
            }
            $this->SetFont('', $style);
        }
     
        function PutLink($URL, $txt)
        {
            // Place un hyperlien
            $this->SetTextColor(0, 0, 255);
            $this->SetStyle('U', true);
            $this->Write(5, $txt, $URL);
            $this->SetStyle('U', false);
            $this->SetTextColor(0);
        }
    }
     
    $html = 'Vous pouvez maintenant imprimer facilement du texte mélangeant différents styles : <b>gras</b>,
    <i>italique</i>, <u>souligné</u>, ou <b><i><u>tous à la fois</u></i></b> !<br><br>Vous pouvez aussi
    insérer des liens sous forme textuelle, comme <a href="http://www.fpdf.org">www.fpdf.org</a>, ou bien
    sous forme d\'image : cliquez sur le logo.';
     
    $pdf = new PDF();
    // Première page
    $pdf->AddPage();
    $pdf->SetFont('Arial', '', 20);
    $pdf->Write(5, 'Pour découvrir les nouveautés de ce tutoriel, cliquez ');
    $pdf->SetFont('', 'U');
    $link = $pdf->AddLink();
    $pdf->Write(5, 'ici', $link);
    $pdf->SetFont('');
    // Seconde page
    $pdf->AddPage();
    $pdf->SetLink($link);
    $pdf->Image('logo.png', 10, 12, 30, 0, '', 'http://www.fpdf.org');
    $pdf->SetLeftMargin(45);
    $pdf->SetFontSize(14);
    $pdf->WriteHTML($html);
    $pdf->Output();
    Dans ce tuto on définit tpout ce dont on a besoin dans la classe et au moment de générer le pdf on appelle les fonctions via une variable en dehors de la classe qui hérite de fpdf.


    Voil à un bout de mon code qui permet de voir comment il est construit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    class PDFRapportV2 extends Pdf {
     
        const FONT_FAMILY = 'Arial';
     
    	public function __construct(Config $config, QualiteAir $qualiteAir) {
     
    		parent::__construct('P', 'mm', 'A4');
     
            $this->AddFont('Calibri');
            $this->AddFont('Calibri', 'B');
            $this->AddFont('Calibri', 'I');
     
            $this->config = $config;
            $this->qualiteAir = $qualiteAir;
     
            $this->page1();
            $this->pageSommaire();
            $this->page2();
            $this->page3();
            $this->page4();
     
    	}
     public function page1() {
     
            $this->AddPage(); 
     
            $batiment = $this->qualiteAir->getBatiment();
            $equipement = $batiment->getEquipement();
            $ville = $equipement->getVille();
     
            $createur = $this->qualiteAir->getCreateur();
            $visiteurOuvrant = $this->qualiteAir->getVisiteurOuvrant();
            $visiteurVentilation = $this->qualiteAir->getVisiteurVentilation();
     
            $this->jump(15);
            $this->bigtitlecentered("Surveillance de la qualité")->jump();
            $this->bigsubtitlecentered("Rapport d'évaluation des moyens")->jump();
    }
        public function pageSommaire() {
     
            $this->AddPage(); 
     
            $this->title("Sommaire")->eol()->jump();
     
            $this->indent(10)->lines("Titre 1")->jump();
            $this->indent(20)->lines("Titre 2");
            $this->jump();
            $this->indent(20)->lines("Titre 2");
            $this->jump();
            $this->indent(20)->lines("Titre 2")->jump();
            $this->indent(20)->lines("Titre 2")->jump();
     
            $this->indent(10)->lines("Titre1")->jump();
            $this->indent(20)->lines("Titre 2")->jump();
     
     
        }
    }
    Pouvez vous m'aider à mettre des liens internes dans mon code ?

  2. #2
    Membre actif
    Inscrit en
    Août 2006
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 191
    Points : 263
    Points
    263
    Par défaut
    Salut,

    Regarde ici, je pense qu'il fait ce que tu veux :http://www.romainbourdon.com/index.p...tilisant-fpdf/

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Showie Voir le message
    Salut,

    Regarde ici, je pense qu'il fait ce que tu veux :http://www.romainbourdon.com/index.p...tilisant-fpdf/
    Bonjour Showie,

    Merci de ton attention.
    J'ai parcouru le code de Romain Bourdon déjà. Mais ce dernier n'explicite pas assez et lorsque l'on prend son code, une variable $fpdi est non définie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $numPage = 1 ;
            $titrePage = 'première page'; 
            $fpdi->myLinks[$numPage] = $fpdi->addLink(); 
            $fpdi->cell(185,5,$titrePage,0,0,'L',$fpdi->myLinks[$numPage]);
            $fpdi->cell(5,5,$numPage,0,2,'R',TRUE);
    Monsieur Bourdon fait un peu de rétention d'infos je pense car son blog a pour vocation de promouvoir son organisme de formation.

    Je suis persuadé que mettre des liens dans un rapport via fpdf ne doit pas être difficile mais vu que c'est la première fois je bloque.

  4. #4
    Membre actif
    Inscrit en
    Août 2006
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 191
    Points : 263
    Points
    263
    Par défaut
    Pour le $fpdi,

    c'est le chargement de cette librairie https://www.setasign.com/products/fpdi/downloads/ (Pour information c'est une librairie opensource très utile pour importer des pdfs en entier ou partiellement)

    en gros, son $fpdi est juste l'instance de la classe fpdf étendu avec les capacités d'import de la librairie si dessus.

    Si tu fait son code fonctionnera.

    Sinon tu bloques à quel niveau là ? tu obtient un pdf ou la génération plante ?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Non j'ai une erreur : exception 'Exception' with message 'FPDF error: No font has been set' in C:\wamp64\www\b_lab2\gip\FPDF\fpdf.php:271

    Mon pdf se génère si je rédige un sommaire en dur, par contre c'est le code pour les liens qui fait planter le document.

  6. #6
    Membre actif
    Inscrit en
    Août 2006
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 191
    Points : 263
    Points
    263
    Par défaut
    L'erreur de font viens de la tentative d écriture sans avoir défini aucune font soit à l instanciation de FPDF soit avant d écrire avec la fonction SetFont.


    Bon j'ai bidouillé un exemple avec les deux ressources tutoriel fpdf et l exemple de romain bourdon.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    <?php
    require('fpdf.php');
     
    class PDF extends FPDF
    {
        protected $B = 0;
        protected $I = 0;
        protected $U = 0;
        protected $HREF = '';
     
    	public $myLinks = array();
     
        public function AddPage($orientation = '', $size = '', $rotation = 0) {
            //on génère la page en appelant la méthode 
            //parente addPage()
            parent::AddPage($orientation, $size, $rotation);
     
            // si un lien existe pour ce numéro de page, 
            //on l'associe à la page
            $page = $this->pageNo();
            if (!empty($this->myLinks[$page])) {
                $this->SetLink($this->myLinks[$page]);
            }
        }
     
        function WriteHTML($html)
        {
            // Parseur HTML
            $html = str_replace("\n", ' ', $html);
            $a = preg_split('/<(.*)>/U', $html, -1, PREG_SPLIT_DELIM_CAPTURE);
            foreach ($a as $i => $e) {
                if ($i % 2 == 0) {
                    // Texte
                    if ($this->HREF)
                        $this->PutLink($this->HREF, $e);
                    else
                        $this->Write(5, $e);
                } else {
                    // Balise
                    if ($e[0] == '/')
                        $this->CloseTag(strtoupper(substr($e, 1)));
                    else {
                        // Extraction des attributs
                        $a2 = explode(' ', $e);
                        $tag = strtoupper(array_shift($a2));
                        $attr = array();
                        foreach ($a2 as $v) {
                            if (preg_match('/([^=]*)=["\']?([^"\']*)/', $v, $a3))
                                $attr[strtoupper($a3[1])] = $a3[2];
                        }
                        $this->OpenTag($tag, $attr);
                    }
                }
            }
        }
     
        function OpenTag($tag, $attr)
        {
            // Balise ouvrante
            if ($tag == 'B' || $tag == 'I' || $tag == 'U')
                $this->SetStyle($tag, true);
            if ($tag == 'A')
                $this->HREF = $attr['HREF'];
            if ($tag == 'BR')
                $this->Ln(5);
        }
     
        function CloseTag($tag)
        {
            // Balise fermante
            if ($tag == 'B' || $tag == 'I' || $tag == 'U')
                $this->SetStyle($tag, false);
            if ($tag == 'A')
                $this->HREF = '';
        }
     
        function SetStyle($tag, $enable)
        {
            // Modifie le style et sélectionne la police correspondante
            $this->$tag += ($enable ? 1 : -1);
            $style = '';
            foreach (array('B', 'I', 'U') as $s) {
                if ($this->$s > 0)
                    $style .= $s;
            }
            $this->SetFont('', $style);
        }
     
        function PutLink($URL, $txt)
        {
            // Place un hyperlien
            $this->SetTextColor(0, 0, 255);
            $this->SetStyle('U', true);
            $this->Write(5, $txt, $URL);
            $this->SetStyle('U', false);
            $this->SetTextColor(0);
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    <?php
    require_once('pdf.php');
    $html = 'Vous pouvez maintenant imprimer facilement du texte mélangeant différents styles : <b>gras</b>,
    <i>italique</i>, <u>souligné</u>, ou <b><i><u>tous à la fois</u></i></b> !<br><br>Vous pouvez aussi
    insérer des liens sous forme textuelle, comme <a href="www.google.fr">www.fpdf.org</a>, ou bien
    sous forme d\'image : cliquez sur le logo.';
     
    $pdf = new PDF();
     
    // DEBUT DU SOMMAIRE
    $lien_sommaire = $pdf->AddLink(); 
    $pdf->myLinks[1] = $lien_sommaire;
     
    $pdf->AddPage();
    $pdf->SetFont('Arial', '', 20);
    $pdf->SetTextColor(0,0,255);
     
    //le numéro de la page
    $numPage = 2;
    //le titre de la page
    $titrePage = 'première page';
    //on créé un lien
    $lien = $pdf->AddLink(); 
    $pdf->myLinks[$numPage] = $lien;
    // on écrit le nom de la page et on y associe le lien
    $pdf->cell(185,15,$titrePage,0,0,'L', FALSE, $lien);
    //on écrit le numéro de la page
    $pdf->cell(5,15,$numPage,0,1,'R', FALSE, $lien);
     
     
    $numPage = 3;
    $titrePage = 'Seconde page';
    $lien = $pdf->AddLink(); 
    $pdf->myLinks[$numPage] = $lien;
    $pdf->cell(185,15,$titrePage,0,0,'L',FALSE, $lien);
    $pdf->cell(5,15,$numPage,0,1,'R', FALSE, $lien);
     
     
     
    $numPage = 4;
    $titrePage = 'dernière page';
    $lien = $pdf->AddLink(); 
    $pdf->myLinks[$numPage] = $lien;
    $pdf->cell(185,15,$titrePage,0,0,'L',FALSE, $lien);
    $pdf->cell(5,15,$numPage,0,1,'R', FALSE, $lien);
     
    // FIN DU SOMMAIRE
     
     
     
     
     
     
    // Première page
    $pdf->AddPage();
    $pdf->SetFont('Arial', '', 20);
    $pdf->Write(5, 'retour_sommaire', $lien_sommaire);$pdf->ln(10);
    $pdf->Write(5, 'Pour découvrir les nouveautés de ce tutoriel, cliquez ');
    $pdf->SetFont('', 'U');
    $link = $pdf->AddLink();
    $pdf->Write(5, 'ici', $link);
    $pdf->SetFont('');
     
     
    // Seconde page
    $pdf->AddPage();
    $pdf->Write(5, 'retour_sommaire', $lien_sommaire);$pdf->ln(10);
    $pdf->SetLink($link);
    $pdf->SetLeftMargin(45);
    $pdf->SetFontSize(14);
    $pdf->WriteHTML($html);
     
     
     
    // Dernière page
    $pdf->AddPage();
    $pdf->Write(5, 'retour_sommaire', $lien_sommaire);$pdf->ln(10);
    $pdf->SetFont('Arial', '', 20);
    $pdf->Write(5, 'une page basique ');
     
    $pdf->Output(); 
    ?>
    c'est ce que tu souhaites ?

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup pour le code que tu as posté.

    Mais, l'architecture de mon document est trop différente pour raisonner de cette façon.

    Je retenterai d'adapter ça à mon code mais j'ai des doutes au sujet de la faisabilité.

  8. #8
    Membre actif
    Inscrit en
    Août 2006
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 191
    Points : 263
    Points
    263
    Par défaut
    Si tu as des problèmes d adaptation ou si tu souhaites des conseils structurels n'hésite pas a poster la structure de ton document.

    bon courage à toi.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD-MAC 2011] Perte des liens de la Table des Matières avec un PDF
    Par Mister Paul dans le forum Word
    Réponses: 2
    Dernier message: 27/03/2014, 12h23
  2. Sommaire et table des matières
    Par Pharmacos dans le forum Mise en forme
    Réponses: 6
    Dernier message: 05/08/2008, 14h29
  3. [iText]Table des matières en RTF pour word
    Par LamuZArenE dans le forum Documents
    Réponses: 1
    Dernier message: 15/04/2008, 10h07
  4. Réponses: 1
    Dernier message: 12/12/2007, 19h52
  5. Table des matières contenant des hyper-liens
    Par shawty dans le forum Mise en forme
    Réponses: 4
    Dernier message: 30/08/2007, 12h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo