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 :

Php me génère un PDF correct qu'à la 1ere page (fpdf lib)


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Pub
    Inscrit en
    Octobre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Pub
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2018
    Messages : 35
    Par défaut Php me génère un PDF correct qu'à la 1ere page (fpdf lib)
    Bonjour,

    Dans ma quête des absents et présents, j'ai pu arriver à générer une liste de joueurs complète via un formulaire qui envoie la liste en base de données.

    Je reprends maintenant un script trouvé sur https://www.webtolosa.com/2019/12/20/tutoriel-fpdf-php/ qui me génère un PDF, mais si j'ai plus d'une trentaine d'enregistrements, mon PDF déraille.
    A la première page, tout est ok, à partir de la 2e page, le script me génère le tableau mais chaque colonne est affichée sur une seule page.
    Exemple Page 1 :
    _________________
    |-----|--------|-------|
    |-----|--------|-------|
    |-----|--------|-------|
    |-----|--------|-------|

    En page 2, seule la première cellule de la ligne est affichée
    _____
    |-----|
    En page 3, la 2e cellule de la meme ligne est affichée
    En page 4, la 3e cellulle...
    En page 5, on reprend avec la même chose qu'en page 2.
    Etc..

    Pour 150 inscriptions, j'obtiens 368 pages.

    J'utilise la librairie fpdf.php trouvée dans le zip.
    Voici mon script :

    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
     
    // extraction des données à afficher dans le sous-titre 
    $requete = "SELECT * FROM `inscrits` WHERE categorie = 'S'";
    $result = mysqli_query($link, $requete);
    // tableau des résultats de la ligne > $data_voyageur['nom_champ']
    $data_inscrit = mysqli_fetch_array($result);
    mysqli_free_result($result);
    // Appel de la librairie FPDF
    require("fpdf/fpdf.php");
     
    // On active la classe une fois pour toutes les pages suivantes
    // Format portrait (>P) ou paysage (>L), en mm (ou en points > pts), A4 (ou A5, etc.)
    $pdf = new PDF('P','mm','A4');
     
    // Nouvelle page A4 (incluant ici logo, titre et pied de page)
    $pdf->AddPage();
    // Polices par défaut : Helvetica taille 9
    $pdf->SetFont('Helvetica','',9);
    // Couleur par défaut : noir
    $pdf->SetTextColor(0);
    // Compteur de pages {nb}
    $pdf->AliasNbPages();
     
    $titre = 'u6';
    // Sous-titre calées à gauche, texte gras (Bold), police de caractère 11
    $pdf->SetFont('Helvetica','B',11);
    // couleur de fond de la cellule : gris clair
    $pdf->setFillColor(230,230,230);
    // Cellule avec les données du sous-titre sur 2 lignes, pas de bordure mais couleur de fond grise
    //$pdf->Cell(70,6,$titre,0,1,'L',1);		
    $pdf->Cell(70,6,'DU '.$data_inscrit['date_entrainement'] . ' AU '.strtoupper(utf8_decode($data_inscrit['date_entrainement'])),0,1,'L',1);				
    $pdf->Ln(5); // saut de ligne 10mm	
     
     
     
    // Fonction en-tête des tableaux en 3 colonnes de largeurs variables
    function entete_table($position_entete) {
    	global $pdf;
    	$pdf->SetDrawColor(183); // Couleur du fond RVB
    	$pdf->SetFillColor(221); // Couleur des filets RVB
    	$pdf->SetTextColor(0); // Couleur du texte noir
    	$pdf->SetY($position_entete);
    	// position de colonne 1 (10mm à gauche)	
    	$pdf->SetX(10);
    	$pdf->Cell(60,8,'Nom',1,0,'C',1);	// 60 >largeur colonne, 8 >hauteur colonne
    	// position de la colonne 2 (70 = 10+60)
    	$pdf->SetX(70); 
    	$pdf->Cell(60,8,'Date naissance',1,0,'C',1);
    	// position de la colonne 3 (130 = 70+60)
    	$pdf->SetX(130); 
    	$pdf->Cell(30,8,'id',1,0,'C',1);
     
    	$pdf->Ln(); // Retour à la ligne
    }
    // AFFICHAGE EN-TÊTE DU TABLEAU
    // Position ordonnée de l'entête en valeur absolue par rapport au sommet de la page (60 mm)
    $position_entete = 50;
    // police des caractères
    $pdf->SetFont('Helvetica','',9);
    $pdf->SetTextColor(0);
    // on affiche les en-têtes du tableau
    entete_table($position_entete);
     
     
    $position_detail = 58; // Position ordonnée = $position_entete+hauteur de la cellule d'en-tête (60+8)
    $requete2 = "SELECT * FROM `inscrits` WHERE categorie = 'S'";
     
    $result2 = mysqli_query($link, $requete2);
    while ($data_visit = mysqli_fetch_array($result2)) {
    	// position abcisse de la colonne 1 (10mm du bord)
    	$pdf->SetY($position_detail);
    	$pdf->SetX(10);
    	$pdf->MultiCell(60,8,$data_visit['nom'],1,'C');
        // position abcisse de la colonne 2 (70 = 10 + 60)	
    	$pdf->SetY($position_detail);
    	$pdf->SetX(70); 
    	$pdf->MultiCell(60,8,utf8_decode($data_visit['date_naissance']),1,'C');
    	// position abcisse de la colonne 3 (130 = 70+ 60)
    	$pdf->SetY($position_detail);
    	$pdf->SetX(130); 
    	$pdf->MultiCell(30,8,$data_visit['id'],1,'C');
     
    	// on incrémente la position ordonnée de la ligne suivante (+8mm = hauteur des cellules)	
    	$position_detail += 8; 
    }
    mysqli_free_result($result2);
     
     
    // Nouvelle page PDF
    $pdf->AddPage();
    // Polices par défaut : Helvetica taille 9
    $pdf->SetFont('Helvetica','',11);
    // Couleur par défaut : noir
    $pdf->SetTextColor(0);
    // Compteur de pages {nb}
    $pdf->AliasNbPages();
    $pdf->Cell(500,20,utf8_decode('Plus rien à vous dire ;-)'));
     
     
    $pdf->Output('test.pdf','I'); // affichage à l'écran
    // Ou export sur le serveur
    // $pdf->Output('F', '../test.pdf');
    D'où peut venir ce problème ?
    J'ai essayé avec le script d'origine (et le sql importé dans ma base), c'est la même chose.
    J'avais trouvé un autre script mais celui-là me donnait toutes les colonnes de la même largeur, ici, on peut facilement gérer les largeurs de colonnes.

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 672
    Par défaut
    essayez avec cela dans la boucle "while" :

    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
    while ($data_visit = mysqli_fetch_array($result2)) {
     
    	$y_debut_ligne = $pdf->GetY();
     
    	if ($y_debut_ligne > $pdf->GetPageHeight() - $position_entete) {
     
    		$pdf->AddPage();
     
    		entete_table($position_entete);
     
    		$y_debut_ligne = $pdf->GetY();
     
    	}
     
    	// position abcisse de la colonne 1 (10mm du bord)
    	$pdf->SetY($y_debut_ligne);
    	$pdf->SetX(10);
    	$pdf->MultiCell(60,8,$data_visit['nom'],1,'C');
     
        // position abcisse de la colonne 2 (70 = 10 + 60)	
    	$pdf->SetY($y_debut_ligne);
    	$pdf->SetX(70); 
    	$pdf->MultiCell(60,8,utf8_decode($data_visit['date_naissance']),1,'C');
     
    	// position abcisse de la colonne 3 (130 = 70+ 60)
    	$pdf->SetY($y_debut_ligne);
    	$pdf->SetX(130); 
    	$pdf->MultiCell(30,8,$data_visit['id'],1,'C');
     
     
    }
    j'ai vu dans le code que vous faite 2 fois la même requete sql et je pense que vous pouvez optimiser cela en mettant le résultat de la requête dans un tableau php. ensuite vous affichez le titre à partir de la 1re ligne du tableau et après vous parcourez le tableau php pour afficher les résultats.

  3. #3
    Membre averti
    Homme Profil pro
    Pub
    Inscrit en
    Octobre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Pub
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2018
    Messages : 35
    Par défaut
    Merci Mathieu, cela fonctionne, et encore mieux, je récupère l'entête du tableau sur chaque page.

    Pour la double requête, oui, c'est juste, je n'ai pas encore nettoyé le code, je l'ai repris directement depuis le site mentionné et les données étaient disponibles sur deux tables distinctes.
    Ce sera fait d'ici la mise en prod du script.

    J'avais encore une question que j'ai oubliée dans mon post :

    Ces tableaux reprennent des enregistrements qui sont étalés sur plusieurs jours calendrier, j'organise maintenant la requête avec un ORDER BY date_entrainement.
    Est-il possible de créer un nouveau tableau à chaque fois que la date change (même page si possible) ?
    J'avais créé un script php il y a plus de 10 ans qui me générait un tableau (html et php) à chaque changement de date, mais avec cette librairie, je n'y arrive pas. Je pense ajouter une condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (--la date change--) {
         $pdf->Ln();
         entete_table($position_entete);
         }
    pour créer un nouveau tableau avec entête mais c'est la condition que je n'arrive plus à recréer.

  4. #4
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 672
    Par défaut
    je pense que vous pouvez faire cela en gardant la date précédente comme cela :
    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
     
    $date_precendente = "";
     
    while ($data_visit = mysqli_fetch_array($result2)) {
     
    	if ($data_visit['date_naissance'] !== $date_precendente) {
     
    		// créer une nouvelle page ici
     
    		$date_precendente = $data_visit['date_naissance'];
     
    	}
     
     
    	// suite du tableau ici
     
     
     
    }

  5. #5
    Membre averti
    Homme Profil pro
    Pub
    Inscrit en
    Octobre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Pub
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2018
    Messages : 35
    Par défaut
    Merci, j'ai quelque peu modifié et j'obtiens ce que je voulais, juste que le PDF présente un entête de tableau vide puis une nouvelle page avec le premier tableau complet si je ne sélectionne pas la bonne date (s'il n'y a pas d'entrainements à la date donnée) mais j'ai mis un avertissement

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

Discussions similaires

  1. En php recherche dans un pdf et extraction de la page
    Par Europroc dans le forum Langage
    Réponses: 1
    Dernier message: 17/10/2016, 11h13
  2. Passer de PHP a Word ou PDF
    Par guillaumeIOB dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 06/09/2006, 11h26
  3. [FPDF] PHP et créer, écrire pdf
    Par Dargos dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 12/06/2006, 13h53
  4. PHP, C++ et fichier PDF.
    Par Kaktus dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 27/10/2005, 15h28

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