fpdf no symfony

54 views
Skip to first unread message

Aline EA

unread,
Jul 9, 2008, 12:33:09 PM7/9/08
to symfony-pt
Boa tarde pessoal....
Agora o sistema desenvolvido no symfony que estou trabalhando está na
reta final... Falta só gerar um relatório pdf para impressao...
Bom, baixei a biblioteca fpdf e criei um diretorio fpdf na pasta lib
(onde ficam os models) e unzipei a biblioteca lá...
Bom, agora estou tentando criar um pdf em um templateSuccess, só para
testar, e pra isso coloquei as seguntes linhas no arquivo:

<?php // teste PDF
define('FPDF_FONTPATH','lib/fpdf/font/');
require('lib/fpdf/fpdf.php');
$pdf=new FPDF();
$pdf->Open();
$pdf->AddPage();
$pdf->SetFont('Arial','B',12);
$pdf->Write(4,'Olá Mundo!!');
$pdf->Output();
?>

quando tento ver o resultado, aparece este ero no browser:

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

O que tenho que fazer pra este teste dar certo? Alguem pode me dar uma
mão? :(
Agradeço desde já.....

Pedro Casado

unread,
Jul 9, 2008, 12:47:53 PM7/9/08
to symfo...@googlegroups.com
Provavelmente deve precisar de um $this->setLayout(false); na action... não?

Ou melhor, todo seu codigo pode ir para action. Não precisa fazer require.. se você botou no lib/ ele vai carregar.


2008/7/9 Aline EA <ali...@gmail.com>:



--
Att,
Pedro Casado

Guilherme Veras

unread,
Jul 9, 2008, 6:10:56 PM7/9/08
to symfony-pt
Eu ja tive esse problema e resolvi voce tem de entrar na classe do
fpdf e comentar algum parametro que é enviado vou ver aqui e mais
tarde te dou a resposta se voce nao conseguir... era um parametro que
voce tinha de setar para chamar uma função ...

On 9 jul, 13:47, "Pedro Casado" <pdr...@gmail.com> wrote:
> Provavelmente deve precisar de um $this->setLayout(false); na action... não?
>
> Ou melhor, todo seu codigo pode ir para action. Não precisa fazer require..
> se você botou no lib/ ele vai carregar.
>
> 2008/7/9 Aline EA <alin...@gmail.com>:

Guilherme Veras

unread,
Jul 9, 2008, 6:15:53 PM7/9/08
to symfony-pt
Entao como prometido aqui vai a resposta....

Para você resolver isso basta chamar a função com o parametro D na
variavel $dest ...... Output($name='',$dest='D')
Olha o codigo e ve aonde o erro esta sendo gerado ...

t++++

function Output($name='',$dest='')
{
//Output PDF to some destination
//Finish document if necessary
if($this->state<3)
$this->Close();
//Normalize parameters
if(is_bool($dest))
$dest=$dest ? 'D' : 'F';
$dest=strtoupper($dest);
if($dest=='')
{
if($name=='')
{
$name='doc.pdf';
$dest='I';
}
else
$dest='F';
}
switch($dest)
{
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
header('Content-Type: application/pdf');
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;
case 'D':
//Download file
if(ob_get_contents())
$this->Error('Some data has already been output, can\'t send PDF
file');
if(isset($_SERVER['HTTP_USER_AGENT']) &&
strpos($_SERVER['HTTP_USER_AGENT'],'MSIE'))
header('Content-Type: application/force-download');
else
header('Content-Type: application/octet-stream');
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: attachment; filename="'.$name.'"');
echo $this->buffer;
break;
case 'F':
//Save to local file
$f=fopen($name,'wb');
if(!$f)
$this->Error('Unable to create output file: '.$name);
fwrite($f,$this->buffer,strlen($this->buffer));
fclose($f);
break;
case 'S':
//Return as a string
return $this->buffer;
default:
$this->Error('Incorrect output destination: '.$dest);
}
return '';
}


On 9 jul, 13:47, "Pedro Casado" <pdr...@gmail.com> wrote:
> Provavelmente deve precisar de um $this->setLayout(false); na action... não?
>
> Ou melhor, todo seu codigo pode ir para action. Não precisa fazer require..
> se você botou no lib/ ele vai carregar.
>
> 2008/7/9 Aline EA <alin...@gmail.com>:

Aline EA

unread,
Jul 10, 2008, 12:21:39 PM7/10/08
to symfony-pt
Pow caras... valew......
mas infelizmente não funcionou... >=, aah symfony fio da mãi...
hauauahahaaa
to fazendo alguma coisa errada hauhauha
ateh fiz o seguinte: criei uma action vazia 'executeCriaPDF' e aí no
template us este código:

<?php
define('FPDF_FONTPATH','lib/fpdf/font/');
$pdf=new FPDF('P','mm','Letter'); // Cria um arquivo novo tipo carta,
na vertical.
$pdf->Open(); // inicia documento
$pdf->AddPage(); // adiciona a primeira pagina
$pdf->SetMargins('5','12,7'); // Define as margens do documento
$pdf->SetAuthor("Jonas Ferreira"); // Define o autor
$pdf->SetFont('helvetica','',7); // Define a fonte
$pdf->SetDisplayMode('fullpage');
$pdf->Write(40,10,'Hello World!');
$pdf->output('pedidos.pdf', 'D');
?>

dessa vez apareceu o fundo do sistema, mais nada!!! =OOOOO
dependendo do que eu coment ou adiciono lá em cima, aparecem comandos
de tabela (td), eh uma doideira... =(
minha nossaaaaaa............. x,,,,,,,,,,,,,,,,,O

Gabriel Asakawa

unread,
Jul 11, 2008, 12:18:15 AM7/11/08
to symfo...@googlegroups.com
Oi Aline eu fiz o seguinte:

Baixei a biblioteca FPDF unzipei e coloquei o arquivo FPDF.php na pasta lib.

Depois abri esse arquivo (FPDF.php) e coloquei o seguinte:
define('IMAGE_PATH', ROOT_DIR.DIRECTORY_SEPARATOR.'web'.DIRECTORY_SEPARATOR.'images'.DIRECTORY_SEPARATOR);

Ja no actions fiz o seguinte:
public function executeGenerarReporte{
            $pdf = new PDF();
            $pdf->Open();
            $pdf->AliasNbPages();
            $pdf->SetX(3);
            $pdf->AddPage();
            $pdf->encabezadoFactura($encabezado);
            $pdf->cuerpoFactura($cuerpo);
            $pdf->cuerpoInsumosFactura($material);
            $pdf->finalFactura($final);
            $pdf->pieFactura();
            $pdf->Output('factura '.$numeroFactura.'.pdf', 'D');   
            return sfView::NONE;
}

Bom PDF é uma classe que eu fiz que extende a classe FPDF e tem uns métodos que eu precisava...

So com isso me funcionou muito bem...

Espero que funcione pra vc tambem, qualquer coisa e só falar.

PS: Desculpa o meu portugês é que faz muito tempo que moro na Colômbia.

Abraco

2008/7/10 Aline EA <ali...@gmail.com>:



--
Gabriel Asakawa
Ingeniero de Sistemas
Universidad del Valle

Aline EA

unread,
Jul 12, 2008, 6:28:59 PM7/12/08
to symfo...@googlegroups.com
muito obrigada pessoal :)
muito mesmo ^^******************************
o problema foi finalmente resolvido... juntando tudo que todos vcs indicaram ;)
segunda eu ponho o código aqui (está no PC do serviço xD)
muito obrigada <=DDDDDDDDDDDDDDDDD no que puder ajudar, estarei por aqui =)

