1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

FPDF

Discussão em 'Web Development' iniciada por moriva, 26 de Junho de 2008. (Respostas: 16; Visualizações: 1849)

  1. moriva

    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!
     
  2. Gurzi

    Gurzi Power Member

    mostra o código sff
     
  3. MPalhas

    MPalhas Power Member

    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
     
  4. moriva

    moriva Power Member

    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.
     
  5. Gurzi

    Gurzi Power Member

    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.
     
  6. moriva

    moriva Power Member

    E onde se coloca o ob_end_flush()??
     
  7. MPalhas

    MPalhas Power Member

    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?
     
  8. moriva

    moriva Power Member

    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]
    
     
  9. MPalhas

    MPalhas Power Member

    mesma coisa. estás a fazer output e depois a chamar o header.
    o output está no ficheiro relatorio_pdf.php, na linha 6
     
  10. moriva

    moriva Power Member

    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');
    
     
  11. MPalhas

    MPalhas Power Member

    in: php.net

    parece que sim, mas nisso já não te posso ajudar porque não conheço essas funções
     
  12. moriva

    moriva Power Member

    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>
    
     
  13. MPalhas

    MPalhas Power Member

    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
     
  14. moriva

    moriva Power Member

    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.
     
  15. Gurzi

    Gurzi Power Member


    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!
     
  16. moriva

    moriva Power Member

    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;
    
     
  17. moriva

    moriva Power Member

    Ja agora não sabem de nehuma alternativa ao fpdf para a criação de ficheiros em pdf no php?
     

Partilhar esta Página