Pagination automatique avec FPDF

Mammouth du PHP | 536 Messages

07 oct. 2008, 11:41

Bonjour tout le monde,

Je souhaite afficher une bon de commande au format pdf. Pour cela j'utilise FPDF.
Jusqu'à présent très bien.
Seulement voilà, lorsqu'une commande est trop "longue", les articles commandés se "superposent" sur le bloc correspondant à mon footer (si on peut dire).

J'affiche les produits commandés grâce à une boucle while.

Le principe je l'ai bien compris, il faut que je regarde la valeur de la ligne suivant ou du curseur avec GetY() et que je la compare à la place nécessaire pour écrire mon pied de facture.

Là c'est ok.

Là c'est ce que j'ai fait seulement voilà, j'ai un problème. Je n'arrive pas réinitialiser la valeur de mon curseur pour que la suite de ma commande s'affiche tout en haut de ma deuxième page.

Voilà mon code qui génère le fichier pdf.
<?
define('FPDF_FONTPATH','font/');
require('invoice.php');

$pdf = new INVOICE( 'P', 'mm', 'A4' );
$pdf->Open();
$pdf->AddPage();
$pdf->SetAutoPageBreak(true, 20);
$pdf->AliasNbPages();
$pdf->addSociete( "ici le nom de la société");
$pdf->Image('../../imgs/logo.png',9,6);
$num_com = "Commande ".$id_commande;
$pdf->fact_dev("", $num_com);
$pdf->temporaire("Commande");
$pdf->addDate($date);
$pdf->addClient($num_fourn);
$pdf->addPageNumber("1");
$pdf->addClientAdresse($nom_fournisseur."\n".$adresse_fourn."\n".$cp_fourn." ".$ville_fourn);
$pdf->addcontact($nom_contact);
//$pdf->addReglement($paiement);

$cols=array( "CODE PRODUIT"    	=> 25,
             "DESIGNATION"  	=> 95,
             "QUANTITE"     	=> 15,
             "P.U. HT"      	=> 20,
			 "TVA"      		=> 10,
             "TOTAL TTC" 		=> 25);
$pdf->addCols( $cols);
$cols=array( "CODE PRODUIT"    	=> "L",
             "DESIGNATION"  	=> "L",
             "QUANTITE"     	=> "C",
             "P.U. HT"      	=> "R",
			 "TVA"      		=> "R",
             "TOTAL TTC" 		=> "R");
$pdf->addLineFormat($cols);
$pdf->addLineFormat($cols);

$y    = 85;

$total_ttc = 0;

$panier = mysql_query("SELECT * FROM commandes_lignes WHERE id_commande = ".$id_commande) or die(mysql_error());
while ($res_panier = mysql_fetch_array($panier)) {
	$code_produit = $res_panier['code_produit'];
	if ($code_produit == "") { $code_produit = "nc"; }
	$nom = $res_panier['nom'];
	$quantite = $res_panier['quantite'];
	$prix_unitaire = number_format($res_panier['prix_unitaire'],2);
	$caracteristiques = $res_panier['descriptif'];
	$tva = mysql_query("SELECT * FROM tva WHERE id = '".$res_panier['tva']."'") or die(mysql_error());
	$tab_tva = mysql_fetch_array($tva);
	if($tab_tva['taux'] == 0){ 
		$taux = "0";
	}
	else{
		$taux = $tab_tva['taux'];
	}
	
	$montant_ttc = ($prix_unitaire*$quantite)+(($prix_unitaire*$quantite)*$taux/100);
	$montant_ttc = number_format($montant_ttc,2,".","");
	$montant_ttc_2 = number_format($montant_ttc,2,"."," ");
	
	$line = array( "CODE PRODUIT"   => $code_produit,
				   "DESIGNATION"  	=> $nom."\n".$caracteristiques."\n",
				   "QUANTITE"     	=> $quantite,
				   "P.U. HT"      	=> $prix_unitaire." ".EURO,
				   "TVA"			=> $taux." %",
				   "TOTAL TTC"		=> $montant_ttc_2." ".EURO);
	//echo "<pre>"; print_r($line); echo "</pre>";
	$size = $pdf->addLine( $y, $line );
	$y   += $size + 2;	
	$total_ttc += $montant_ttc;	
	
	$cursor = $pdf->GetY();
	if($cursor > 120) {
		$pdf-> AddPage();
		$cursor = $pdf->SetY(0);
	}
}
$total_ttc = number_format($total_ttc,2,"."," ");

$cols2 = array(	"Conditions" => 165,
				"TOTAL T.T.C."	=> 25);
$pdf->addCols2($cols2);
$cols2 = array(	"Conditions" => "L",
				"TOTAL T.T.C."   => "R");
$pdf->addLineFormat($cols2);

$line2 = array( "Conditions" => "    Livraison avant le ".$date_livraison."\n    Franco de port et d'emballage\n    Paiement par virement sous 30 jours à réception de la facture\n    Les livraisons sont reçues du lundi au vendredi de 8h à 12h et de 13h30 à 16h.",
				"TOTAL T.T.C."  => $total_ttc." ". EURO);
$size = $pdf->addLine2( "235", $line2 );


$pdf->addSignature("Avec nos remerciements et nos salutations distinguées,");
$pdf->addTexte("Le Directeur");
$pdf->Output();
?>
Afin de faire une pagination, j'ai utilisé ce bout de code dans ma boucle mais sans succès :
<?
$cursor = $pdf->GetY();
	if($cursor > 120) {
		$pdf-> AddPage();
		$cursor = $pdf->SetY(0);
	}
?>
Une idée ?

Merci d'avance
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

Mammouth du PHP | 881 Messages

07 oct. 2008, 18:07

Bonjour!

Le moyen le plus simple, à mon avis, pour paginer tes feuilles, c'est d'avoir un compteur de page. Lorsque qu'est provoqué un $pdf-> AddPage(); le compteur est incrémenté d'un.
++$NumPage;
Tu exploites ensuite cette valeur pour l'afficher là où tu veux.

Pour ma part, je réunis toutes les informations communes (en-tête et pied de page) dans des sous-routines. Quand le compteur de lignes d'informations ou le GetY a telle ou telle valeur, les sous-routines sont appelées. Il te suffit donc, dans ton while de mettre un petit if (GetY()) qui se lit très vite. Si la condition est remplie, la sous-routine est appelée, dans le cas d'un GetY() == 0, c'est l'en-tête, dans le cas d'un GetY() == xyz, c'est le pied de page. Évidemment, avant d'entrer dans le while, est systématiquement appelée la sous-routine d'en-tête, après, celle du pied de page.


Pour ce qui est du compteur, voici quelques idées:
  
    $NumPage=1;
    $pdf = EnTete($NumPage);
    while (blablabla) {
          if (GetY() == 30) { $pdf = PiedPage($NumPage); }
          if (GetY() == 0) {  $pdf = EnTete(++$NumPage); }
          //Ton contenu ici
    }
    $pdf = PiedPage($NumPage);

Soyez artisans de paix