Jump to content
gildo.rj

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

Recommended Posts

Bom dia grupo.

 

Alguem pode analisar esse codigo e me dizer o porque desse erro????

 

<?php
define('FPDF_FONTPATH', 'fpdf/font/');
require('fpdf/fpdf.php');
include "config.php";

$sql = mysql_query("SELECT * FROM ues ORDER BY nome");
$pdf = new FPDF();
$pdf->Open();
$pdf->AddPage();
$pdf->SetFont('courier','b', 10);
$pdf->Cell(40, 5, 'Código');
$pdf->SetX(35);
$pdf->Cell(60, 5, 'Nome');
$pdf->SetX(50);
$pdf->Cell(40, 5, 'Alunos');
$pdf->SetX(77);
$pdf->Cell(40, 5, 'Endereço');
while ($resultado = mysql_fetch_array($sql)) {
$pdf->ln();
$pdf->Cell(40, 5, $resultado['cod']);
$pdf->SetX(35);
$pdf->Cell(60, 5, $resultado['nome']);
$pdf->SetX(50);
$pdf->Cell(40, 5, $resultado['alunos']);
$pdf->SetX(77);
$pdf->Cell(40, 5, $resultado['end']);
}
$pdf->Output();
?>

Edited by Bruno Augusto
Adicionar BCode CODE

Share this post


Link to post
Share on other sites

Veja se, até antes da chamada ao método Output() nenhum tipo de HTML tenha sido enviado, porpositalmente (com echo/print) ou não (como um espaço no início do arquivo).

Share this post


Link to post
Share on other sites

pessoal estou com o mesmo erro.... porem, o meu erro da apenas quando envio o arquivo pro servidor e tento acessar online... quando acesso localmente funciona direitinho. o que poderá ser? ja retirei espaços e verifiquei se tem algum print o echo e nada......

Share this post


Link to post
Share on other sites

O seu problema em particular é que localmente seus alertas de erro estão muito baixos ou esativados, daí você não vê o erro.

 

No servidor, 98% das vezes tudo está devidamente configurado, daí você sempre verá o erro.

Share this post


Link to post
Share on other sites

Mas você não vai mandá-las. Habilitando/exibido-as você verá onde o problema está e, então, o irá consertar, ao invés de varrê-lo para baixo do tapete.

 

Uma vez corrigidas, elas não vão mais aparecer e, com isso, o output do PDF será perfeito.

Share this post


Link to post
Share on other sites

Primeiro vamos tentar corrigir os pequenos possíveis erros.

 

Ah! Se eu ganhasse uma moedinha cada vez que eu escrevo o CODE abaixo... :P

 

ini_set( 'display_errors', TRUE );

error_reporting( E_ALL | E_STRICT ); // Para PHP >= 5 e < 5.4

error_reporting( E_ALL ); // Para PHP < 5 e >= 5.4

Se estiver trabalhando com querystrings, em que toda requisição passa por um único arquivo, adicione no início deste, que normalmente é o index.php ou algum possível config.php incluído no primeiro.

 

Caso contrário, adicione no início de cada arquivo.

 

Lembre-se de usar apenas um dos dois possíveis error_reporting(), de acordo com sua versão do PHP. :thumbsup:

 

No seu caso, localmente, pode também alterar diretamente as diretivas display_errors e error_reporting no PHP.INI. Basta alterar, salvar o arquivo e reiniciar o servidor.

 

Se você cometeu os diversos e possíveis errors de programação os quais o PHP inadvertidamente "deixa passar", vai pipocar erro pra tudo quanto é lado, vá corrigindo aos poucos, se necessário.

 

Quanto ao problema específico da mensagem de headers already sent, se você quiser uma explicação um pouquinho mais detalhada sobre o porquê, veja essa resposta (minha também) e veja se pode ser aplicada ao seu caso.

 

Interprete além da resposta. De repente você não tem um HTML manualmente escrito, mas pode ser que seu arquivo contenha a infame assinatura BOM (Byte-Order Mask).

 

Lembre-se que Sessions também pode causar problemas, caso estejam sendo enviadas antes de FPDF::output(), método o qual invocado header(), para definir o Content-type do arquivo PDF.

 

Mas, no fundo, no fundo, a forma mais fácil de saber onde o causador do problema reside, basta ler a mensagem de erro, que mostra o arquivo e a linha do mesmo onde está havendo alguma saída HTML.

 

Veja qual situação se aplica a seu caso, efetue as modificações e poste caso não tenha sucesso.

Share this post


Link to post
Share on other sites

Se você está usando o Dreamweaver, siga os passos:

 

Abra arquivo por arquivo: 'fpdf/fpdf.php', 'config.php' e este arquivo PHP que você está usando, e copie o conteúdo de cada um com CTRL+C.

 

