Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Andreia Regina

em geração de arquivo pdf

Recommended Posts

Olá Pessoal!Tenho um script que gera um arquivo pdf do resultado de uma pesquisa em uma tabela chamada contrato. Estou com a seguinte dúvida:Como eu faço para gerar neste arquivo vários produtos, pois um contrato de compra e venda podem ter n produtos e eu não sei como lidar com isso.eu tentei inserindo:

PHP
while($vetor["ord"]){// dados do PRODUTO$pdf->Cell(30, 5, "Produto:", 0, 0);$pdf->Cell(20, 5,$row['pdt'], 0, 1);}
mas mostra a seguinte mensagem de erro:

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 238 bytes) in

Agradeço pela ajuda desde já.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que banco de dados você está usando??? No mysql é assim:

 

PHP

[*]

[*]$sql="SELECT * FROM contrato";

[*]$query=mysql_query($sql);

[*]while($registro = mysql_fetch_array($query))

[*]{

[*]// dados do PRODUTO

[*]$pdf->Cell(30, 5, "Produto:", 0, 0);

[*]$pdf->Cell(20, 5,$registro["pdt"], 0, 1);

[*]}

[*]

 

Quando ao problema:

 

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 238 bytes) in

 

Isso ocorreu porque o seu script entrou em looping infinito, dae excedeu a memória... e pau!

 

Qualquer duvida...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ólá Jonas_ti!

Obrigada pela ajuda.

è mysql sim!

No início do programa está da forma como você colocou mas eu tenho os seguintes dados:

1)empresa compradora;

2)empresa vendedora;

3)produtos n e outros dados que podem repetir se houver mais de um produto;

4)dados de pagamento.

 

A minha dúvida gira em torno do item 3 pois normalmente existe mais de um produto no contrato e eu não estou sabendo como tratá-los no momento de gerar o arquivo pdf.

 

Ah! você sabe como eu posso fazer cabeçalho e rodapé para gerar automaticamente caso haja mais de uma folha impressa.

 

Obrigada

Andreia Regina

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara Andreia Regina,

 

Quanto ao cabeçalho do PDF, postei no meu blog uma dica que pode te ajudar!!!

 

http://diariodumprogramador.blogcindario.c...5/03/00032.html

 

Em relação a repetição de dados... Tente observar o que não se repete mas de forma conjunta, ou seja, veja se o produto tem um código (que não deve se repetir acredito eu) e filtre juntamente com outro campo que junto com o primeiro formam uma chave, ex: uma data!

 

Qualquer dúvida, estamos ae

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Jonas!Obrigada pela dica, vou estudá-la.Quanto ao produto não se repetir: para complicar um pouco pode repetir sim, a empresa comercializa cereais e há um produto, por exemplo macarrão, que pode ser de tipos diferentes como se fosse espagetti, penne, etc. ou simplesmente qualidade diferentes então há um produto cadastrado e no campo qualidade há sua descrição feita manualmente.Obrigada pela atenção e ajuda!!!Andreia Regina

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Pessoal!

Olá Jonas!

 

Estou com o seguinte código para gerar cabeçalho (adaptei o que você me passou pois só preciso da imagem), porém a imagem só é inserida na primeira página não nas demais.

 

PHP

[*]<?php ob_start();

[*]require_once("fpdf.php");

[*]require_once("conexao.php");

[*]

[*]function Gera_Cabecalho()

[*]{

[*]global $pdf;

[*]$pdf -> AddPage();

[*]$pdf->Image('imagem/logo_ibe.jpg', 10, 5); // importa uma imagem

[*]}

[*]

[*]function Gera_Rodape()

[*]{

[*]global $pdf;

[*]//$pdf -> AddPage();

[*]

[*]$pdf -> SetFont('Arial','',8);

[*]$pdf -> Cell(0,5,"endereço completo do meu cliente", 0, 1);

[*]$pdf -> Cell(0,5,"telefone e outros dados do meu cliente", 0, 1);

[*]}

[*]

[*]$pdf=new FPDF('P','mm','A4');

[*]$pdf->AliasNbPages();

[*]$pdf->Open();

[*]

[*]Gera_Cabecalho();

[*] //restante do código

[*]ob_end_flush() ?>

o rodapé não aparece nem na primeira página :angry:

 

Agradeço a atenção

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Andreia,

 

Para mostrar o rodapé você deve fazer um if verificando se o que você está mostrando já chafou ao final da página!

 

PHP

[*]

[*]//...

[*]if $pdf->getY()>=260

[*]{

[*]rodape();

[*]cabecalho();

[*]//...

[*]}

[*]

 

Espero ter ajudado!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Jonas!

 

Inseri sim só esqueci de postar aqui:

PHP

[*]//GERA RODAPE E CABEÇALHO

[*]if ($pdf->getY()>=260)

[*]{

[*]Gera_Rodape();

[*]Gera_Cabeçalho();

[*]}//if para inserir rodape

[*]

