1

Bonjour,
J'ai un tableau tout simple de 160 lignes:
<table>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
...
</table>

Est-ce normal que la création du pdf mette presque 30 secondes ?

2

malheureusement oui, car pour chaque case de ton tableau (soit 4*160 = 640 cases), il doit créer un sous objet html2pdf pour pré calculer les dimensions de la case en fonction de son contenu...

de même pour les DIVs

HTML2PDF est une librairie assez gourmande en ressource et en mémoire ! il vaut mieux avoir un serveur assez puissant pour l'utiliser, et autoriser PHP à utiliser au moins 16Mo de mémoire
Ancien pseudo : lolo

3

je viens de tester ce script :

<?php
 	// récupération du contenu HTML
 	ob_start();
?>
<table>
<?php for($k=0; $k<160; $k++) { ?>
	<tr>
		<td><?php echo $k ; ?></td>
		<td><?php echo 2*$k ; ?></td>
		<td><?php echo 3*$k ; ?></td>
		<td><?php echo 4*$k ; ?></td>
	</tr>
<?php } ?>
</table>
<?php
	$content = ob_get_clean();
	
	// mode : true = debug, false = normal
	$mode = true;
	
	// conversion HTML => PDF
	require_once(dirname(__FILE__).'/html2pdf.class.php');

	if ($mode) echo HTML2PDFgetTimerDebug();
	$html2pdf = new HTML2PDF('P','A4', 'fr');
	$html2pdf->WriteHTML($content);
	$html2pdf->Output('index.pdf', $mode);
	if ($mode) echo HTML2PDFgetTimerDebug();


J'obtiens le résultat suivant :
Timer : 2.361s - Memory used 1703 Ko


je suis donc loin de tes 30 secondes... tu as quoi comme serveur ?!
Ancien pseudo : lolo

4

Merci pour ces précisions smile

J'ai fait le test avec le code ci-dessus, J'obtiens le résultat suivant:
Debug : init
Timer : 6.575s - Memory used 0 Ko

Mon serveur est un ProLiant DL380 G2

J'ai fait un test ensuite en ajoutant <page>, <page_header> et <page_footer>:
Debug : init
Timer : 6.989s - Memory used 0 Ko


Jusque là tout va bien !

J'ai ensuite ajouté des titres <div>Titre1</div>, <div>Titre 2</div>:
Debug : init
Timer : 7.087s - Memory used 0 Ko


Et pour coller à ce que je fais j'ai ajouté <div></div> pour tout ce qui est sous "Titre1":
<page backtop="10mm" backbottom="10mm">
<page_header>
<table>
<tr>
<td>A</td>
<td rowspan=2>B</td>
<td>C</td>
</tr>
<tr>
<td>E</td>
<td>F</td>
</tr>
</table>
</page_header>
<div>Titre 1</div>
<div>
<div>Titre 2</div>
<table>
<?php for($k=0; $k<160; $k++) { ?>
<tr>
<td style="width: 55%;"><?php echo $k ; ?></td>
<td style="width: 15%;"><?php echo 2*$k ; ?></td>
<td style="width: 15%;"><?php echo 3*$k ; ?></td>
<td style="width: 15%;"><?php echo 4*$k ; ?></td>
</tr>
<?php } ?>
</table>
</div>
<page_footer>
<table class="footer">
<tr>
<td>23/04/2009</td>
<td>page [[page_cu]]/[[page_nb]]</td>
</tr>
</table>
</page_footer>
</page>


Et là ça se gate:
Debug : init
Timer : 14.056s - Memory used 0 Ko


Donc j'ai compris d'où venait mon problème !

Si il y'a des conseils pour la création du document HTML je suis preneur...
Les balises conseillées et non conseillées, le style conseillé et non conseillé !

Merci

5

pour les styles conseillés / non conseillés, rien de particulier

pour les balises conseillés / non conseillés, celles qui prennent le plus de mémoire et de temps de génération sont TABLE, TR, TD, TH, DIV, UL, LI, OL, NOBREAK

car toutes ces balises impliquent de devoir faire une première analyse de leurs contenus afin de calculer leur taille.

dans ton cas, il doit calculer une DIV qui englobe pas mal de chose dont un tableau, qu'il doit egalement pré calculer avant de faire le calcul de la div... => il doit donc précalculer le tableau 2 fois avant de l'afficher définitivement. je te conseille donc fortement de ne pas tout englobé dans une grosse div (qui en plus peut poser pb lors de saut de pages, car il préfère quand le contenu d'une div (comme d'un td d'ailleurs) tiens sur une seule page...

de manière générale, tjrs éviter de mettre tout le contenu dans une div si ce n'est pas utile et que la même mise en page globale peut être obtenue sans (par exemple en utilisant un span à la place qui ne nécessite pas de tout pré calculé, mais qui par contre ne permet pas les borders, backgrounds, et positionnements relatifs et autre)
Ancien pseudo : lolo

6

Ok. Merci pour ces informations.
Le sujet est clos !