PHP TCPDF : connaitre la hauteur d’un multicell

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


PHP : connaitre l’IP publique de son serveur

Petite fonction php pour connaitre l’IP publique de son serveur.

Attention il ne s’agit pas de l’IP du client mais bien celle du serveur. Utile si vous êtes dans un réseau.

/**
  * function monIP : to know the public IP of server
  * @param   
  * @return IPv4 address or false 
  */
function monIP(){
       preg_match('/((\d{1,3}\.){3}\d{1,3})/', file_get_contents("http://www.monip.org/"), $matches);
       if(isset($matches[0])) return $matches[0];
       else return false;
}

//Ex : echo monIP();

Nettoyer un fichier rtf : rtf to txt

Si vous devez nettoyer des données mises en forme en rtf, en gros : RTF => TXT

Voici un script qui peut vous aider par contre vous devez installer unrtf sur votre serveur (testé sur ubuntu)

  • Le script :
/**
 * Dans cette exemple le rtf est une chaine de caractere mais cela peut être un fichier text.
 * Sources :http://www.gnu.org/software/unrtf/unrtf.html
 */
$str ='{\rtf1\ansi\ansicpg1252\deff0\deflang1036{\fonttbl{\f0\fswiss\fprq2\fcharset0 Arial;}{\f1\fnil\fcharset0 MS Shell Dlg;}}{\*\generator Msftedit 5.41.21.2509;}\viewkind4\uc1\pard\f0\fs17 samples sent from Pronic Inc in Michigan to\par Main Factory in France\par FEDEX Invoice# 544425\par .\par \pard\f1\fs17 Payment Terms : \par - Deposit of 10% at reception of die design = 244.74 USD\par - Balance of 40% at delivery at the stamping facility (30 days net) = 911.59 USD\par - Balance of 5% after DDAP (60 days maximum after delivery i.e. maximum 02/5/2011) = 63.69 USD\par \pard - Balance of 5% after final customer approval (120 days maximum after delivery i.e. maximum 04/5/2011) = 63.69 USD\f0\fs17\par } '; 

$rtfbuf = strtr($str, array("\r\n"=>"","\t"=>""));
file_put_contents("in", utf8_decode($str));
$last_line = system('unrtf -t text in > out', $retval);
$rtfbuf = file_get_contents("out");
$rtfbuf = explode(chr(10),$rtfbuf);
$rtftest=false; 

if(count($rtfbuf)<>0){
foreach($rtfbuf as $v) {
if($rtftest) $rtfout[]= $v.chr(10);
elseif(trim($v) =="-----------------") $rtftest=true;
else continue;
}
}
print_r($rtfout);