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

PHP & Base de données Discussion :

FPDF saut de page dans un array


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité de passage Avatar de Matford V8
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2025
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2025
    Messages : 5
    Par défaut FPDF saut de page dans un array
    Bonjour à tous,

    j'ai lu les tutos FPDF, les post ici, dont un qui m'a permis de tester :
    $pdf = new PDF();
    $pdf->SetAutoPageBreak(true, 20); // Gestion automatique des sauts de page avec une marge de 20mm
    $pdf->AddPage() ;
    ...sans que cela marche pour moi

    1 - en Php, j'alimente un array avec des coordonnées de membres (nom, num. d'adhérent, adresse...)
    2 - cet array est ensuite lu séquentiellement pour en composer un PDF de 10 cartes par page, sur 2 colonnes
    3 - la lecture de chaque enregistrement et son emplacement sur la page 1 sont au point
    4 - en revanche, dès la 2ème page, il y a un (léger) décalage que je n'arrive pas à résoudre... le saut de page ne marche donc pas
    J'ai même essayé de le compenser en rajoutant des cellules vides, sans succès (et en plus c'est un peu goret )

    Dans le programme d'édition du PDF, directement adapté des tutos FPDF, j'ai (extraits) :
    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
    108
    109
    110
    111
     
    <?php
    require('fpdf186/fcartepdf.php');
     
    [...]
     
           for($m=1; $m <= $nb_carte; $m++) {
     
                    $carte_encours = $m ;         //   Ne donnera une valeur ENTIERE = PAGE_Numéro que toutes les 10 cartes
                    $carte_max = $page_numero*10 ;       //   Rupteur de la Carte pour changer Page
     
                if ($colonne > 3) {          //   Limitation à 4 colonnes
                     $colonne = 0 ;           //   Réinitialisation du numéro de Colonne
                     $pilier = 1  ;             //   Deuxième colonne d'une Carte
                     $ligne += 1  ;            //   Réajustement du rang de la ligne à écrire, calé sur la première information (Prénom - Nom)
                     $ligne_reference = $ligne  ;      //  mise à jour de la référence pour le Prénom - Nom
                }
                else {
                     $pilier = $colonne+1  ;
                     $ligne = $ligne_reference ;             //  Remise à niveau par rapport à la colonne précédente
                }
    [...]
                $une_carte = mysqli_fetch_row($result_y) ;
                $id_club = $une_carte[1]  ;
                if ($id_club < 10) {          $id_club = "0000"  ;          }
                elseif ($id_club < 1000) {          $id_club = "0".$id_club  ;          }
                $prenom = stripslashes($une_carte[2])  ;
                $prenom = mb_convert_encoding($prenom, 'ISO-8859-1', 'UTF-8') ;     //    Conversion des caractères stockés en Record > caractères accentués en PDF
                $nom = stripslashes($une_carte[3])  ;
                $nom = mb_convert_encoding($nom, 'ISO-8859-1', 'UTF-8') ;     //    Conversion des caractères stockés en Record > caractères accentués en PDF
                $personnage = $prenom." ".$nom ;
     
                $cellule[$ligne][$colonne] = "Année 2026" ;
                $cellule[$ligne][$pilier] = $personnage ;
                $adresse_1 = stripslashes($une_carte[12])  ;
                $adresse_1 = mb_convert_encoding($adresse_1, 'ISO-8859-1', 'UTF-8') ;     //    Conversion des caractères stockés en Record > caractères accentués en PDF
                $ligne += 1  ;
                $cellule[$ligne][$colonne] = "Adhérent" ;
                $cellule[$ligne][$pilier] = $adresse_1 ;
                $adresse_2 = stripslashes($une_carte[13])  ;
                if (strlen($adresse_2 > 2)) {
                    $adresse_2 = mb_convert_encoding($adresse_2, 'ISO-8859-1', 'UTF-8') ;     //    Conversion des caractères stockés en Record > caractères accentués en PDF
                    $ligne += 1  ;
                    $cellule[$ligne][$colonne] = $id_club ;
                    $cellule[$ligne][$pilier] = $adresse_2 ;
                }
     
    [idem pour les autres champs]
     
                    $colonne += 2 ;      //  En fin de Carte car on commence à la colonne ZERO
                    $pilier = $colonne+1  ;
                }
            }     //   Fin LOOP sur chaque CARTE
     
       class PDF extends FPDF  {
     
       // Table
       function VoidTable($cellule)  {
           $w = array(25,70,25,70) ;          //   2 x 105 à l'origine
           // Colors, line width and font
           $this->SetFillColor(255,255,255) ;
           $this->SetTextColor(0) ;
           $this->SetDrawColor(255,255,255);
           $this->SetLineWidth(0.05);         //  0.2 à l'origine
           $this->SetFont('') ;
     
           if (count($cellule) > 0) {           //   Il y a AU MOINS 1 enregistrement trouvé ==> Ecriture d'au moins 1 LIGNE
     
              $fill = false ;
    //          for($i=1; $i <= count($cellule); $i++) {
              foreach($cellule as $case) {
               //   4 colonnes par ligne (2 Cartes ayant 2 colonnes)
               //   1er Pilier de la page
               if(substr($case[0],0,3) == "Ann") {
                   //   si correspond à "Année XXXX", écriture en purple mauve + Prénom-Nom en Bold taille 11
                   $this->SetFont('Arial','B',12);
                   $this->SetTextColor(192,0,192) ;
    		           $this->Cell($w[0],5,$case[0],'LR',0,'C',$fill);
                   $this->SetFont('Arial','B',11);
                }
                elseif($case[0] == "Adhérent") {
                   //   si "Adhérent", écriture en rouge sang de boeuf + écriture standard
                   $this->SetFont('Arial','B',10);
                   $this->SetTextColor(128,0,36) ;
    		           $this->Cell($w[0],5,$case[0],'LR',0,'C',$fill);
                   $this->SetFont('Arial','',9);
                }
                else {
                   //   sinon, écriture de l'ID-Club en bleu de France + écriture standard
                   $this->SetFont('Arial','B',14);
                   $this->SetTextColor(36,64,128) ;
    		           $this->Cell($w[0],5,$case[0],'LR',0,'C',$fill);
                   $this->SetFont('Arial','',9);
                }
                $this->SetTextColor(0,0,0) ;
                $this->Cell($w[1],5,$case[1],'LR',0,'C',$fill);
     
    [...]
     
     
           }        //   Fin de IF COUNT($cellule) > 0
        }           //   Fin Function VoidTable
        }            //  Fin CLASS
     
       $pdf = new PDF();
       $pdf->SetAutoPageBreak(true, 20);   // Gestion automatique des sauts de page avec une marge de 20mm
       $pdf->SetFont('Arial','',10) ;
       $pdf->AddPage() ;
       $pdf->VoidTable($cellule) ;
       $pdf->AliasNbPages() ;
       $pdf->Output() ;
    Et dans le fichier FCARTEPDF, bien appelé, j'ai (extraits) :
    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
     
       // Automatic page break
      //  $this->SetAutoPageBreak(true,$margin);
      $this->SetAutoPageBreak(true,$margin*2);
     
    function SetAutoPageBreak($auto, $margin)
    {
     
    function SetTopMargin($margin)
    {
    	// Set top margin
      //  Marge TOP = 3,5cm
    	$this->tMargin = $margin*3.5 ;
    }
     
    	// Set auto page break mode and triggering margin
    	$this->AutoPageBreak = $auto;
    	$this->bMargin = $margin*1.5 ;
      //  Déclenchement = Hauteur de la Page-Marge Bottom (1,5cm)
    	$this->PageBreakTrigger = $this->h-$margin*1.5 ;
    }
    $k = 72/25.4, comme il est normal en A4 Portrait, donc $margin = 1cm

    J'avoue ne rien comprendre à pourquoi le saut de page ne repositionne pas correctement la suite des enregistrements...
    Tout avis bienvenu.

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 690
    Par défaut
    je ne comprend pas ce que vous voulez avoir comme résultat.
    pouvez vous mettre un exemple de fichier pdf que vous avez actuellement ?

  3. #3
    Invité de passage Avatar de Matford V8
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2025
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2025
    Messages : 5
    Par défaut
    Merci pour votre retour rapide.
    Voici le tirage de la page 1, correctement mis en page.
    Par les rectangles vides, j'y simule les futures images JPG (en-têtes de cartes), mais c'est un autre problème !

    Nom : 20250826_pdf_page1.jpg
Affichages : 30
Taille : 90,8 Ko

    Et ici, le décalage visible, quelques pages plus loin. Normalement, avec un bon saut de page, chaque page devrait redémarrer pile-poil...

    Nom : 20250826_pdf_pages4-5.jpg
Affichages : 25
Taille : 38,0 Ko

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 690
    Par défaut
    s'il y a toujours 5 lignes de cartes par page, j'aurai plutot fait une boucle qui crée une nouvelle page toutes les 5 lignes.
    et comme ça vous n'avez pas besoin d'utiliser le saut de page automatique.

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 690
    Par défaut
    je viens de voir que sur la 3e ligne de votre exemple, il y a une adresse qui est sur 4 lignes au lieu de 3. peut-être que le décalage vient de ça ?

    autre chose, il y a une bibliothèque basée sur fpdf qui prend en charge l'UTF-8 directement là :
    https://fpdf.org/fr/script/script92.php

  6. #6
    Invité de passage Avatar de Matford V8
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2025
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2025
    Messages : 5
    Par défaut
    Citation Envoyé par mathieu Voir le message
    je viens de voir que sur la 3e ligne de votre exemple, il y a une adresse qui est sur 4 lignes au lieu de 3. peut-être que le décalage vient de ça ?

    autre chose, il y a une bibliothèque basée sur fpdf qui prend en charge l'UTF-8 directement là :
    https://fpdf.org/fr/script/script92.php
    L'adresse sur 4 lignes est normale, elles sont toutes sur 4 lignes (avec une ligne vide s'il n'y a pas de complément d'adresse).
    Il fallait bien que je le gère proprement pour que les cartes soient alignées.

  7. #7
    Invité de passage Avatar de Matford V8
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2025
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2025
    Messages : 5
    Par défaut
    Citation Envoyé par mathieu Voir le message
    s'il y a toujours 5 lignes de cartes par page, j'aurai plutot fait une boucle qui crée une nouvelle page toutes les 5 lignes.
    et comme ça vous n'avez pas besoin d'utiliser le saut de page automatique.
    Ok, bonne idée.
    Je teste évidemment sans problème la rupture toutes les 10 cartes.
    Comment créez-vous la nouvelle page toutes les 5 lignes de cartes ? Pouvez-vous me mettre une exemple de code, même théorique ?
    Quelle que soit la solution, si elle est propre, je serai ravi !

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 690
    Par défaut
    j'étais parti pour faire un petit exemple et j'ai fini par refaire le plus gros en utilisant tFPDF

    le code complet est téléchargeable là :
    https://drop.infini.fr/r/0R88Trb3y8#...rjK7YRG6LTEIM=

    puisque le forum refuse l'archive en pièce jointe, je mets à la suite le code du script principal :
    Code php : 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
     
    $donnees = donnees();
     
     
    $pdf = new CartesPdf();
     
    $pdf->marges_cotes = 10;
    $pdf->marge_haut = $pdf->marges_cotes;
    $pdf->marge_milieu = $pdf->marges_cotes;
     
    $pdf->largeur_carte = ($pdf->GetPageWidth() - 2 * $pdf->marges_cotes - $pdf->marge_milieu) / 2;
    $pdf->hauteur_carte = ($pdf->GetPageHeight() - 2 * $pdf->marge_haut) / 5;
     
    $pdf->hauteur_image = 25;
     
    $pdf->taille_annee = 10;
    $pdf->taille_adherent = 8;
    $pdf->taille_numero = 14;
    $pdf->taille_nom = 8;
    $pdf->taille_adresse = 7;
     
     
     
    $pdf->SetDisplayMode("real", "continuous");
    $pdf->SetAutoPageBreak(FALSE);
     
    $pdf->SetMargins($pdf->marges_cotes, $pdf->marge_haut);
     
    $pdf->AddFont("DejaVuSans", "", "DejaVuSans.ttf", TRUE);
    $pdf->AddFont("DejaVuSans", "B", "DejaVuSans-Bold.ttf", TRUE);
    $pdf->SetFont("DejaVuSans");
     
     
    // boucle de construction des cartes
     
    foreach ($donnees as $index => $d) {
     
    	$position_sur_page = $index % 10;
     
    	if (0 === $position_sur_page) {
    		$pdf->AddPage();
    	}
     
    	$colonne = $index % 2;
    	$ligne = floor($position_sur_page / 2);
     
     
    	$pdf->carte(
    		  $d
    		, $pdf->marges_cotes + $colonne * ($pdf->largeur_carte + $pdf->marge_milieu)
    		, $pdf->marge_haut + $ligne * $pdf->hauteur_carte
    	);
     
    }
     
     
     
    // génération du fichier
     
    $fichier = __DIR__ . "/résultat.pdf";
     
     
    $pdf->Output($fichier, "F");

Discussions similaires

  1. [FPDF] Empecher saut de page dans cell
    Par poti67 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 02/03/2010, 11h57
  2. [VB6]supprimer un saut de page dans Word
    Par Yal17 dans le forum VB 6 et antérieur
    Réponses: 25
    Dernier message: 14/06/2006, 12h21
  3. VBA : Insertion d'un saut de page dans WORD
    Par Actarus69 dans le forum VBA Word
    Réponses: 1
    Dernier message: 25/04/2006, 13h05
  4. Réponses: 12
    Dernier message: 06/01/2006, 07h44
  5. Saut de page dans un état
    Par rangernoir dans le forum Access
    Réponses: 1
    Dernier message: 19/09/2005, 09h35

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