2008/7/11 Gabriel Asakawa <gabiga...@gmail.com>:



'A Vontade de Deus nunca irá levá-lo aonde a Graça de Deus não possa protegê-lo'

Devemos lutar até o fim... E o fim, p/ mim, é quando se desiste de lutar... NUNCA DESISTA!

Guilherme Veras

unread,
Jul 15, 2008, 10:30:49 AM7/15/08
to symfony-pt
ok aline estamos esperando a resposta parabens por conseguir...

On 12 jul, 19:28, "Aline EA" <alin...@gmail.com> wrote:
> muito obrigada pessoal :)
> muito mesmo ^^******************************
> o problema foi finalmente resolvido... juntando tudo que todos vcs indicaram
> ;)
> segunda eu ponho o código aqui (está no PC do serviço xD)
> muito obrigada <=DDDDDDDDDDDDDDDDD no que puder ajudar, estarei por aqui =)
>
> 2008/7/11 Gabriel Asakawa <gabigarnet...@gmail.com>:
> > 2008/7/10 Aline EA <alin...@gmail.com>:
> --
> Aline E. Amaral
> Engenharia de Computação - UCDB
>
> 'Quando Deus tira algo de você, Ele não está punindo-o, mas apenas abrindo
> suas mãos para receberem algo melhor'.

Aline EA

unread,
Jul 15, 2008, 2:43:45 PM7/15/08
to symfony-pt
oi pessoal, desculpa a demora :)
estão transefrindo o svn do projeto.... mas eu me lembro do código...
olha só: :)
na action segui a recomendação do Gabriel Asakawa : crio o pdf na
action, dou output e deixo o view como NONE :) aí deu certo :)
não precisei mudar nada no fpdf e não precisei criar uma classe
estendida... era coisa bem simples <=)
a biblioteca fpdf ficou na lib mesmo (onde ficam a pasta 'model'). E
no template não escrevi nada.

