FPDF

moriva

Power Member
Queria implementar no meu site dinamico um sistema de criação de ficheiros em pdf com FPDF mas da um erro e não cria o ficheiro em pdf.
O erro que dá é este:
Código:
[B]FPDF error: [/B]Some data has already been output, can't send PDF file

Eu ja tinha colocado um outro post aqui a tempos com esta materia e indicaram-me um outro post da techzone.
Podiam desta vez ser mais concretos neste problema e indicar-me o que poderá ser.
Se precisarem de codigo digam.
Obrigado desde já pela atenção.Cumprimentos!
 
nunca trabalhei com isso mas parece ser o mesmo tipo de erro que costuma acontecer com os headers e as sessions.
basicamente não podes fazer output nenhum (um echo por exemplo) antes de usares essas funções. primeiro fazes o que tens a fazer com isso e só depois podes por output
 
Este é o ficheiro de criação do pdf:

Código:
<?php
      if (!isset($_SESSION)) {
         session_name("sessao");
         ob_start();
         session_start();
      }
?>
<?php
     include_once('connect.php');
    // obter dados da tabela
    $jogo=$_REQUEST['Cod_Jogo'];
    $consulta="select * from Andebol where Cod_Jogo='".$jogo."'";
    $resultado=mysql_query($consulta);
    $nregistos=mysql_num_rows($resultado);
    $linha = mysql_fetch_array($resultado);
    
    require('css/fpdf.php');
    $pdf=new FPDF();
    $pdf->SetMargins(20, 20, 20);
    $pdf->AddPage();
    $pdf->SetFillColor('220','220','220');
    $avancoX = 8;
    $pdf->SetFont('Times','I',12);
    $maxRotuloWidth = $pdf->GetStringWidth('xxxxxxxxxxxxxxxxxxxxxxxxxxxxx');

    $pdf->SetFont('Times','I',18);
    $pdf->Cell($pdf->GetStringWidth(utf8_decode('Jogo de ')), 8, utf8_decode('Jogo de '), '0', 0, 'L', 1);
    $pdf->SetFont('Times','B',18);
    $pdf->Cell(0, 8, utf8_decode('Andebol'), '0', 0, 'L', 1);

    $pdf->ln();
    $pdf->ln();
    $pdf->ln();
    $pdf->SetFont('Times','I',16);
    $pdf->Cell($maxRotuloWidth, 8, utf8_decode('Codigo de Jogo: '), 'B');
    $pdf->SetFont('Arial','B',20);
    $pdf->Cell(50, 8, utf8_decode(utf8_encode($linha['Cod_Jogo'])), '', 1);