Coloquei este código no final do while que gera o conteúdo do relatório mas não imprimiu nada. Só o cabeçalho na primeira página.

 

O que pode ser? :wacko:

 

Grata

 

Andreia Regina

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Andreia,» O que você está inserindo exatamente nesse relatório?» O cabeçalho aparece somente na primeira página?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Jonas

» O que você está inserindo exatamente nesse relatório?

Possui vários dados: dados do comprador, do vendedor, produtos negociados e suas características e preços, entre outros, normalmente será mais de uma página mas preciso do cabeçalho e rodapé senão o cliente não vai ficar com o programa.

» O cabeçalho aparece somente na primeira página?

Sim, o cabeçalho só gera na primeira página. E fiz seguindo as instruções do tutorial que você me passou.você sabe onde eu posso encontrar mais material sobre fpdf é difícil de encontrar na net.Andreia Regina

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seguinte:

Tenho uma tabela com diversos campos, os mais importantes são contrato, ano, ordem, produto, comprador, vendedor, empresa.

Faço um select logo depois de conectar ao banco de dados MySQL:

PHP

[*]$contrato = $_POST["contrato"];

[*]$ano   = $_POST["ano"];

[*]

[*]$sql = "SELECT * FROM tb_contrato WHERE crt = '$contrato' AND ano= '$ano'";

[*]

[*]$result_id=@mysql_query($sql) or die("Erro no banco de dados!");

[*]$total  =@mysql_num_rows($result_id);

[*]

[*]while ($row = @mysql_fetch_assoc($result_id))

[*]{

[*]$crt[$i]       = mysql_result($result_id, $i, "crt");

[*]$ano[$i]       = mysql_result($result_id, $i, "ano");

[*]$dta[$i]       = mysql_result($result_id, $i, "dta");

[*]$ord[$i]       = mysql_result($result_id, $i, "ord");

[*]...

[*]//depois peço para imprimir os dados comuns:

[*]$pdf->Cell(30, 5, "Comprador:", 0, 0);

[*]$pdf->Cell(60, 5,$row['rzc'], 0, 1);

Depois disto tenho a seguinte situação: 1 contrato com 1 comprador e 1 vendedor poder conter n produto e n empresa, o campo ordem vai diferenciar o produto e a empresa pode ou não ser preenchida.

A minha dúvida está justamente aí: utilizando o seguinte código:

Ele vai repetir o primeiro produto e a empresa tantas vezes quanto existir o campo ordem, no caso do meu exemplo 3 vezes ele repete o mesmo produto e empresa.

Já tentei inserir outro while mas ele não gera o relatório .pdf.

Exemplo de arquivo gerado.

Agradeço desde já a atenção

 

Andreia Regina

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Pessoal!

 

Agora estou com nova dificuldade.

Eu gero o relatório com cabeçalho e rodapé seguindo este script:

PHP

[*]<?php

[*]function Cabecalho()

[*]{

[*] global $pdf;

[*] $pdf -> AddPage();

[*] $pdf -> SetY(10);

[*] $pdf -> Image('imagem/logo_ibe.jpg', 10, 5); // importa uma imagem

[*] $pdf -> SetXY(10, 40);

[*] $pdf -> ln(5);

[*]}

[*]

[*]function Rodape()

[*]{

[*] global $pdf;

[*] $pdf->SetY(265);

[*] $pdf->SetFont('Arial','I',8);

[*] $pdf->Cell(0, 5, "Endereço do meu cliente", 0, 0);

[*] $pdf->ln();

[*] $pdf->Cell(0, 5, "Telefone: Fax: E-mail: ", 0, 0);

[*]}

[*]?>

Mas como o resultado da pesquisa altera de acordo com os dados no banco de dados, oscila-se a posição do texto e ocorre que, algumas vezes o rodapé fica sobre o relatório, e outra observação eu gostaria que ele ficasse mais abaixo ele fica há 3 cm do final da página A4 impressa, gostaria que ficasse como rodapé de timbrados, bem embaixo mas se eu altero o SetY() ele envia o texto para a página de baixo, criando nova página.

Sei que existe a função SetAutoPageBreak mas não sei exatamente como utilizá-la e se dá para adaptar dentro deste script.

 

Agradeço a todos.

 

Andreia Regina

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já sei Andreia...Veja se você está alterando o setY da função e daquele if que controla o rodapé e o cabeçalho... Acho que pode ser isso!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Andreia....

Pra mim, a melhor classe de geração de PDF que já usei foi a EZPDF, você

pode encontrá-la em http://www.ros.co.nz/pdf/ , junto com ela vem um readme.pdf com todas as funções e recheado de

exemplos.

 

você faz sua consulta SQL, e ela se encarrega de gerar a tabela bem direitinho, você

pode ainda formatar negrito, alinhamento, cor de linhas,.... é muito massa.

 

Infelizmente me parece que pouca gente conhece essa classe, pois tem muito pouca informação em portugues... o melhor eh você ler o readme.pdf.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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