php_naute Le 12/04/2011 à 12:04Edité par php_naute le 12/04/2011 à 15:49 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
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 ?
Spipu Le 12/04/2011 à 14:16 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.
php_naute Le 12/04/2011 à 15:03Edité par php_naute le 12/04/2011 à 15:42 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
if (isset($_SESSION['flag'])) {
unset ($_SESSION['flag']);
include('test_html2pdf.php');
}
else {
$_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);
$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
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
php_naute Le 12/04/2011 à 15:37Edité par php_naute le 12/04/2011 à 22:53 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
php_naute Le 12/04/2011 à 15:39Edité par php_naute le 12/04/2011 à 16:07 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);
$html2pdf->Output('exemple.pdf');
?>
voila, merci pour votre aide