mais ou menos assim:

diretorio do fpdf: lib/fpdf

action:
public function executeCriaPDF(){

// vou usar o codigo do nosso amigo , o meu nao
estou conseguindo pegar <=)
> $pdf = new PDF();
> > $pdf->Open();
> > $pdf->AliasNbPages();
> > $pdf->SetX(3);
> > $pdf->AddPage();
> > $pdf->encabezadoFactura($encabezado);
> > $pdf->cuerpoFactura($cuerpo);
> > $pdf->cuerpoInsumosFactura($material);
> > $pdf->finalFactura($final);
> > $pdf->pieFactura();

// meu output ficou assim, pra abrir na mesma
janela:
> > $pdf->Output('', 'I');
> > return sfView::NONE;
}

no template não escrevi nada.



Pessoal, muito obrigada mesmo..... <=) Mas muito mesmo!!! <=DDDDDDD
Valew pelo apoio uns dos outros <=) isso é demais x)
e vamos que vamos..... hauahauhauahauahuaahau........ symfonando muito
^^
abraços a todos ***** =D

Vitor Mello

unread,
Jul 16, 2008, 8:01:55 AM7/16/08
to symfony-pt
oi Aline, só tem um pequeno probleminha com o seu codigo: eh que voce
esta fugindo do modelo MVC ao mesclar o controlador e a visao na mesma
action. Falo isso porque quando comecei a mexer com o fpdf eu fiz
exatamente da mesma maneira que voce fez agora, mas isso nao eh a
melhor forma, concorda?

o que eu fiz foi definir as variaveis na minha action (fazer consultas
ao banco de dados, etc), como normalmente eh feito. E na sua view,
voce colocaria o seu codigo do fpdf, exemplo:
> > $pdf = new PDF();
> > $pdf->Open();
> > ... e por aih vai...

mas aih se voce tentar rodar isso vai dar um erro no fpdf. Isso
acontece porque o symfony vai tentar enviar o conteudo como html, mas
na verdade ele teria que enviar o conteudo como PDF. Alem disso,
normalmente a camada de visao vai tentar adicionar um layout, mas aki
isso nao eh necessario. Mas entao, como resolver isso? Eh simples:
Basta adicionar esse arquivo view.yml na pasta config do seu modulo de
relatorios:

gerarReportSuccess:
has_layout: off # nao precisamos do layout

http_metas:
content-type: application/pdf # vamos enviar um arquivo pdf ao
browser, ao inves de html (padrao)

Ah e tem um outro pequeno ajuste que precisa ser feito. Quando voce
esta no ambiente de desenvolvimento (frontend_dev.php), o symfony
sempre adicionar akela barrinha de debug no topo da pagina, mas como
estamos gerando um PDF, isso provavelmente vai dar conflito com o
FPDF. Pra evitar isso, basta adicionar o seguinte codigo no seu
controlador:

public function preExecute()
{
// como vamos gerar um PDF, nao precisamos da barrinha de DEBUG
sfConfig::set('sf_web_debug', false);
}

Feito isso, voce vai poder separar novamente as suas camadas de visao
e controle, e o seu codigo ficara mais organizado :D

Abraços,
Vitor Mello

Aline EA

unread,
Jul 24, 2008, 1:10:13 PM7/24/08
to symfo...@googlegroups.com
Valeu Vitor <=DDDDDDD
O projeto jah foi entregue, infelizmente com esse erro de MVC.... É o 1.o projeto em symfony da empresa e por isso tds nós lá precisamos sapatear um pouco rsrsrs.... Eu ainda mais prq meu negócio é Java e C e aí me trouxeram PHP (com Symfony ainda hehehe!) como proposta de trabalho e eu topei ;) Está sendo muito muito legal adquirir mais bagagem de conhecimento e os probleminhas p/ aprender hehehehe =)....
Mas o ingrediente mais legal é esse: não estar sozinho.... Poder contar com a intelectualidade de outras pessoas q tb se esforçaram pra aprender e quiseram compartilhar isso com tutoriais, apostilas, artigos.... E assim a gnt tenta fazer as coisas ficarem melhores p/ tds =)
Agora iniciamos um outro projeto, mas complexo que este primeiro... Avancemos para águas mais profundas!
Eu sinto de ainda estar aprendendo e nao poder ajudar mt agora, mas eh isso aih pessoal, a gnt faz o que pode pra auxiliar e fazer um bom serviço com o apoio uns dos outros! =DDD
Abraços a tds********* valewwwww

2008/7/16 Vitor Mello <vit...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages