1

bonjour,

j'ai lancé le script minimal de teste de html2dpf et j'ai obtenu cette exeption:

TCPDF ERROR: Some data has already been output, can't send PDF file

J'ai résolu le probleme en rajoutant un ob_clean(); juste avant le > $html2pdf->Output('exemple.pdf');

voici ci dessous le code qui ne fonctionne pas sur mon environnement: <?php $content = "<page> <h1>Exemple d'utilisation</h1> <br> Ceci est un <b>exemple d'utilisation</b> de <a href='http://html2pdf.fr/'>HTML2PDF</a>.<br></page>"; require_once(dirname(__FILE__).'/html2pdf_v4.01/html2pdf.class.php'); $html2pdf = new HTML2PDF('P','A4','fr'); $html2pdf->WriteHTML($content); $html2pdf->Output('exemple.pdf'); ?>
$html2pdf->Output('exemple.pdf'); ?>voici ci dessous le code qui fonctionne.<?php $content = "<page> <h1>Exemple d'utilisation</h1> <br> Ceci est un <b>exemple d'utilisation</b> de <a href='http://html2pdf.fr/'>HTML2PDF</a>.<br></page>"; require_once(dirname(__FILE__).'/html2pdf_v4.01/html2pdf.class.php'); $html2pdf = new HTML2PDF('P','A4','fr'); $html2pdf->WriteHTML($content); ob_clean();

Voila pour ceux qui rencontreront le probleme.

Si non, j'aimerais bien savoir comment marche la gestion de l'output au niveau du navigateur.
merci pour vos réponses.

@+ php_naute

2

ob_clean ne sert a rien ici puisque le contenu du pdf est directement dans une chaine. Les fonctions ob_truc servent quand tu veux capturer ce qui devrait être envoyé par echo, par exemple

<?php
ob_start(); ?>
du blabla a capturer
<?php
echo "pwet";
$contenu = ob_get_contents();
//ici $contenu contient "\r\ndu blabla a capturer\r\npwet"

.....
$html2pdf->WriteHTML($contents);
$html2pdf->Output('exemple.pdf');
?>

mais dans ton cas je pense pas que ça change grand chose, je sais pas trop. Y'avait pas une espace ou une ligne vide avant le tag ouvrant <?php ?

3

toutes les fonctions ob_XXX servent à intercepter la sortie PHP, afin de la manipuler, la mettre en cache, l'effacer. ob = Output Buffer

dans ton cas, avant de créer l'HTML, tu dois avoir quelque chose qui envoie quelque chose dans la sortie PHP. Hors il faut savoir que dès que tu commences à envoyer quelque chose au navigateur, les entêtes HTTP sont envoyées automatiquement avant, car elles doivent toujours précéder tout contenu, étant donné que c'est elles qui indiquent comment lire le contenu. Du coup, le ob_clean() que tu rajoutes efface le buffer de sortie afin de ne pas envoyer les headers. Car si les headers sont déjà envoyées, TCPDF ne peut plus les modifier afin d'indiquer que c'est un PDF qui va suivre.

utiliser ob_clean() n'est pas la bonne solution. Ca revient à constater qu'on a un trou qui arrête pas de se creuser dans son jardin et à mettre une planche dessus, plutôt que d'arrêter la cause de ce trou.
Ancien pseudo : lolo

4

J'utilise netbeans pour développer mes projets.
Pour tester une classe ou une lib, je fais toujours un projet basique uniquement dédié à ce teste.
En l'occurence, je te propose la structure et le code de ce projet.

deux fichier:
-index.php
-test_html2pdf.php

idex.php <?php session_start(); header('Content-type: text/html; charset=utf-8'); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title>Recherch-emploi</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <meta http-equiv="Content-Language" content="fr" /> </head> <body> <?php //SELECTEUR : selectionner un fichier (si on a clique sur le lien) les fichiers en commentaires sont déselectionnés if (isset($_SESSION['flag'])) { unset ($_SESSION['flag']); include('test_html2pdf.php'); //include('test_fpdf.php'); } /*quand on ouvre index.php pour la premiere fois*/ else { //permettre d'entrer dans le selecteur $_SESSION['flag'] = 1; ?> <a href="index.php">lance test_html2pdf</a> <?php } ?> </body> </html>


