Ir para conteúdo
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();
?>

Editado por Bruno Augusto
Adicionar BCode CODE

Compartilhar este post


Link para o post
Compartilhar em outros 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).

Compartilhar este post


Link para o post
Compartilhar em outros 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......

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faz o seguinte, brother, insira:

 

ob_start ();

 

antes da linha:

 

$pdf -> Output();

 

este comando serve para iniciar o buffer.

 

Rode o sistema.

Editado por Carlos Antoliv
  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ajudou!

Mas quando peço pra salvar o arquivo PDF ele nao é reconhecido por nenhum leitor de PDF :/

Editado por eric123

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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;
?>

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Editado por Gabriel Heming

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.