1

Salut à tous,

Je découvre html2pdf, et c'est vraiment une bombe smile

Une question par contre (je n'ai rien trouvé la-dessus dans le forum...)

Je suis en train de faire un programme de facturation.
Via une boucle, je génère environ 150 factures à la suite.
Du coup, ce que je voudrai, c'est créer un grand PDF, avec toutes les factures les unes à la suite des autres pour pouvoir les imprimer d'un seul coup.
Ca ferait une facture par page (saut de page à prévoir).

J'ai vu que je pouvais récupérer le contenu du PDF généré dans une variable, mais je ne sais pas si je suis sur la bonne piste :
$content_PDF = $html2pdf->Output('', true);

http://wiki.spipu.net/doku.php?id=html2pdf:fr:v4:output&s[]=mail

Qu'en pensez-vous ?

Merci !

[nosmile]

2

Autant pour moi, j'ai oublié d'indiquer que je travaille sur la V4.01 dans le titre. Si un admin peut l'ajouter, ca serait sympa wink

3

pour faire une facture par page, il suffit de mettre chaque facture dabs une balise page : <page>.....facture 1...</page><page>.....facture 2...</page>....

après, il faut utiliser la méthode Output normalement, sans paramètre, pour que ca apparaisse dans ton navigateur, pour ensuite l'imprimée
Ancien pseudo : lolo

4

ca se tient, et ca semble une bonne idée smile
Mais le problème est que je fais appelle à une page via un include, dans laquelle je passe des variables.

ob_start();
include(dirname(__FILE__).'/factureType.php');
$content = ob_get_clean();

require_once(dirname(__FILE__).'/../html2pdf/html2pdf.class.php');
try
{
$html2pdf = new HTML2PDF('P','A4','fr', false, 'ISO-8859-15');
// $html2pdf->setModeDebug();
$html2pdf->setDefaultFont('Arial');
$html2pdf->pdf->SetProtection(array('print'), ''); // protection
$html2pdf->writeHTML($content, isset($_GET['vuehtml']));
$html2pdf->Output('./TEST.pdf');

}
catch(HTML2PDF_exception $e) { echo $e; }


Ca voudrait dire qu'il faudrait que je stocke l'ensemble des pages dans la variable $content, et qu'ensuite seulement je lance la classe html2pdf ?

Je vais essayer...

5

Ca fonctionne !
Mais je ne peux pas le vérifier grandeur nature, car le délai d'exécution du script est dépassé sur le serveur (mutualisé) sad sad sad
Me reste plus qu'à découper le PDF en plusieurs parties, mais ca me pose des problèmes de traitement en amont...

Merci en tous cas ^^

6

Autre problème lorsque j'utilise la classe htlm2pdf au sein de la boucle, pour, par exemple envoyer des PDF par email.
Il semble qu'il y ait un petit problème de ce coté, car à chaque fois, il manque les 1ers élements de la boucle.
Je m'explique :
Si j'envoie 10 Emails, je ne recevrai jamais les deux 1ers, mais seulement les 8 derniers...
C'est valable aussi pour les exports de PDF simples...

AMHA, il semble que la boucle aille plus vite que l'exécution de la classe...

Avez-vous déjà eu ce cas ?

Merci !

7

pour la boucle, une autre possibilité est de faire un writeHTML pour chaque page, normalement c'est fait pour => ca devrait être plus rapide normalement.

pour les emails, vérifiez en créant des logs que les mails sont bien créé avant envoie. mais c'est du PHP, ca ne concerne pas HTML2PDF
Ancien pseudo : lolo

8

Pour les emails, fait-il utiliser setModeDebug ? En ce cas, voici le retour :

step time delta memory peak

Init debug 0.1 ms 0.1 ms 8 039.4 Ko 10 860.1 Ko

PAGE n°1 Begin 14.5 ms 14.4 ms 8 201.7 Ko 10 860.1 Ko

Table n°1 Begin 20.3 ms 5.9 ms 8 279.8 Ko 10 860.1 Ko

Table n°1 End 205.5 ms 185.2 ms 8 393.3 Ko 10 860.1 Ko

Table n°2 Begin 205.8 ms 0.3 ms 8 400.5 Ko 10 860.1 Ko

Table n°2 End 296.0 ms 90.1 ms 8 452.1 Ko 10 860.1 Ko

PAGE n°1 End 296.1 ms 0.1 ms 8 451.9 Ko 10 860.1 Ko

Before output 296.2 ms 0.1 ms 8 387.1 Ko 10 860.1 Ko

Par contre le log s'arrête au 1er élement de la boucle ?

Sinon pour la boucle, je ne comprend pas bien... confus un writeHTML, c'est bien ce que je fait non ?


require_once(dirname(__FILE__).'/html2pdf/html2pdf.class.php');
try
{
$html2pdf = new HTML2PDF('P','A4','fr', false, 'ISO-8859-15');
// $html2pdf->setModeDebug();
$html2pdf->setDefaultFont('Arial');
$html2pdf->pdf->SetProtection(array('print'), ''); // protection
$html2pdf->writeHTML($content, isset($_GET['vuehtml']));
$html2pdf->Output('./TEST.pdf');
}

catch(HTML2PDF_exception $e) { echo $e; }

9

permet de tout imprimer en une seule fois :
 try 
 { 
 	$html2pdf = new HTML2PDF('P','A4','fr', false, 'ISO-8859-15'); 
 	$html2pdf->setDefaultFont('Arial'); 
 	$html2pdf->pdf->SetProtection(array('print'), ''); // protection 
 	for($page=0; $page<$nb_page; $page++)
 	{
 	 	// construction de $content pour la page $page
 	 	$content = ...;

 	 	$html2pdf->writeHTML($content); 
 	}
 	$html2pdf->Output();
 } 
 catch(HTML2PDF_exception $e) { echo $e; }


permet d'envoyer un email par page
 try 
 { 
 	for($page=0; $page<$nb_page; $page++)
 	{
 	 	// construction de $content pour la page $page
 	 	$content = ...;

 	 	// conversion
 		$html2pdf = new HTML2PDF('P','A4','fr', false, 'ISO-8859-15'); 
 	 	$html2pdf->setDefaultFont('Arial'); 
 	 	$html2pdf->pdf->SetProtection(array('print'), ''); // protection 
 	 	$html2pdf->writeHTML($content); 
 		$content_pdf = $html2pdf->Output('', 'S');

		// envoyer par email le fichier généré
		...
 	}
 } 
 catch(HTML2PDF_exception $e) { echo $e; }
Ancien pseudo : lolo

10

Oui c'est ce que je fais...
Et le problème se passe lors de la génération de 1 PDF ou 1 email par page.

$requete = mysql_query("SELECT * FROM xxx ORDER BY nom",$connexion);
while($enreg = mysql_fetch_array($requete))
{
$i++; // incrémentation

if (($action == 'mail') &&($i <= 10 )) // Dans le cas d'un envoi par mail

{
ob_start();
include(dirname(__FILE__).'/PDF/factureType.php');
$content = ob_get_clean();

// conversion HTML => PDF
require_once(dirname(__FILE__).'/html2pdf/html2pdf.class.php');
try
{
$html2pdf = new HTML2PDF('P','A4','fr', false, 'ISO-8859-15');
//$html2pdf->setModeDebug();
$html2pdf->setDefaultFont('Arial');
$html2pdf->pdf->SetProtection(array('print'), ''); // protection
$html2pdf->writeHTML($content, isset($_GET['vuehtml']));
$content_PDF = $html2pdf->Output('', true);



// Envoi du mail

require_once(dirname(__FILE__).'/pjmail/pjmail.class.php');
$mail = new PJmail();
$mail->setAllFrom('3gimmo@3gimmo.net', "Facture");
$mail->addrecipient('contact@symbiozis.fr');
$mail->addsubject("Exemple envoie de PDF");
$mail->text = "Ceci est un exemple d'envoie de fichier PDF";
$mail->addbinattachement("mon_document.pdf", $content_PDF);
$res = $mail->sendmail();
}
catch(HTML2PDF_exception $e) { echo $e; }


}


Ce qui équivaut à la boucle FOR.

Et qui me donne comme résultat de ne pas générer la ou les 1eres factures (ca dépend : parfois une, parfois deux)...

11

cela peut venir du serveur de mail qui n'arrive pas à se prendre ces mails d'un seul coup.

plutot que de tout envoyer d'un seul coup, ce qui se fait généralement est d'utiliser un mailqueue : une table dans laquelle on insere les mails que l'on souhaite envoyer, et toutes les 5 minutes (par exemple), un script en cron va les envoyer, et gérer tout ce qui est erreur en mettant les mails non parti dans une table dédiée aux erreurs. regarde sur le net comment mettre tout ca en place
Ancien pseudo : lolo