// Jogo
    $pdf->SetFont('Arial','B',12);
    $pdf->Cell(0, 8, utf8_decode('Jogo'), '', 1, 'L', 1);

    $pdf->SetX($pdf->GetX() + $avancoX);
    $pdf->SetFont('Times','I',12);
    $pdf->Cell($maxRotuloWidth, 8, utf8_decode('Categoria de Jogo: '), 'B');
    $pdf->SetFont('Arial','',12);
    $pdf->Cell(0, 8, utf8_decode(utf8_encode($linha['Tipo'])), 'B', 1);

    $pdf->SetX($pdf->GetX() + $avancoX);
    $pdf->SetFont('Times','I',12);
    $pdf->Cell($maxRotuloWidth, 8, utf8_decode('Data do Jogo: '), 'B');
    $pdf->SetFont('Arial','',12);
    $pdf->Cell(0, 8, utf8_decode(utf8_encode($linha['Data'])), 'B', 1);

    $pdf->SetX($pdf->GetX() + $avancoX);
    $pdf->SetFont('Times','I',12);
    $pdf->Cell($maxRotuloWidth, 8, utf8_decode('Hora do Jogo: '), 'B');
    $pdf->SetFont('Arial','',12);
    $pdf->Cell(0, 8, utf8_decode(utf8_encode($linha['Hora'])), 'B', 1);

    $pdf->SetX($pdf->GetX() + $avancoX);
    $pdf->SetFont('Times','I',12);
    $pdf->Cell($maxRotuloWidth, 8, utf8_decode('Local do Jogo: '), 'B');
    $pdf->SetFont('Arial','',12);
    $pdf->Cell(0, 8, utf8_decode(utf8_encode($linha['Local'])), 'B', 1);

    $pdf->SetX($pdf->GetX() + $avancoX);
    $pdf->SetFont('Times','I',12);
    $pdf->Cell($maxRotuloWidth, 8, utf8_decode('Equipa1: '), '');
    $pdf->SetFont('Arial','',12);
    $pdf->Cell(0, 8, utf8_decode(utf8_encode($linha['Equipa1'])), '', 1);

    $pdf->SetX($pdf->GetX() + $avancoX);
    $pdf->SetFont('Times','I',12);
    $pdf->Cell($maxRotuloWidth, 8, utf8_decode('Equipa2: '), '');
    $pdf->SetFont('Arial','',12);
    $pdf->Cell(0, 8, utf8_decode(utf8_encode($linha['Equipa2'])), '', 1);

    $pdf->SetX($pdf->GetX() + $avancoX);
    $pdf->SetFont('Times','I',12);
     $pdf->Cell($maxRotuloWidth, 8, utf8_decode('1ºPeriodo da Equipa1: '), '');
    $pdf->SetFont('Arial','',12);
    $pdf->Cell(0, 8, utf8_decode(utf8_encode($linha['Periodo1Equipa1'])), '', 1);

    $pdf->SetX($pdf->GetX() + $avancoX);
    $pdf->SetFont('Times','I',12);
     $pdf->Cell($maxRotuloWidth, 8, utf8_decode('1ºPeriodo da Equipa2: '), '');
    $pdf->SetFont('Arial','',12);
    $pdf->Cell(0, 8, utf8_decode(utf8_encode($linha['Periodo1Equipa2'])), '', 1);
    
    $pdf->SetX($pdf->GetX() + $avancoX);
    $pdf->SetFont('Times','I',12);
     $pdf->Cell($maxRotuloWidth, 8, utf8_decode('2ºPeriodo da Equipa1: '), '');
    $pdf->SetFont('Arial','',12);
    $pdf->Cell(0, 8, utf8_decode(utf8_encode($linha['Periodo2Equipa1'])), '', 1);
    
    $pdf->SetX($pdf->GetX() + $avancoX);
    $pdf->SetFont('Times','I',12);
     $pdf->Cell($maxRotuloWidth, 8, utf8_decode('2ºPeriodo da Equipa2: '), '');
    $pdf->SetFont('Arial','',12);
    $pdf->Cell(0, 8, utf8_decode(utf8_encode($linha['Periodo2Equipa2'])), '', 1);
    
    $pdf->SetX($pdf->GetX() + $avancoX);
    $pdf->SetFont('Times','I',12);
     $pdf->Cell($maxRotuloWidth, 8, utf8_decode('Resultado Final da Equipa1: '), '');
    $pdf->SetFont('Arial','',12);
    $pdf->Cell(0, 8, utf8_decode(utf8_encode($linha['FinalEquipa1'])), '', 1);
    
    $pdf->SetX($pdf->GetX() + $avancoX);
    $pdf->SetFont('Times','I',12);
     $pdf->Cell($maxRotuloWidth, 8, utf8_decode('Resultado Final da Equipa2: '), '');
    $pdf->SetFont('Arial','',12);
    $pdf->Cell(0, 8, utf8_decode(utf8_encode($linha['FinalEquipa2'])), '', 1);
    
    $pdf->Output();
?>
Existem outros ficheiros que são importantes para a criação mas esse é o mais importante e acho que e neste ficheiro que tem algum erro. Se quiseres eu coloco tambem o codigo dos outros ficheiros.
 
Porque estás a usar o ob_start() ?

Se usares isso tens de usar o ob_end_flush();

Pelo que vi, não tens html, nao tens echos, portanto tudo normal, vê se não deixas nenhuma linha em branco depois do <? ou ?> nesse ficheiro ou nos includes.
 
