L’excellente classe PHP TCPDF qui permet de générer des documents pdf m’a donné l’autre jour du fil à retordre.
Je travaillais sur la génération de facture en pdf donc avec des colonnes de largeur fixe mais dont le contenu doit pouvoir retourner à la ligne. Pour ce faire j’utilise la fonction
$pdf->MultiCell() qui fonctionnent à merveille, cependant il me fallait (pour d’obscure question de bordure de cellule et de paginnation connaitre la hauteur des cellules générées et ce avant de les écrire afin de pouvoir forcer la même hauteur pour toutes les cellules de la même ligne. En simplifier voilà ce que je fais:
$data = array(col1,col2,col3); // tableau des cellules d'une même ligne $maxHeight=5; // c'est la hauteur minimum de mes lignes foreach($data as $c => $v){ $tmp= monastucepourconnaitrelahauteur($v); if($tmp>$maxHeight) $maxHeight = $tmp; }
j’ai maintenant $maxHeight qui contient la hauteur de la plus grande cellule de ma ligne
il ne me reste plus qu’à ecrire ma ligne avec cette hauteur
foreach($data as $c => $v) { $this-> MultiCell ( $w, $maxHeight, trim($v), $border="RL", $align="L", $fill=0, $ln=1, $x, $y, $reseth=true, $stretch=0, $ishtml=0, $autopadding=false, $maxh=0, $valign='T', $fitcell=false ); }
Et donc maintenant l’astuce qui est sur le site de tcpdf mais bien cachée :
Il faut remplacer le 1er foreach de cet article par celui ci-dessous :
$maxHeight = 5; // c'est la hauteur minimum de mes lignes foreach ($data as $c => $v) { // store current object $this->startTransaction(); // store starting values $start_y = $this->GetY(); $start_page = $this->getPage(); // call your printing functions with your parameters $this->MultiCell($w, $maxHeight, trim($v), $border = "RL", $align = "L", $fill = 0, $ln = 1, $x, $y, $reseth = true, $stretch = 0, $ishtml = 0, $autopadding = false, $maxh = 0, $valign = 'T', $fitcell = false); // get the new Y $end_y = $this->GetY(); $end_page = $this->getPage(); // calculate height $height = 0; if ($end_page == $start_page) { $height = $end_y - $start_y; } else { for ($page = $start_page; $page <= $end_page; ++$page) { $this->setPage($page); if ($page == $start_page) { // first page $height = $this->h - $start_y - $this->bMargin; } elseif ($page == $end_page) { // last page $height = $end_y - $this->tMargin; } else { $height = $this->h - $this->tMargin - $this->bMargin; } } } // restore previous object $this->rollbackTransaction(true); $height = ceil($height); //je ne m'embête pas de virgule if ($height > $maxHeight) { $maxHeight = $height; } }
28/05/2014 at 23:34
Merci beaucoup pour cette astuce car elle m’a permis de sortir d’une galère.
Bonne continuation.