FPDF error: Some data has already been output, can't send PDF file

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • [Problème] FPDF error: Some data has already been output, can't send PDF file

    Bonjour,
    suis en train de faire une petite modification sur un formulaire créé à partir de ck Form sous joomla 2.5. Le formulaire en question enregistre les champa dans la base de données mais aussi créé un document pdf de l'inscription pour l'usager. Mon conde fonctionne très bien jusqu'à ce que je lui colle le output de fpdf voir function ci-dessous

    function creaPdf(){
    echo 'hello function crea pdf';
    //get variables
    $name=addslashes($_POST['Nom']);
    $firstName=addslashes($_POST['prenom']);
    $dob=$_POST['dob'];
    $email=$_POST['email'];
    $tel=$_POST['tel'];
    $job=$_POST['job'];
    $mail=$_POST['email'];
    $city=$_POST['city'];
    $zip=$_POST['zip'];
    $emergency=$_POST['contact'];
    $stage=$_POST['stage'];
    foreach($_POST["stage"] as $valueStage)
    {
    // traitements : $valueStage contient les valeurs successives
    $stage=$valueStage[0];
    }
    $type=$_POST['type'];
    $dateStage1=$_POST['date1'];
    $dateStage2=$_POST['date2'];
    foreach($_POST["census"] as $value)
    {
    // traitements : $value contient les valeurs successives
    $census=$value[0];
    }

    //add on euro sign
    $euro = chr(128).'.';

    ////////WRITES PDF
    /////creates pdf
    require_once("fpdf/textbox.php");
    require_once("fpdf/fpdf.php");
    $pdf=new PDF('P','mm','A4');
    ob_start();
    $pdf->AddPage();
    ob_get_clean();
    $pdf->Output();
    }

    Ceci a la facheuse systématique de me mettre un "FPDF error: Some data has already been output, can't send PDF file".

    Cela fait maintenant 2 jours que je passe à essayer de détourner le soucis sans parvenir à garder à la fois la fonctionnalité de fpdf et de ck Forms simultanément.

    AU SECOURS!

  • #2
    Re : FPDF error: Some data has already been output, can't send PDF file

    Le principe du PDF est simple.
    Si quelque chose est déja dans le "output" alors le PDF ne peut se créer.
    cela peut venir d'un plugin ou autre qui ajoute une valeur dans le buffer avant. même un simple espace suffit a annuler le rendu du PDF.
    d'ailleur je soupçonne que ton
    echo 'hello function crea pdf';
    en est la cause.
    N'ayant pas tous le code générant ta sortie PDF , la cause peu venir d'autre part.

    Un example simple(celui de fpdf)
    Code PHP:
    $pdf = new FPDF();
    $pdf->AddPage();
    $pdf->SetFont('Arial','B',16);
    $pdf->Cell(40,10,'Hello World !');
    $pdf->Output(); 
    pour afficher hello world

    si tu veut récupérer le buffer faire un premier
    Code PHP:
    $buffer ob_get_clean(); 
    puis
    Code PHP:
    $pdf = new FPDF();
    $pdf->AddPage();
    $pdf->SetFont('Arial','B',16);
    $pdf->Cell(40,10,$buffer);
    $pdf->Output(); 
    attention fpdf ne fait pas du html mais du pdf pure d'origine,n'est pas compatible UTF-8 mais est trés rapide.
    Et n'oublie pas l'exemple est minimale sr le site de fpdf tu auras plus d'exemple.
    http://www.st42.fr : Astuce et téléchargement d’extension Joomla! et virtuemart
    http://shop.st42.fr Catalogue extentions gratuit et Pro pour Virtuemart et Joomla

    Commentaire


    • #3
      Re : FPDF error: Some data has already been output, can't send PDF file

      mets ton echo 'hello function crea pdf'; après
      Christophe
      http://www.webcrea.fr

      Commentaire


      • #4
        Re : FPDF error: Some data has already been output, can't send PDF file

        non, rien y fait!

        J'ai bien essayé avec le code minimum de fpdf mais j'obtiens toujours la meme reponse

        "FPDF error: Some data has already been output, can't send PDF file"

        Ci-dessous, le code du controller.php du formulaire CK Forms qui entre les données ds base de données
        tout en bas de code, j'ai inséré
        if($_POST['triggerPdf']!= ""){
        $this->creaPdf();
        }
        qui lance le creaPdf comme son nom l'indique

        Je m'arrache un peu les cheveux, je ne comprends pas ou cela bug.

        Cookex (programmateur du formCK reste sourd et muet à question)

        Suis tombé sur un article qui évoquait que les documents utf-8 avec BOM pouvaient générer des espaces avant les balises php. Je ne peux malheureusement pas tester la chose, ne dispoe pas de notepadd++ sous mac pour éventuellement transformer utf-8 en utf-8 sans BOM.


        <?php
        /**
        * Ck forms default controller
        *
        * @package CK.Joomla
        * @subpackage Components
        * @link http://www.cookex.eu
        * @license GNU/GPL
        */

        jimport('joomla.application.component.controller') ;

        /**
        * Ck forms Component Controller
        *
        * @package CkForms
        */
        class CkformsController extends JController
        {
        /**
        * Method to display the captcha to validate the form
        *
        * @access public
        */

        function captcha()
        {
        include("components/com_ckforms/captcha/securimage.php");

        $document = &JFactory::getDocument();
        $doc = &JDocument::getInstance('raw');
        $document = $doc;

        $img = new Securimage();
        //$img->ttf_file = Juri::root(false)."components/com_ckforms/captcha/AHGBold.ttf";
        $bckgrd_img=Juri::root(false)."components/com_ckforms/captcha/bg6.png";
        $dir_img=dirname(__FILE__) ."/captcha/backgrounds/";
        $img->background_directory = $dir_img;
        $img->captcha_type=rand(0,1); // tirage type de captcha
        $img->show();
        }

        function display()
        {
        $model = $this->getModel('ckforms');
        $model->addHits();

        $_SESSION['ck_send_once'.JRequest::getCmd('id')] = "1";
        $_SESSION['ck_cache_page_'.JRequest::getCmd('id')] = md5(JRequest::getURI());

        parent::display();
        }

        /**
        * save a record (and redirect to main page)
        * and send emails
        * @return void
        */
        function send()
        {
        $model = $this->getModel('ckforms');
        $ckform = $model->getData();

        if ($ckform->captcha == 1)
        {
        include("components/com_ckforms/captcha/securimage.php");

        $img = new Securimage();

        $valid = $img->check($_POST['ck_captcha_code']);

        if($valid == false) {
        JError::raiseWarning( 0, JText::_( COM_CKFORMS_ERR_01));

        $this->display();
        return false;
        }
        }
        if (isset($_SESSION['ck_send_once'.$ckform->id]))
        {
        unset($_SESSION['ck_send_once'.$ckform->id]);
        } else {
        JError::raiseWarning( 0, JText::_( COM_CKFORMS_ERR_02 ));
        return false;
        }

        unset($_SESSION['securimage_code_value']);

        $post = JRequest::get('post', JREQUEST_ALLOWHTML);

        $model->saveData($post);

        if (isset($_SESSION['ck_cache_page_'.$ckform->id]))
        {
        $cacheid = $_SESSION['ck_cache_page_'.$ckform->id];
        $cache = &JFactory::getCache();
        $cacheresult = $cache->remove($cacheid, 'page');
        }

        $msg = JText::sprintf(COM_CKFORMS_MSG_01, 1);

        if ( isset($ckform->redirecturl) && $ckform->redirecturl != "") {

        $params = '';

        if ($ckform->redirectdata == 1)
        {
        foreach ($post as $key => $value) {
        $params = $params . '&'. $key.'='.htmlentities($value);
        }
        if (strlen($params) > 0 && strpos($ckform->redirecturl, '?') === false)
        {
        $params = '?'.substr($params, 1);
        }
        }
        $this->setRedirect($ckform->redirecturl.$params);


        } else if ((isset($ckform->redirecturl) == false || $ckform->redirecturl == "")
        && ((isset($ckform->textresult) == false || $ckform->textresult == ""))) {
        $this->setRedirect(JURI::base(), $msg);
        }


        JRequest::setVar( 'view', 'ckforms' );
        JRequest::setVar( 'layout', 'message' );

        parent::display();

        if($_POST['triggerPdf']!= ""){
        $this->creaPdf();
        }

        }
        //MY ADD ON TO TRIGGER PDF CREATION IF COMING FROM REGISTRATION FOR COURSES ELSE DISPLAY
        function creaPdf(){
        require_once("fpdf/textbox.php");
        require_once("fpdf/fpdf.php");
        $pdf = new FPDF();
        $pdf->AddPage();
        $pdf->SetFont('Arial','B',16);
        $pdf->Cell(40,10,'Hello World !');
        $pdf->Output();
        }
        //ENDS PERSONAL ADD ON
        }
        ?>

        Commentaire


        • #5
          Re : FPDF error: Some data has already been output, can't send PDF file

          ajoute un
          ob_get_clean(); pour vider le tampon de sortie
          juste avant
          $pdf = new FPDF();
          cela fonctionnera
          http://www.st42.fr : Astuce et téléchargement d’extension Joomla! et virtuemart
          http://shop.st42.fr Catalogue extentions gratuit et Pro pour Virtuemart et Joomla

          Commentaire


          • #6
            Re : FPDF error: Some data has already been output, can't send PDF file

            ok, cela fonctionne,
            reste un soucis : le code créé donc le document pdf enregistre les parametres dans base de données, donc tout se passe bien, par contre, la page reste figée sur le formulaire d'inscription alors qu'il devrait passer sur la page de confirmation. Je suppose que la ligne d'appel à a fonction creaPdf n'est pas placé au bon endroit.
            J'ai bien essayé de la mettre en ligne 91 ( $model->saveData($post); ). même résultat.
            Quelqu'un est-il familier avec l'encodage des formulaires CKForms?
            Merci d'avance.

            Commentaire


            • #7
              Re : FPDF error: Some data has already been output, can't send PDF file

              si tu veux ajouter le tampon de sortie dans ton create PDF il faut l'envoyer vers la fonction
              Genre

              Code PHP:
               $output parent::display();

              if(
              $_POST['triggerPdf']!= ""){
              $this->creaPdf($output);

              Code PHP:
              function creaPdf($output){
              ....
              $pdf = new FPDF();
              $pdf->AddPage();
              $pdf->SetFont('Arial','B',16);
              $pdf->Cell(40,10,$output);
              $pdf->Output(); 
              Attention ce code est incomplet, a toi de travailler un peu
              voir : http://php.net/manual/fr/function.ob-get-clean.php et http://www.php.net/manual/fr/functio...t-contents.php
              Mais attention le moindre code HTML non conforme, balise manquant et autre, fera une erreur PDF.
              http://www.st42.fr : Astuce et téléchargement d’extension Joomla! et virtuemart
              http://shop.st42.fr Catalogue extentions gratuit et Pro pour Virtuemart et Joomla

              Commentaire

              Annonce

              Réduire
              Aucune annonce pour le moment.

              Partenaire de l'association

              Réduire

              Hébergeur Web PlanetHoster
              Travaille ...
              X