se não me engano o problema deve ser aqui:

Código:
}
?>
<?php
     include_once('connect.php');

tal como disse não podes ter output nenhum, e tudo o que está fora do <?php...?> conta como output, mesmo que seja uma simples mudança de linha como tu tens (penso eu)
além disse qual é a utilidade de fechar e abrir a tag php?
 
Coloquei como me indicaram mas continua a não dar e surge inclusive outro erro:

Código:
[B]Warning[/B]: Cannot modify header information - headers already sent by (output started at c:\programas\easyphp1-8\www\pat\relatorio_pdf.php:6) in [B]c:\programas\easyphp1-8\www\pat\css\fpdf.php[/B] on line [B]1022[/B]
 
A linha 6 tem o comando ob_end_flush() é aí que esta o output??

Código:
1<?php 
2     if (!isset($_SESSION)) {
3         session_name("sessao");
4         ob_start();
5         session_start();
[COLOR=Red]6        ob_end_flush();[/COLOR]
7         }
    include_once('connect.php');
 
Aqui está o ficheiro que precede o da criação do pdf. Espero que vos ajude a ver o que se passa.

Código:
<?php
      if (!isset($_SESSION)) {
         session_name("sessao");
         ob_start();
         session_start();
      }
?>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<link type="text/css" href="geral.css" rel="stylesheet">
</head>
<body>
     <form class="tituloFormulario" name="insercao_andebol.php" action="valida_utilizador.php">
     <h6> Utilizador: <?php echo $_SESSION['utiLogin'] ?> !! </h6>
<?php
      if (!(session_is_registered("utiLogin") and session_is_registered("utiPassword"))) {
         header("Location: login_1.php");
      } else {
?>
                        <?php
                                // --- Fazer a ligação à Base de Dados ---
                                require_once('connect.php');
                                echo '<p>';
                                // ---------------------------------------
                                $tipo=$_POST['categoria'];
                                $data=$_POST['data'];
                                $hora=$_POST['hora'];
                                $local=$_POST['local'];
                                $e1=$_POST['equipa1'];
                                $e2=$_POST['equipa2'];
                                $e1p1=$_POST['periodo1_equipa1'];
                                $e2p1=$_POST['periodo1_equipa2'];
                                $e1p2=$_POST['periodo2_equipa1'];
                                $e2p2=$_POST['periodo2_equipa2'];
                                $finale1=$_POST['finalequipa1'];
                                $finale2=$_POST['finalequipa2'];
                                echo 'Os dados introduzidos são: <br/><p/>';
                                echo 'Categoria: '.$tipo.'<br/>';
                                echo 'Data: '.$data.'<br/>';
                                echo 'Hora: '.$hora.'<br/>';
                                echo 'Local: '.$local.'<br/>';
                                echo '1ª Equipa: '.$e1.'<br/>';
                                echo '2ª Equipa: '.$e2.'<br/>';
                                echo '1º Periodo Equipa1: '.$e1p1.'<br/>';
                                echo '1º Periodo Equipa2: '.$e2p1.'<br/>';
                                echo '2º Periodo Equipa1: '.$e1p2.'<br/>';
                                echo '2º Periodo Equipa2: '.$e2p2.'<br/>';
                                echo 'Resultado Final Equipa1: '.$finale1.'<br/>';
                                echo 'Resultado Final Equipa2: '.$finale2.'<br/>'; 
                                // --- Encontar a chave da tabela pizza
                                $consulta="select Cod_Jogo from andebol where Local ='".$local."'";
                                $resultado=mysql_query($consulta);
                                $registo=mysql_fetch_array($resultado);
                                //echo $_SESSION['idutilizadores']. '<br>';
                                //echo $registo['idpizzas']. '<br>';
                                // --- Inserir dados na tabela clientes ---
                                $insere="insert into andebol values('','".$tipo."','".$data."','".$hora."','".$local."','".$e1."','".$e2."','".$e1p1."','".$e2p1."','".$e1p2."','".$e2p2."','".$finale1."','".$finale2."')";
                                //echo $insere;
                                $sucesso=mysql_query($insere);
                                echo '<p>';
                                if (!$sucesso){
                                      echo 'Erro ao inserir os dados !!'."<br>";
                                      exit;
                                } else{
                                       echo 'Dados inseridos com sucesso!!'."<br>";
                                       $consulta1="select max(cod_Jogo) as maxcodjogo from andebol ";
                                       //echo $consulta1;
                                       $resultado1=mysql_query($consulta1);
                                       $registo1=mysql_fetch_array($resultado1);
                                       $enviar=$registo1['maxcodjogo'];
        
                                  }
                        ?> <br>         
                <a href="javascript: window.print()"> Imprimir Página </a> </td></tr><br>
                <a href="relatorio_pdf.php?Cod_Jogo= <?php echo $enviar ?>"> Criar ficheiro pdf </a> </td></tr><br>
             
<?php
        }