test_html2pdf.php <?php $content = "<page> <h1>Exemple d'utilisation</h1> <br> Ceci est un <b>exemple d'utilisation</b> de <a href='http://html2pdf.fr/'>HTML2PDF</a>.<br></page>"; require_once(dirname(__FILE__) . '/html2pdf_v4.01/html2pdf.class.php'); $html2pdf = new HTML2PDF('P', 'A4', 'fr'); $html2pdf->WriteHTML($content); //ob_clean(); $html2pdf->Output('exemple.pdf'); ?>

Voila, c'est cette version qui entraine l'erreur
Cette erreur persite que j'utilise firefox ie,
que je lance en local dans xampp ou sur le serveur distant

en te remerciant pour ton aide php_naute


5

C'est exactement ce qu'on te dit, tu essayes d'envoyer au client un fichier PDF, alors que fait tout ton blabla doctype html machin avant l'inclusion? comment veux tu que le serveur puisse envoyer ses headers?

ce truc marcherait mieux, pour un test t'as vraiment pas besoin d'un doctype:
<?php 
session_start(); 
if (isset($_GET['flag'])) { 
    include('test_html2pdf.php'); 
    die();
    //include('test_fpdf.php'); 
} else { 
 header('Content-type: text/html; charset=utf-8'); 
?> 
        <a href="index.php">lance test_html2pdf</a> 
<?php 
} 
?> 


je vois d'ailleurs même pas pourquoi tu te fais chier avec ton include alors qu'il suffit de lancer test_html2pdf directement.

<title>Recherch-emploi</title>
gné?

6

Oui et tout d'abord bonjour squalyl.

1 je fais l'include parceque si il y a besoin, je peux faire des testes directement sur la lib (comme par exemple réupérer un code sur le site de TCPDF faire des teste dessus pour voir si le pb vient de la).

2 J'essaye immédiatement ta solution.

cordialement php_naute

7

espérant que ça aide smile (bonjour oui ^^)

d'ailleurs au passage avec ton prog de test tu aurais le même problème si tu tentais de faire une image, avec gd2 par exemple.

8

bien, j'ai enlevé le doctype et tout le blabla dans index.php

Meme erreur.
TCPDF ERROR: Some data has already been output, can't send PDF file

9

j'ai fais ça et ça marche:

index.php <?php $content = "<page> <h1>Exemple d'utilisation</h1> <br> Ceci est un <b>exemple d'utilisation</b> de <a href='http://html2pdf.fr/'>HTML2PDF</a>.<br></page>"; require_once(dirname(__FILE__) . '/html2pdf_v4.01/html2pdf.class.php'); $html2pdf = new HTML2PDF('P', 'A4', 'fr'); $html2pdf->WriteHTML($content); //ob_clean(); $html2pdf->Output('exemple.pdf'); ?>

voila, merci pour votre aide

10

as-tu lu ce que j'ai marqué ici ??? ./3

de plus, ta "structure" est (désolé) pourrie.... car elle impose direct l'ouverture de session, un header inutile, une structure complète HTML (qui parasitera tout sortie autre que HTML), des espaces avant le DOCTYPE (il ne doit y avoir aucun caractère quel qu'il soit avec un doctype), et la sélection du test à lancer via un flag en session alors que lancer le fichier directement est suffisant.

je te conseille fortement de choisir une autre structure de projet pour tes tests....

sinon, côté IDE pour programmer, je prefère "Eclipse PHP" à netbeans, mais c'est plus un choix perso (sans doute lié à mes habitudes)

as-tu essayer de lancer directement les exemples fournis dans le zip ?
Ancien pseudo : lolo

11

Ok, je crois que j'ai compris.
Merci Spipu et squalyl pour ce cours particulier de php htmtl. smile

cordialement php_naute.