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] Écrire dans la seconde colonne du PDF


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut [FPDF] Écrire dans la seconde colonne du PDF
    Bonjour tout le monde,

    J'essaie d'utiliser le tutoriel 4 du site fpdf.org (multi colonne).

    J'ai donc la classe :

    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
    <?php
    session_start();
    require('../fpdf.php');
     
    mysql_connect('localhost','root','mdp');
    mysql_select_db('pharma');
     
    class PDF extends FPDF
    {
    	//Colonne courante
    	var $col=0;
    	//Ordonnée du début des colonnes
    	var $y0;
     
    	function Header()
    	{
    		//En-tête
    		global $titre;
     
    		$this->SetFont('Arial','B',15);
    		$w=$this->GetStringWidth($titre)+6;
    		$this->SetX((210-$w)/2);
    		$this->SetDrawColor(0,80,180);
    		$this->SetFillColor(230,230,0);
    		$this->SetTextColor(220,50,50);
    		$this->SetLineWidth(1);
    		$this->Cell($w,9,$titre,1,1,'C',true);
    		$this->Ln(10);
    		//Sauvegarde de l'ordonnée
    		$this->y0=$this->GetY();
    	}
     
    	function Footer()
    	{
    		//Pied de page
    		$this->SetY(-15);
    		$this->SetFont('Arial','I',8);
    		$this->SetTextColor(128);
    		$this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
    	}
     
    	function SetCol($col)
    	{
    		//Positionnement sur une colonne
    		$this->col=$col;
    		$x=10+$col*65;
    		$this->SetLeftMargin($x);
    		$this->SetX($x);
    	}
     
    	function AcceptPageBreak()
    	{
    		//Méthode autorisant ou non le saut de page automatique
    		if($this->col<2)
    		{
    			//Passage à la colonne suivante
    			$this->SetCol($this->col+1);
    			//Ordonnée en haut
    			$this->SetY($this->y0);
    			//On reste sur la page
    			return false;
    		}
    		else
    		{
    			//Retour en première colonne
    			$this->SetCol(0);
    			//Saut de page
    			return true;
    		}
    	}
     
    	function TitreChapitre($num,$lib)
    	{
    		//Titre
    		$this->SetFont('Arial','',12);
    		$this->SetFillColor(200,220,255);
    		$this->Cell(0,6,"Chapitre $num : $lib",0,1,'L',true);
    		$this->Ln(4);
    		//Sauvegarde de l'ordonnée
    		$this->y0=$this->GetY();
    	}
     
    	function CorpsChapitre($texte)
    	{
    		//Lecture de la donnée transmise (venant de la requête)
    		$txt = $texte;
    		//Police
    		$this->SetFont('Times','',12);
    		//Sortie du texte sur 6 cm de largeur
    		$this->MultiCell(60,5,$txt);
    		$this->Ln();
    		//Mention
    		$this->SetFont('','I');
    		//Retour en première colonne
    		$this->SetCol(0);
    	}
     
    	function AjouterChapitre($texte)
    	{
    		//Ajout du chapitre
    		$this->CorpsChapitre($texte);
    	}
    }
    J'ai aussi instancier un nouvel objet de type PDF(), je lui ajoute une page,...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $pdf=new PDF();
    $pdf->AddPage();
    $pdf->SetFont('Arial','B',12);
    J'ai une requête que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $liste_cours_NORMAL = "SELECT DISTINCT MNEMONIC, NOM_COURS, ECTS FROM cours WHERE NOM_ANNEE = '".$_SESSION['choix_annee']."' AND CATEGORIE = '" . NORMAL."'";
    $req_liste_cours_NORMAL = mysql_query($liste_cours_NORMAL);
    ici, j'appelle la méthode AjouterChapitre afin d'ajouter le texte dans la première colonne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while($nom_des_cours = mysql_fetch_array($req_liste_cours_NORMAL))
    {
     
     
     
    		 $pdf->AjouterChapitre($nom_des_cours['MNEMONIC']);
     
    }
    Cela fonctionne très bien, j'ai droit au code des mes cours, les uns en dessous des autres.

    J'aurais maintenant voulu écrire dans la colonne juste à côté, mais là, ça ne fonctionne pas (voir l'image inclue) :

    J'utilise donc AcceptPageBreak, voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while($nom_des_cours = mysql_fetch_array($req_liste_cours_NORMAL))
    {
     
     
     
    		 //appelle la méthode AjouterChapitre
    		 $pdf->AjouterChapitre($nom_des_cours['MNEMONIC']);
    		 $pdf->AcceptPageBreak();
    		 $pdf->AjouterChapitre($nom_des_cours['NOM_COURS']);	
     
     
    }
    Sauriez-vous me dire comment je peux écrire dans la deuxième colonne de mon PDF ?

    Voici la fin de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $pdf->AliasNbPages();
    $pdf->Output();
    ?
    Merci d'avance.

    beegees

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 320
    Points : 311
    Points
    311
    Par défaut
    Salut,

    Si tu élargis la sortie (le tuto affiche le texte sur 6cm si j'en crois les commentaires), ça ne sort pas mieux ?
    *.Har(d)t
    ---
    "Je donnerais mon bras droit pour être ambidextre"
    Brian W. Kernighan

  3. #3
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Salut,

    Merci pour ta réponse.

    J'ai trouvé une solution qui ne doit pas être très propre mais les informations commencent à biens se disposer.

    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
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    <?php
    session_start();
    require('../fpdf.php');
     
    mysql_connect('localhost','root','mdp');
    mysql_select_db('pharma');
     
    class PDF extends FPDF
    {
    	//Colonne courante
    	var $col=0;
    	//Ordonnée du début des colonnes
    	var $y0;
     
    	function Header()
    	{
    		//En-tête
    		global $titre;
     
    		$this->SetFont('Arial','B',15);
    		$w=$this->GetStringWidth($titre)+6;
    		$this->SetX((210-$w)/2);
    		$this->SetDrawColor(0,80,180);
    		$this->SetFillColor(230,230,0);
    		$this->SetTextColor(220,50,50);
    		$this->SetLineWidth(1);
    		$this->Cell($w,9,$titre,1,1,'C',true);
    		$this->Ln(10);
    		//Sauvegarde de l'ordonnée
    		$this->y0=$this->GetY();
    	}
     
    	function Footer()
    	{
    		//Pied de page
    		$this->SetY(-15);
    		$this->SetFont('Arial','I',8);
    		$this->SetTextColor(128);
    		$this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
    	}
     
    	function SetCol($col)
    	{
    		//Positionnement sur une colonne
    		$this->col=$col;
    		//$x c'est là où va se trouver la colonne de gauche par rapport à la marge de gauche +$col* indique où va se trouver la colonne à sa droite 
    		$x=5+$col*30;
    		$this->SetLeftMargin($x);
    		$this->SetX($x);
    	}
     
    	function AcceptPageBreak()
    	{
    		//Méthode autorisant ou non le saut de page automatique
    			//Passage à la colonne suivante
    			$this->SetCol($this->col+1);
    			//Ordonnée en haut
    			$this->SetY($this->y0);
    			//On reste sur la page
    			return false;
     
    	}
     
     
    	function CorpsChapitre($texte)
    	{
    		$this->SetCol(0);
    		//Lecture de la donnée transmise (venant de la requête)
    		$txt = $texte;
    		//Police
    		$this->SetFont('Times','',12);
    		//Sortie du texte sur 6 cm de largeur
    		$this->MultiCell(25,5,$txt);
    		//$this->Ln();
    		//Retour en première colonne
    		//permet de choisir la colonne, SetCol(1) vaut 2 colonne
     
    	}
     
    	function Nom_Cours($texte)
    	{
    		//on se positionne sur la seconde colonne
    		$this->SetCol(1);
    		//Lecture de la donnée transmise (venant de la requête)
    		$txt = $texte;
    		//Police
    		$this->SetFont('Times','',12);
    		//Sortie du texte sur 6 cm de largeur
    		//$this->MultiCell(60,5,$txt,0,L); ==> le premier paramètre c'est là ou on coupe le mot, le seconde, je ne sais pas, le troisième, le texte à afficher, le 4e (qui est 0 veut dire que l'on ne met pas de bordure) et le L signifie centrage à gauche.
    		$this->MultiCell(60,5,$txt,0,L);
    		//$this->Ln();
    		//Retour en première colonne
    		//permet de choisir la colonne, SetCol(1) vaut 2 colonne
     
    	}
     
    	function Nom_Prof($texte)
    	{
    		//on se positionne sur la seconde colonne
    		$this->SetCol(2);
    		//Lecture de la donnée transmise (venant de la requête)
    		$txt = $texte;
    		//Police
    		$this->SetFont('Times','',12);
    		//Sortie du texte sur 6 cm de largeur
    		//$this->MultiCell(60,5,$txt,0,L); ==> le premier paramètre c'est là ou on coupe le mot, le seconde, je ne sais pas, le troisième, le texte à afficher, le 4e (qui est 0 veut dire que l'on ne met pas de bordure) et le L signifie centrage à gauche.
    		$this->MultiCell(60,5,$txt,0,L);
    		//$this->Ln();
    		//Retour en première colonne
    		//permet de choisir la colonne, SetCol(1) vaut 2 colonne
     
    	}
     
     
     
    }
     
    //Instanciation de la classe dérivée
    $pdf=new PDF();
    $pdf->AddPage();
    $pdf->SetFont('Arial','B',12);
     
    $liste_cours_NORMAL = "SELECT DISTINCT MNEMONIC, NOM_COURS, ECTS FROM cours WHERE NOM_ANNEE = '".$_SESSION['choix_annee']."' AND CATEGORIE = '" . NORMAL."'";
    $req_liste_cours_NORMAL = mysql_query($liste_cours_NORMAL);
     
    while($nom_des_cours = mysql_fetch_array($req_liste_cours_NORMAL))
    {
    	$sql_info_prof = "SELECT NOM_PROF, PRENOM_PROF FROM professeurs WHERE MATRICULE_PROF IN (SELECT DISTINCT MATRICULE_PROF FROM enseigner WHERE MNEMONIC = '".$nom_des_cours['MNEMONIC']."')";
    	//echo $sql_info_prof;
    	$req_info_prof = mysql_query($sql_info_prof);
    	$info_prof = mysql_fetch_array($req_info_prof); 
     
     
    	 //appelle la méthode AjouterChapitre
    	 $pdf->CorpsChapitre($nom_des_cours['MNEMONIC']);
    	 $pdf->NOM_COURS($nom_des_cours['NOM_COURS']);
    	 $pdf->Nom_Prof($info_prof['NOM_PROF']);
    	 //$pdf->Ln(50);
    	 //$pdf->AcceptPageBreak();
    	 //$pdf->AjouterChapitre($i);	
     
    	 //$pdf->AjouterChapitre($nom_des_cours['NOM_COURS']);
     
    }
     
    $pdf->AliasNbPages();
    $pdf->Output();
    ?>
    Je crée donc une méthode par type d'information.

    Je vais dans la colonne n au début de la méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $this->SetCol(0);
    ...
    $this->SetCol(1);
    ...
    $this->SetCol(2);
    ...
    Mais il me reste un problème, il y a un interligne qui se fait entre les types d'info, j'obtiens donc quelque chose dans ce genre : (voir miniature).

    Merci d'avance pour l'aide.

    beegees

  4. #4
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut Le résultat final de mon PDF -> du n'importe quoi
    Bonjour tout le monde,

    J'essaie d'ajouter une en-tête et des couleurs à mon tableau mais sans succès (voir pdf ci-joint).

    Voici le code qui appelle la classe et qui lui passe des paramètres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $pdf=new PDF_MC_Table();
    $pdf->Open();
    $pdf->AddPage();
    $pdf->SetWidths(array(30,85,52,10,10));
    //Titres des colonnes, array
    $header=array('MNEMONIC','NOM DU COURS','PROFESSEUR','COTE TH','COTE TP');
    $pdf->RowHeader($header);
    //envoi des infos vers le tableau
    $pdf->Row(array('   '.$nom_des_cours['MNEMONIC'],$nom_des_cours['NOM_COURS'],'Prof. '. $info_prof['NOM_PROF'],$cote_th['NOTE'],$cote_TP['NOTE']));
    Voici le code de ma classe, j'ai ajouté une fonction "RowHeader" afin d'y ajouter les headers mais ça ne fonctionne pas :

    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
    112
    113
    114
    115
    116
    117
    118
    119
    120
    <?php 
    class PDF_MC_Table extends FPDF
    {
    	var $widths;
    	var $aligns;
     
    	function SetWidths($w)
    	{
    		//Tableau des largeurs de colonnes
    		$this->widths=$w;
    	}
     
    	function SetAligns($a)
    	{
    		//Tableau des alignements de colonnes
    		$this->aligns=$a;
    	}
     
    	function RowHeader($header)
    	{
    		//DD : J'ai ajouté du code pour l'entête
    		//En-tête
    		$w=array(30,85,52,10,10);
    		for($i=0;$i<count($header);$i++)
    		$this->Cell($w[$i],7,$header[$i],1,0,'C',1);
    		//Restauration des couleurs et de la police
    		$this->SetFillColor(224,235,255);
    		$this->SetTextColor(0);
    		$this->SetFont('');
     
    	}
     
    	function Row($data)
    	{
     
    		//Calcule la hauteur de la ligne
    		$nb=0;
    		for($i=0;$i<count($data);$i++)
    			$nb=max($nb,$this->NbLines($this->widths[$i],$data[$i]));
    		$h=5*$nb;
    		//Effectue un saut de page si nécessaire
    		$this->CheckPageBreak($h);
    		//Dessine les cellules
    		for($i=0;$i<count($data);$i++)
    		{
    			$w=$this->widths[$i];
    			$a=isset($this->aligns[$i]) ? $this->aligns[$i] : 'C'; //SI Terniaire
    			//Sauve la position courante
    			$x=$this->GetX();
    			$y=$this->GetY();
    			//Dessine le cadre
    			$this->Rect($x,$y,$w,$h);
    			//Imprime le texte
    			$this->MultiCell($w,5,$data[$i],0,$a);
    			//Repositionne a droite
    			$this->SetXY($x+$w,$y);
    		}
    		//Va a la ligne
    		$this->Ln($h);
    	}
     
    	function CheckPageBreak($h)
    	{
    		//Si la hauteur h provoque un débordement, saut de page manuel
    		if($this->GetY()+$h>$this->PageBreakTrigger)
    			$this->AddPage($this->CurOrientation);
    	}
     
    	function NbLines($w,$txt)
    	{
    		//Calcule le nombre de lignes qu'occupe un MultiCell de largeur w
    		$cw=&$this->CurrentFont['cw'];
    		if($w==0)
    			$w=$this->w-$this->rMargin-$this->x;
    		$wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
    		$s=str_replace("\r",'',$txt);
    		$nb=strlen($s);
    		if($nb>0 and $s[$nb-1]=="\n")
    			$nb--;
    		$sep=-1;
    		$i=0;
    		$j=0;
    		$l=0;
    		$nl=1;
    		while($i<$nb)
    		{
    			$c=$s[$i];
    			if($c=="\n")
    			{
    				$i++;
    				$sep=-1;
    				$j=$i;
    				$l=0;
    				$nl++;
    				continue;
    			}
    			if($c==' ')
    				$sep=$i;
    			$l+=$cw[$c];
    			if($l>$wmax)
    			{
    				if($sep==-1)
    				{
    					if($i==$j)
    						$i++;
    				}
    				else
    					$i=$sep+1;
    				$sep=-1;
    				$j=$i;
    				$l=0;
    				$nl++;
    			}
    			else
    				$i++;
    		}
    		return $nl;
    	}
    }
    ?>
    Sauriez-vous svp me dire comment je peux faire pour résoudre ce problème ?

    Merci d'avance.

    beegees

Discussions similaires

  1. Réponses: 7
    Dernier message: 08/10/2012, 15h46
  2. [POI]: écrire dans la colonne 0 et une ligne qui change
    Par mouss4rs dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 07/03/2012, 17h12
  3. Réponses: 4
    Dernier message: 03/12/2009, 11h50
  4. Recherche Valeur -> écrire dans une colonne de cette ligne
    Par Xiombarg2911 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 25/04/2008, 14h12
  5. [FPDF] Rechercher dans des pdf
    Par snike dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 09/09/2005, 09h58

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