?>
<a href="login_1.php">Logout</a><br>
<a href="valida_utilizador.php">Listar Registos</a>
</form>
</body>
</html>
 
o código do teu post anterior era o inicio deste ficheiro certo? então não vai ser por tirar o ob_end_flush que isso vai passar a funcionar. isso está cheio de html, ou seja, output. pelos vistos não percebeste bem o que isso quer dizer...

resumindo: output é quando o servidor (php) envia dados para o cliente (browser), e isso acontece quanto fazes um echo ou outra função de escrita, ou quando escreves alguma coisa fora da tag php (nem que seja um espaço)

certas funções do php só podem ser feitas antes de haver output, como session_start(), header(), e pelos vistos também essas funções do fpdf.

por isso tens que restruturar o teu código de maneira a que estas funções estejam sempre antes do output. o que eu costumo fazer é separar tudo por funções em vez de ficheiros, e ponho num ficheiro as funções de escrita, e noutro ficheiro os procedimentos.
no index.php começo por verificar se é preciso fazer algum procedimento, e só depois disso chamo as funçoes de output

outra maneira (e que secalhar é mais fácil para ti, que talvez tenhas que mudar muita coisa) é, em vez de ir fazendo echo, vai-se guardando o html numa variavel, e faz-se echo a essa variavel no final de tudo.
não sei se é viavel fazer isto porque nunca usei
 
Queria só esclarecer uma coisa é que eu coloquei em ficheiros separados os dois posts de codigo.
O ficheiro que postei mais recentemente e que tem mais codigo chama-se insercao_andebol.php e permite entre outras coisas a criação de ficheiros em pdf e impressão da página.
O primeiro ficheiro que postei chamam-se relatorio_pdf.php e corresponde a criação do pdf com os valores vindos do ficheiro anterior.
O primeiro post de codigo(o da criação) não ta no mesmo ficheiro do que o coigo do segundo post.
Talvez isto vos esclareça melhor.
 
A linha 6 tem o comando ob_end_flush() é aí que esta o output??

Código:
1<?php 
2     if (!isset($_SESSION)) {
3         session_name("sessao");
4         ob_start();
5         session_start();
[COLOR=Red]6        ob_end_flush();[/COLOR]
7         }
    include_once('connect.php');


o ob_start e ob_end_flush não estão aí a fazer nada, visto que tu nesse snippet não tens nenhum ouput!
 
Aqui a parte de código do ficheio fpdf.php onde dá erro(linha a vermelho):

Código:
case 'I':
            //Send to standard output
            if(ob_get_contents())
                $this->Error('Some data has already been output, can\'t send PDF file');
            if(php_sapi_name()!='cli')
            {
                //We send to a browser
[COLOR=Red]                header('Content-Type: application/pdf');[/COLOR]
                if(headers_sent())
                    $this->Error('Some data has already been output to browser, can\'t send PDF file');
                header('Content-Length: '.strlen($this->buffer));
                header('Content-disposition: inline; filename="'.$name.'"');
            }
            echo $this->buffer;
            break;
 
Back
Topo