Clique em File/New (Arquivo/Novo), depois escolha "PHP" e em layout escolha "<nenhum(a)>", então clique no botão <Criar>.

 

Com o novo documento aberto, cole o código CTRL+V. Então a real solução: clique em File/Save As (Arquivo/Salvar Como), escolha "C (Decomposição Canônica, seguido por Composição Canônica)" em "Formulário de normalização Unicode", e desmarque a opção "Incluir assinatura Unicode (BOM)".

 

Faça isso para esses três arquivos.

 

Pronto, seu problema é resolvido. As vezes só desmarcando "Incluir assinatura Unicode (BOM)" é suficiente.

 

 

 

Explicação: Em UTF-16/32, um BOM (U+FEFF) é posicionado como primeiro caractere do arquivo para indicar a extremidade de todos os códigos 16/32-bit do arquivo. Quando você dá um include ou require, esse caractere aparece antes de todo o resto do documento. O "byte order mark (BOM)" é um caractere Unicode usado para denotar a extremidade (ordem de bytes) de um arquivo de texto ou fluxo de dados, com código U+FEFF. Por essa razão o FPDF diz que existem dados antes do Output.

 

 

 

Se você não usa Dreamweaver, o próprio Notepad quando você clica em Save As, lhe oferece algumas opções de Codificação que podem resolver o problema.

 

Se for o caso, baixe o Notepad++, leve e muito útil.

Share this post


Link to post
Share on other sites

Faz o seguinte, brother, insira:

 

ob_start ();

 

antes da linha:

 

$pdf -> Output();

 

este comando serve para iniciar o buffer.

 

Rode o sistema.

Edited by Carlos Antoliv
  • +1 1

Share this post


Link to post
Share on other sites

@Carlos Antoliv, apesar de sua resposta vir apenas dois meses depois da última, o tópico em si é bastante antigo.

Mesmo assim, agradecemos por compartilhar seu conhecimento conosco e pedimos que continue colaborando em tópicos mais recentes.

Contudo, vale salientar que ob_start() não limpa o buffer, ele simplesmente o inicia. Quem limpa o buffer é ob_clean() e ob_end_clean(), sendo que o segundo além de limpar também mostra aquilo que foi armazenado nele.

Share this post


Link to post
Share on other sites

Apesar do Topico ser bem antigo, mas me ajudou bastante então estou para agradecer a todos os post pois isso clareou muito minha mente e consegui sanar todas as minhas duvidas...

 

 

 

Obrigado

 

A todos Imasters

Share this post


Link to post
Share on other sites

Não, ambos os argumentos de FPDF::Output() são opcionais.

 

Ao omiti-los a classe assume doc.pdf para o primeiro argumento e I para o segundo, fazendo com que o buffer seja enviado ao browser.

Share this post


Link to post
Share on other sites

Cara já tive esse problema quando usava essa classe e resolvi com um ob_clean();

 

Veja:

<?php
//chamando a classe fpdf php . OBS: aponte para a pasta que está sua classe
include "fpdf/fpdf.php"; 
//configurações iniciais
$pdf = new FPDF('P','cm','A4');
$pdf = new FPDF();
$pdf->Open();
$pdf->AddPage();
//define a fonte utilizada para odocumento
$pdf->SetFont("Arial",'', 12);
//titulos de configuração do documento
$pdf->SetAuthor("Titulo do arquivo");
$pdf->SetTitle("Titulo do arquivo");
$pdf->SetSubject("a");
$pdf->Header();

$cabecalho = 'Teste';
//exibe o cabecalho do documento
$pdf->MultiCell(0,5,"$cabecalho",0, 'C');
//distancia do titulo da margem superior
$pdf->Ln(6);
//Titulo do documento
$pdf->MultiCell(0,5,"Titulo do documento",0,'C');
//distancia do texto e do titulo do documento
$pdf->Ln(6);
//texto do documento
$texto = 'texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto texto';
//gerar o texto no documento
$pdf->MultiCell(0,5,"$texto",0, 'J');
ob_clean(); // Limpa o buffer de saída
//cria o arquivo pdf e exibe no navegador
$pdf->Output('teste.pdf','D');
//$pdf->Output();
exit;
?>

Share this post


Link to post
Share on other sites

Além do tópico ser antigo e apesar de ser funcional, a dica do Carlos Antoliv é apenas paliativa e deve ser evitada, uma vez que o problema é gerado por erros no código. Melhor corrigir os erros do que apenas evitar o seu output.

Edited by Gabriel Heming

Share this post


Link to post
Share on other sites

Faz o seguinte, brother, insira:

 

ob_start ();

 

antes da linha:

 

$pdf -> Output();

 

este comando serve para limpar o buffer.

 

Rode o sistema.

 

 

 

Muito bom meu querido, resolveu o meu problema a dias pensando... e nada.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.