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

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
Alex03
Mesaje:7

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

Salut, am şi eu o problemă cu un exemplu din lecţia Creare PDF cu PHP (2) la Demo cu numărul 8. Primesc eroarea din titlu. Acesta este codul:

Cod: Selectaţi tot

<?php
include('fpdf.php');  // Include clasa FPDF

// Creaza clasa extinsa a clasei de baza FPDF
class PDF extends FPDF {
  // Definirea variabilei pt. lucru cu adresa URL
  var $HREF;

  // Functia care scrie textul si recunoaste tagu-urile HTML
  function WriteHTML($html) {
    // Inlocuieste cu spatiu linia noua si parseaza tag-ul HTML
    $html = str_replace("\n",' ',$html);
    $a = preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE);
    foreach($a as $i=>$e) {
      if($i%2==0) {
        // Daca in tag e recunoscut href
        if($this->HREF) $this->PutLink($this->HREF,$e);
        else $this->Write(5,$e);
      }
      else {
        // Daca este eticheta de inchidere a tag-ului
        if($e[0]=='/') $this->CloseTag(strtoupper(substr($e,1)));
        else {
          // Extrage atributele
          $a2 = explode(' ',$e);
          $tag = strtoupper(array_shift($a2));
          $attr=array();
          foreach($a2 as $v) {
            if(preg_match('/([^=]*)=["\']?([^"\']*)/',$v,$a3))
              $attr[strtoupper($a3[1])] = $a3[2];
          }
          $this->OpenTag($tag,$attr);
        }
      }
    }
  }

  // Functia pt. determinarea actiunii in functie de tag-ul HTML recunoscut
  function OpenTag($tag,$attr) {
    // Daca tag-ul este B, I sau U
    if($tag=='B' || $tag=='I' || $tag=='U') $this->SetStyle($tag,true);
    // Daca tag-ul e A
    if($tag=='A') $this->HREF=$attr['HREF'];
    // Daca tag-ul e BR
    if($tag=='BR') $this->Ln(5);
  }

  // Functia pt. actiunea la inchiderea tag-ului
  function CloseTag($tag) {
    // Daca tag-ul inchis este B, I sau U
    if($tag=='B' || $tag=='I' || $tag=='U') $this->SetStyle($tag,false);
    // Daca tag-ul inchis e A
    if($tag=='A') $this->HREF='';
  }

  // Functia pt. setarea stilului textului in functie de tipul tag-ului B, I, U
  function SetStyle($tag,$enable) {
    // Seteaza stilul fontului in functie de tag-ul B, I sau U
    $this->$tag+=($enable ? 1 : -1);
    $style = '';
    foreach(array('B','I','U') as $s) {
      if($this->$s>0) $style.=$s;
    }
    $this->SetFont('',$style);
  }

  // Functia pt. adaugarea link-ului
  function PutLink($URL,$txt) {
    // Seteaza fontul specific link si apeleaza metoda Write() cu atribut pt. URL
    $this->SetTextColor(0,0,255);
    $this->SetStyle('U',true);
    $this->Write(5,$txt,$URL);
    $this->SetStyle('U',false);
    $this->SetTextColor(0);
  }
}

// Variabila ce contine textul cu elemente HTML
$html = 'Text care contine tag-uri HTML a caror stil va fi recunoscut si modificat pentru PDF, pentru a fi similar cu stilul afisat in pagina HTML.<br />
Linie noua adaugata cu BR, stilurile recunoscute: <b>bold</b>, <i>italic</i>, <u>underlined</u>, sau <b><i><u>toate la un loc</u></i></b>!<br><br>
    Link adaugat prin recunoasterea tag-ului "A" specific pt. link-uri, <a href="https://marplo.net/php-mysql/">Curs PHP - MySQL</a>';

$pdf = new PDF();
$pdf->AddPage();
$pdf->SetFont('Arial','',14);

// Apeleaza metoda WriteHTML() creata in clasa extinsa
// transferand ca argument variabila $html
$pdf->WriteHTML($html);

$pdf->Output();
?>
De asemenea şi nişte notice-uri cum că tag-urile <b><u><i> nu sunt definite. Ceva idei de rezolvare a problemei? Am tot căutat pe net acea eroare dar nu am găsit nimic concret aplicabil în cazul ăsta :)

MarPlo Mesaje:4343
Salut
Nu stiu sigur care sa fie problema, dar din enuntul mesajului de eroare se intelege ca au fost trimise date de iesire la browser inainte de generarea documentului PDF.
Date de iesire pot fi orice cod html, caractere, sau chiar spatiu inainte de <?php.
Alte date de iesire pot fi cele prin "echo", "print", sau alta eroare generata inainte.
Poate ca versiunea acelei clase FPDF e depasita fata de noile versiuni PHP (e de vreo 3 ani facuta).

- Vezi ce gasesti in rezultatele la cautare: FPDF error: Some data has already been output, can't send PDF, mai mult nu stiu legat de asta.

Alex03 Mesaje:7
Mulţumesc mult de feedback, am căutat în acele link-uri chiar pe primele trei le-am luat, dar nu am găsit vreun spaţiu sau ceva echo, print sau ceva de genul. Tind să cred că e totutuşi ultima variantă:"Poate ca versiunea acelei clase FPDF e depasita fata de noile versiuni PHP (e de vreo 3 ani facuta)."

E ok dacă întreb pe stackflow, şi le dau exemplul ăsta?

MarPlo Mesaje:4343
Ultima versiune la FPDF e v1.7 (2011-06-18), de atunci s-au facut multe schimbari in PHP. Tinand cont de asta, mai util ar fi sa folosesti alta clasa de creare documente PDF in PHP, mai actuala.
De exemplu:
- mPDF - ( mpdf.bpm1.com/ ) - 2014.
- TCPDF - PHP class for PDF - ( sourceforge.net/projects/tcpdf/ ) - 2014.

Inveti din documentatia si exemplele lor cum se foloseste.

Alex03 Mesaje:7
Ok, mulţumesc mult de recomandări :)

Alex03 Mesaje:7
Am reuşit să adaptez codul din Demo 8, folosind TCPDF. Îl pun aici, poate ajută pe cineva. Fişierul trebuie salvat în examples, pt că acolo se află şi tcpdf_include.php.

Cod: Selectaţi tot

<?php
// Include the main TCPDF library (search for installation path).
require_once('tcpdf_include.php');

// create new PDF document
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

// remove default header/footer
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);

// set default monospaced font
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

// set auto page breaks
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

// set image scale factor
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

// set font
$pdf->SetFont('dejavusans','',13);

// add a page
$pdf->AddPage();

// writeHTML($html, $ln=true, $fill=false, $reseth=false, $cell=false, $align='')
// writeHTMLCell($w, $h, $x, $y, $html='', $border=0, $ln=0, $fill=0, $reseth=true, $align='', $autopadding=true)

// create some HTML content
$html = 'Text care contine tag-uri HTML a caror stil va fi recunoscut si modificat pentru PDF, pentru a fi similar cu stilul afisat in pagina HTML.<br />
Linie noua adaugata cu BR, stilurile recunoscute: <b>bold</b>, <i>italic</i>, <u>underlined</u>, sau <b><i><u>toate la un loc</u></i></b>!<br><br>
          Link adaugat prin recunoasterea tag-ului "A" specific pt. link-uri, <a href="https://marplo.net/php-mysql/">Curs PHP - MySQL</a>';
    
// output the HTML content
$pdf->writeHTML($html, true, false, true, false, '');

//Close and output PDF document
$pdf->Output();    
?>