web-dev-qa-db-fra.com

Erreur TCPDF & mPDF: Certaines données ont déjà été envoyées au navigateur, impossible d'envoyer PDF fichier

Le problème:

Erreur TCPDF & mPDF: Certaines données ont déjà été exportées dans le navigateur. Impossible d'envoyer le fichier PDF . J'ai renoncé à essayer de réparer l'erreur avec TCPDF et installé mPDF uniquement pour obtenir le même erreur lors de la tentative de rendu du document dans le navigateur. Je peux très bien enregistrer le document et l’afficher dans le navigateur lors de la récupération. 

De plus, cette erreur ne s'est présentée qu'après le basculement de mon serveur dev vers mon serveur hôte. Fonctionne correctement sur le serveur DEV (serveur DEV = WAMPSERVER, serveur PROD = Hostgator Linux).

Dépannage:

J'ai lu les nombreux volumes d'autres discussions sur Internet concernant ce problème et je ne peux trouver aucun problème lié à l'espace blanc. J'ai condensé la demande à ce qui suit:

<?php
ob_start(); 
$html = "Hello World";
include("../mpdf.php");
$mpdf=new mPDF(); 
$mpdf->WriteHTML($html);
$mpdf->Output();
ob_end_clean();
?>

Essayé le même concept avec TCPDF en utilisant la méthode ob_clean () avant writeHtml. Même erreur dans tous les cas (je peux assurer à tout le monde que ce n’est pas un problème d’espace blanc - j’ai même visualisé le fichier au format hexadécimal pour s’assurer que l’éditeur n’avait inséré aucun caractère impair).

Indice possible:

J'ai enfin pu avoir un indice sur ce qui se passait lorsque j'ai déplacé toute la bibliothèque mPDF, ainsi que les classes et les dossiers dans le dossier public_html, plutôt qu'à partir de mon dossier d'application (projet Symfony). Dans ce scénario, lorsque j'ai pointé mon navigateur vers les exemples de pages, le rendu était parfait, sans aucune erreur (et c'était très rapide, en fait). Donc, je sais que cela fonctionne, et je sais qu’il n’ya pas de problème lié à l’espace blanc, ni à aucun autre problème lié, concernant le code ou l’installation (du côté du format mPDF/TCPDF). Ce qui me porte à croire que symfony est en train d'insérer des en-têtes de quelque sorte (ce que j'ai essayé de supprimer avec: clearHttpHeaders ()), ou il y a un paramètre PHP INI ou CONFIG qui me manque quelque part sur le serveur PROD. 

Est-ce que quelqu'un a une idée de ce qui se passe ici? 

Mise à jour: stream dump:

Request URL:http://www.example.com/mpdf
Request Method:GET
Status Code:200 OK

Request Headers
GET /mpdf HTTP/1.1
Host: www.example.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: __utma=44708724.1463191694.1383759419.1383759419.1383765151.2; __utmz=44708724.1383759419.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); PHPSESSID=9c7c802200b9d8eefe718447755add5f; __utma=1.813547483.1383767260.1385127878.1385130071.38; __utmb=1.7.10.1385130071; __utmc=1; __utmz=1.1383767260.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)

Response Headers
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:Keep-Alive
Content-Type:text/html
Date:Fri, 22 Nov 2013 14:59:52 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive:timeout=5, max=75
Pragma:no-cache
Server:Apache
Transfer-Encoding:chunked

Rien ne me saute dessus… d'autres pensées?

7
Patrick

Il s'agit probablement du marqueur de nomenclature, utilisez votre IDE pour le supprimer. Les autres correctifs peuvent être:

<?php

$html = "Hello World";
include("../mpdf.php");

ob_clean(); // cleaning the buffer before Output()

$mpdf=new mPDF(); 
$mpdf->WriteHTML($html);
$mpdf->Output();

?>
4
biesior

Il pourrait s'agir d'un avertissement émis par PHP avant la sortie pdf->. Le texte d'avertissement est envoyé au navigateur du client et le fichier ne peut donc pas être envoyé.
Si votre niveau d’avertissement n’est pas le même pour DEV et PROD, cela pourrait expliquer la différence de comportement.

Dans mon cas, avec TCPDF, j'avais de nombreux avertissements tels que "date (), il n'est pas sûr de s'appuyer sur les paramètres de fuseau horaire du système ...", puis l'erreur "Certaines données ont déjà été émises vers le navigateur, impossible d'envoyer PDF ".
L'ajout de la fonction date_default_timezone_set () dans mon code source php a résolu les avertissements et l'erreur.

1
tetorea

J'ai le même problème et j'ajoute cette ligne avant $ pdf-> output ():

error_reporting(E_ALL);

Puis j’ai trouvé que j’avais une nomenclature sur certains fichiers. Et je vois un message d’avertissement envoyé au navigateur.

Bonne chance !!

Cordialement

1
Nicolas400

Peut-être que cela se produit parce que dans votre résultat de code HTML, vous avez une erreur à générer pour créer le TCPDF ... 

OU 

Si ce qui précède ne fonctionne pas, essayez de définir le jeu de caractères comme UTF-8 dans le fichier de classe de TCPDF, cela pourrait-il résoudre votre problème ...

Parce que ce type d'erreur se produisait dans mon projet il y a une semaine ...

0
Jignesh Vagh

Essayez d’utiliser ob_clean(); avant include("../mpdf.php");.

0
Sawan

Supprimez tous les fichiers que vous auriez inclus au début de la page. Dans mon cas, c'était un fichier qui se connectait avec la base de données. Cela a fonctionné pour moi. (Astuce de @ Nicolas400)

0
Zigsaw Consultancy