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;
    }
}