Bonjour,
est-il possible de faire un retour à la ligne après n caracteres dans une celule ($pdf->Cell())avec FDPF
Bonjour,
est-il possible de faire un retour à la ligne après n caracteres dans une celule ($pdf->Cell())avec FDPF
Il me semble que pour afficher un texte de plusieurs lignes il faut utiliser MultiCell (casse à vérifier...) . T'as plusieurs cellules les unes en dessous des autres ensuite. Les \n générent automatiquement ces nouvelles cellules.
En fait je fais un tableau
mais dans certaines colonnes j'aimerais des retours à la ligne après tant de caracteres...
notamment la colonne 0,1,6 et 8
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 function CotisationTable($header,$data){ //Couleurs, épaisseur du trait et police grasse $this->SetFillColor(255,0,0); $this->SetTextColor(255); $this->SetDrawColor(128,0,0); $this->SetLineWidth(.3); $this->SetFont('','B'); //En-tête $w=array(55,50,25,20,25,20,20,30,50); for($i=0;$i<count($header);$i++) $this->Cell($w[$i],7,$header[$i],1,0,'C',1); $this->Ln(); //Restauration des couleurs et de la police $this->SetFillColor(224,235,255); $this->SetTextColor(0); $this->SetFont(''); //Données $fill=0; foreach($data as $row){ $this->Cell($w[0],6,$row[0],'LR',0,'L',$fill); $this->Cell($w[1],6,$row[1],'LR',0,'L',$fill); $this->Cell($w[2],6,$row[2],'LR',0,'L',$fill); $this->Cell($w[3],6,$row[3],'LR',0,'C',$fill); $this->Cell($w[4],6,$row[4],'LR',0,'R',$fill); $this->Cell($w[5],6,$row[5],'LR',0,'L',$fill); $this->Cell($w[6],6,$row[6],'LR',0,'L',$fill); $this->Cell($w[7],6,$row[7],'LR',0,'R',$fill); $this->Cell($w[8],6,$row[8],'LR',0,'L',$fill); $this->Ln(); $fill=!$fill; } //Trait de terminaison $this->Cell(array_sum($w),0,'','T'); }
et , un peu bourrin mais bon.. si tu mets multicell partout, et tu ajoutes \n là ou tu veux tes retours à la ligne?
non j'ai déjà essayé mais ca me pourrit la mise en page du tableau j'ai meme pu de ligne
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 function CotisationTable($header,$data){ //Couleurs, épaisseur du trait et police grasse $this->SetFillColor(255,0,0); $this->SetTextColor(255); $this->SetDrawColor(128,0,0); $this->SetLineWidth(.3); $this->SetFont('','B'); //En-tête $w=array(55,50,25,20,25,20,20,30,50); for($i=0;$i<count($header);$i++) $this->Cell($w[$i],7,$header[$i],1,0,'C',1); $this->Ln(); //Restauration des couleurs et de la police $this->SetFillColor(224,235,255); $this->SetTextColor(0); $this->SetFont(''); //Données $fill=0; foreach($data as $row){ $this->MultiCell($w[0],6,$row[0],'LR','L',$fill); $this->MultiCell($w[1],6,$row[1],'LR','L',$fill); $this->MultiCell($w[2],6,$row[2],'LR','L',$fill); $this->MultiCell($w[3],6,$row[3],'LR','C',$fill); $this->MultiCell($w[4],6,$row[4],'LR','R',$fill); $this->MultiCell($w[5],6,$row[5],'LR','L',$fill); $this->MultiCell($w[6],6,$row[6],'LR','L',$fill); $this->MultiCell($w[7],6,$row[7],'LR','R',$fill); $this->MultiCell($w[8],6,$row[8],'LR','L',$fill); $this->Ln(); $fill=!$fill; } //Trait de terminaison $this->Cell(array_sum($w),0,'','T'); }
En fait pares chaque MultiCell ca passe a la ligne...
Le plus simple reste quand même de passe par des MultiCell, mais effectivement après un MultiCell, fpdf revient automatiquement à la ligne, c'est à toi de replacer correctement ton pointeur après le multicell, avec SetXY();
Ah d'accord je savais pas pour le retour à la ligne automatique...
comment puis je faire un setXY pour revenir alors que c'est une fonction que j'appelle, je ne connais pas forcément le X et le Y ou le remettre
Oui mais si je fais un GetX et un GetY après le MultiCell c'est que je suis dèja passé à la ligne donc comment je connais le X et le Y pour revenir à la ligne précédente ?
euh oui, j'avaias répondu un peu vite, désolé..
un autre truc un peu bourrin que je te propose (j'en connais plein lol), c'est de ne pas faire de multicell, mais de tracer un rectangle et d'ecrire dedans avec des Cell sans contours.... j'ai été obligé de le faire une fois parce qu'il y avait un peu n'importe quoi que le client voulait dans sa cellule du tableau...
Il te faut rajouter cette fonction que j'ai récupérer qq part sur le site de fpdf mais je sais pu trop ou :
( à ajouter dans la classe fpdf )
Elle te renvoi le nombre de ligne que va utiliser un multicell avec un texte $txt et une largeur $w
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 function NbLines($w,$txt) { //Computes the number of lines a MultiCell of width w will take $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=$j=$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; }
Avec ça tu devrais avoir tout ce qui te faut pour résoudre ton soucis.
Je vois pas trop comment l'utiliser dans mon code que j'ai mis ci dessus...
Et bien avec ça tu peux connaitre le nb de ligne de ton MultiCell, donc retrouver le Y , pour le X tu le connais hein , c'est la largeur de ton multicell, je vois pas ce qui te manque là.
Mouais je vois pas trop comment l'utiliser dans mon code...
Je te donne mon code, si tu peut m'aider à le modifier....
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 function CotisationTable($header,$data){ //Couleurs, épaisseur du trait et police grasse $this->SetFillColor(255,0,0); $this->SetTextColor(255); $this->SetDrawColor(128,0,0); $this->SetLineWidth(.1); $this->SetFont('','B'); //En-tête $w=array(40,40,25,30,25,20,40,30,50); for($i=0;$i<count($header);$i++) $this->Cell($w[$i],7,$header[$i],1,0,'C',1); $this->Ln(); //Restauration des couleurs et de la police $this->SetFillColor(224,235,255); $this->SetTextColor(0); $this->SetFont(''); //Données $fill=0; foreach($data as $row){ $x = $this->GetX(); $y = $this->GetY(); $this->MultiCell($w[0],6,$row[0],'LR','L',$fill); $this->SetXY(($x + 40),$y); $x = $this->GetX(); $y = $this->GetY(); $this->MultiCell($w[1],6,$row[1],'LR','L',$fill); $this->SetXY(($x+40),$y); $x = $this->GetX(); $y = $this->GetY(); $this->MultiCell($w[2],6,$row[2],'LR','L',$fill); $this->SetXY(($x+25),$y); $x = $this->GetX(); $y = $this->GetY(); $this->MultiCell($w[3],6,$row[3],'LR','C',$fill); $this->SetXY(($x+30),$y); $x = $this->GetX(); $y = $this->GetY(); $this->MultiCell($w[4],6,$row[4],'LR','R',$fill); $this->SetXY(($x+25),$y); $x = $this->GetX(); $y = $this->GetY(); $this->MultiCell($w[5],6,$row[5],'LR','L',$fill); $this->SetXY(($x+20),$y); $x = $this->GetX(); $y = $this->GetY(); $this->MultiCell($w[6],6,$row[6],'LR','L',$fill); $this->SetXY(($x+40),$y); $x = $this->GetX(); $y = $this->GetY(); $this->MultiCell($w[7],6,$row[7],'LR','R',$fill); $this->SetXY(($x+30),$y); $this->MultiCell($w[8],6,$row[8],'LR','L',$fill); $this->Ln(); $fill=!$fill; } //Trait de terminaison $this->Cell(array_sum($w),0,'','T'); }
à un moment donné c'est qd même toi le programmeur..
Déjà tu pourrais stocker tes alignements ( L,C,R) dans un tableau à part de la même manière que tes largeurs, t'y verrais peut-etre plus clair et ce serait bien plus propre.
Ensuite de la même façon que tu repositionne les X, tu dois utiliser la fonction que je t'ai envoyé à certains endroits pour sauter ou non la ligne.. ( en oubliant pas que la fonction renvoi un nb de lignes, donc à multiplier par la hauteur d'écriture de ton MultiCell. ( 6 dans ton exemple )
C'est quoi le $w et le $txt que la fonction prend en parametres ?
Partager