1

Bonsoir,

Le titre du post indique mon pb. Les utilisateurs peuvent remplir des tableaux à leur guise. Tout fonctionne bien jusqu'à ce que l'un d'entre eux remplisse une case du tableau de façon considérable mais à juste titre. La génération de pdf indique l'erreur mentionnée en titre. Je la comprends puisque si un TD ne tient pas sur une page, alors il tente de le mettre sur la page suivante mais comme le TD ne tient pas sur une page entière, il y a plantage.... Comment y remédier sans demander à l'utilisateur de réduire son contenu ?
Puis-je modifier un paramètre pour finalement, ne pas passer à la page suivante dès qu'un TD ne tient pas sur sa page actuelle ?
Si je dois faire des modifs moi-même, dans quelle partie du code dois-je me plonger ?

Bien cordialement,

Eric2E

2

Hello !

Pour ma part, il me fallait maîtriser exactement les pages sur lesquelles j'étais et gérer moi même les sauts de pages.
J'ai donc fait une fonction qui me calcule de manière approximative la place que va prendre un contenu en fonction de la police + taille utilisée pour les différentes balises (P, H1 à H6 etc.)

Il suffit ensuite de faire le découpage toi même en créant un nouvelle page + nouveau TR pour ton cas.

Je te file mes fonctions si tu as besoin. Si tu peux juste les adapter plutot que de réinventer la rout ça te fera gagner du temps wink
<?php /** * Découpe un texte de façon à ce que chaque morceau rentre dans la zone spécifiée * @param $strContenu string Le contenu texte * @param $w int Largeur en pixel de la zone dans laquelle doit rentrer chaque morceu de texte * @param $h int Hauteur en pixel de la zone dans laquelle doit rentrer chaque morceu de texte * @param $regles array Tableau des règles pour le calcul de la place occupée par le texte (cf fonction webu_getHauteur) * @return array Texte découpé en plusieurs morceaux * @author Webu (Dylann Cordel <d.cordel@webu.fr>) */ function webu_decoupageTxt_zones($strContenu, $w, $h, $regles = array()){ $contenus =array();//contenus retournés $regles['largeur'] = $w ; $regles['hauteur'] = $h ; $hauteurComplete = webu_getHauteur('<p>'.$strContenu.'</p>', $regles); if($hauteurComplete > $regles['hauteur']){ //le contenu ne rentre pas, on le sépare en plusieurs zones $nbCaracteres = mb_strlen($strContenu); $ratioDepassement = $hauteurComplete / $regles['hauteur'] ; $nbCaracteresPourPasDepasser = round($nbCaracteres / $ratioDepassement); /* il faut donc qu'on coupe tous les nbCaracteresPourPasDepasser sauf qu'on ne va pas couper comme des brutes n'importe comment. on se donne une marge de 10% de la hauteur max pour trouver une césure + sympa */ $debutRecherche = round($nbCaracteresPourPasDepasser * 0.9); $rechercheMax = $nbCaracteresPourPasDepasser - $debutRecherche ; //on sépare en plusieurs parties while(!empty($strContenu)){ $nouveauContenu = ''; $meilleureCesure = array('note'=>0,'pos'=>0) ; for($i = 0 ; $i < $rechercheMax-1 ; $i++){ $note = -1 ;// de 0 à 8 (-1 : pas pris en compte) $pos = $debutRecherche+$i ; if($i == 0){ $analyse = mb_substr($strContenu, $pos, 2) ; }else{ $analyse = mb_substr($strContenu, $pos-1, 3) ; } switch(true){ case preg_match('/^[[:alnum:]]\.\s$/', $analyse) : $note = 8 ; break; case preg_match('/^.[^\.]\.\s$/', $analyse) : $note = 7 ; break; case preg_match('/^\.\.\.$/', $analyse) : $note = 6 ; $pos++; break; case preg_match('/^!\s$/', $analyse) : $note = 5 ; break; case preg_match('/^[[:punct:]]\s$/', $analyse) : $note = 4 ; break; case preg_match('/^[[:punct:]].$/', $analyse) : $note = 3 ; break; case preg_match('/^\s.$/', $analyse) : $note = 2 ; break; case preg_match('/^-.$/', $analyse) : $note = 1 ; break; case preg_match('/^_.$/', $analyse) : $note = 0 ; break; } //>= car on cherche à couper le mieux et plus loin possible if($note >= $meilleureCesure['note']){ $meilleureCesure = array('note'=>$note,'pos'=>$pos+1) ; } } if(empty($meilleureCesure['pos'])){ //on a pas trouvé de césure sympa, alors on va couper au hachoir $meilleureCesure = array('pos'=>$nbCaracteresPourPasDepasser, 'note'=>0) ; } $nouveauContenu = mb_substr($strContenu, 0, $meilleureCesure['pos']); $strContenu = mb_substr($strContenu, mb_strlen($nouveauContenu)); $contenus[] = $nouveauContenu ; } return $contenus ; }else{ return array($strContenu); } } /** * Calcul la hauteur d'un contenu texte ou html en fonction des règles établies * @param $sHTML string Le contenu dont on veut la taille * @param $regles array Tableau des règles pour le calcul de la hauteur. * @return $prcntStrict float valeur > 1 permettant de calculer la marge d'erreur qu'on autorise au calcul. 1 = pas de marge d'erreur 1.1 = 10% de la largeur en + * @return int Hauteur en pixel occupé par le sHTML en fonction de la alrgeur donnée dans les règles * @todo attention, fonction récupérer d'un autre projet qui servait juste à vérifier qu'un contnu HTML rentrait ou non dans une zone définie. * ça fonctionne telquel, mais le code a été fait au plus pressé. A revoir un jour quand on aura le temps * @author Webu (Dylann Cordel <d.cordel@webu.fr>) */ function webu_getHauteur($sHTML, $regles = NULL, $prcntStrict = 1) { $reglesDefault = array( 'largeur'=>800, 'hauteur'=>400, 'contenants'=>array( 'h1'=>array( 'hauteur'=>24,//hauteur de chaque ligne du titre 'largeur'=>9,//la largeur est forcément une moyenne puisqu'on utilise pas de chasse fixe 'marges' => 10,//a ajouter au nombre de lignes contenues dedans : pour les padding/margin du paragraphe ), 'h2'=>array( 'hauteur'=>18,//hauteur de chaque ligne du titre 'largeur'=>7.5,//la largeur est forcément une moyenne puisqu'on utilise pas de chasse fixe 'marges' => 20,//a ajouter au nombre de lignes contenues dedans : pour les padding/margin du paragraphe ), 'h3'=>array( 'hauteur'=>15,//hauteur de chaque ligne du titre 'largeur'=>6,//la largeur est forcément une moyenne puisqu'on utilise pas de chasse fixe 'marges' => 10,//a ajouter au nombre de lignes contenues dedans : pour les padding/margin du paragraphe ), 'h4'=>array( 'hauteur'=>12,//hauteur de chaque ligne du titre 'largeur'=>5,//la largeur est forcément une moyenne puisqu'on utilise pas de chasse fixe 'marges' => 10,//a ajouter au nombre de lignes contenues dedans : pour les padding/margin du paragraphe ), 'h5'=>array( 'hauteur'=>12,//hauteur de chaque ligne du titre 'largeur'=>5,//la largeur est forcément une moyenne puisqu'on utilise pas de chasse fixe 'marges' => 10,//a ajouter au nombre de lignes contenues dedans : pour les padding/margin du paragraphe ), 'h6'=>array( 'hauteur'=>12,//hauteur de chaque ligne du titre 'largeur'=>5,//la largeur est forcément une moyenne puisqu'on utilise pas de chasse fixe 'marges' => 10,//a ajouter au nombre de lignes contenues dedans : pour les padding/margin du paragraphe ), 'p'=>array( 'hauteur'=>12,//hauteur de chaque ligne du p (attention font-size = 12 fait une hauteur de 16) 'largeur'=>5,//la largeur est forcément une moyenne puisqu'on utilise pas de chasse fixe 'marges' => 5,//a ajouter au nombre de lignes contenues dedans : pour les padding/margin du paragraphe ), 'li'=>array( 'hauteur'=>12,//hauteur de chaque ligne du p (attention font-size = 12 fait une hauteur de 16) 'largeur'=>5,//la largeur est forcément une moyenne puisqu'on utilise pas de chasse fixe 'marges' => 5,//a ajouter au nombre de lignes contenues dedans : pour les padding/margin du paragraphe ), 'div'=>array( 'hauteur'=>12,//hauteur de chaque ligne du p (attention font-size = 12 fait une hauteur de 16) 'largeur'=>5,//la largeur est forcément une moyenne puisqu'on utilise pas de chasse fixe 'marges' => 5,//a ajouter au nombre de lignes contenues dedans : pour les padding/margin du paragraphe ), ) ); if(empty($regles)){ $regles = $reglesDefault ; }else{ foreach($reglesDefault as $key => $value){ if(is_array($value)){ foreach($value as $k => $v){ if(!isset($regles[$k])) $regles[$key][$k] = $v ; } }elseif(!isset($regles[$key])) $regles[$key] = $value ; } } foreach($regles['contenants'] as $tag => $infos){ switch(true){ case $infos['hauteur'] < 11 : $regles['contenants'][$tag]['hauteur']+=2; break; case $infos['hauteur'] < 16 : $regles['contenants'][$tag]['hauteur']+=3; break; default : $regles['contenants'][$tag]['hauteur']+=4; break; } } $regles['largeur'] = round($regles['largeur'] * $prcntStrict) ; $doc = new DOMDocument(); $doc->loadHTML('<html><body>'.str_ireplace(array('<br>', '<br />', '<br/>'), '[br]', $sHTML).'</body></html>'); $hauteur = 0 ; foreach($regles['contenants'] as $tagName => $params){ foreach($doc->getElementsByTagName($tagName) as $tag){ $txt = $tag->textContent ; $lignes = explode('[br]', $tag->textContent) ; foreach($lignes as $ligne){ $nbLignesAffichees = ceil((mb_strlen($ligne)*$params['largeur']) / $regles['largeur']) ; $hauteur+=$params['hauteur'] * $nbLignesAffichees; } $hauteur+=$params['marges']; } } return $hauteur ; } ?>

Bon courage smile