logomarca henrique correa nome do site henrique correa
Pensar é o trabalho mais pesado que há, e talvez seja essa a razão para tão poucos se dedicarem a isso. - Henry Ford

Relatórios em PDF com PHP usando a classe FPDF

12 de Junho de 2011
Aprendi a utilizar a classe FPDF a pouco mais de 3 meses e já utilizo em todos os meus relatórios. É uma classe simples de aprender e possibilita que você crie outros modulos e classes a partir dela.

Vou demonstrar aqui como fazer um relatório um pouco mais avançado com ela. Incluindo cabeçalho, rodapé e quebra de página. Para baixar a classe você pode entrar em http://www.fpdf.org/. Lá tembém tem alguns tutoriais em inglês.

Abaixo, o código inteiramente comentado:
// PRIMEIRAMENTE: INSTALEI A CLASSE NA PASTA FPDF DENTRO DE MEU SITE.
define('FPDF_FONTPATH','fpdf/font/');

// INSTALA AS FONTES DO FPDF
require('fpdf/fpdf.php');

// INSTALA A CLASSE FPDF
class PDF extends FPDF {

// CRIA UMA EXTENSÃO QUE SUBSTITUI AS FUNÇÕES DA CLASSE.
// SOMENTE AS FUNÇÕES QUE ESTÃO DENTRO DESTE EXTENDS É QUE SERÃO SUBSTITUIDAS.

function Header(){ //CABECALHO
global $codigo; // EXEMPLO DE UMA VARIAVEL QUE TERÁ O MESMO VALOR EM QUALQUER ÁREA DO PDF.
$l=5; // DEFINI ESTA VARIAVEL PARA ALTURA DA LINHA
$this->SetXY(10,10); // SetXY -> DEFINE O X E O Y NA PAGINA
$this->Rect(10,10,190,280); // CRIA UM RETÂNGULO QUE COMEÇA NO X = 10, Y = 10 E
//TEM 190 DE LARGURA E 280 DE ALTURA.
//NESTE CASO, É UMA BORDA DE PÁGINA.

$this->Image('logo.jpg',11,11,40); // INSERE UMA LOGOMARCA NO PONTO X = 11, Y = 11, E DE TAMANHO 40. $this->SetFont('Arial','B',8); // DEFINE A FONTE ARIAL, NEGRITO (B), DE TAMANHO 8

$this->Cell(170,15,'INSIRA SEU TEXTO AQUI',0,0,'L');
// CRIA UMA CELULA COM OS SEGUINTES DADOS, RESPECTIVAMENTE:
// LARGURA = 170,
// ALTURA = 15,
// TEXTO = 'INSIRA SEU TEXTO AQUI'
// BORDA = 0. SE = 1 TEM BORDA SE 'R' = RIGTH, 'L' = LEFT, 'T' = TOP, 'B' = BOTTOM
// QUEBRAR LINHA NO FINAL = 0 = NÃO
// ALINHAMENTO = 'L' = LEFT

$this->Cell(20,$l,'Nº '.$codigo,1,0,'C',0);
// CRIA UMA CELULA DA MESMA FORMA ANTERIOR MAS COM ALTURA DEFINIDA PELA VARIAVEL $l E
// INSERINDO UMA VARIÁVEL NO TEXTO.

$this->Ln(); // QUEBRA DE LINHA
 
$this->Cell(190,10,'',0,0,'L');
$this->Ln();
$l = 17;
$this->SetFont('Arial','B',12);
$this->SetXY(10,15);
$this->Cell(190,$l,'TITULO','B',1,'C');
$l=5;
$this->SetFont('Arial','B',10);
$this->Cell(20,$l,'Dados 1:',0,0,'L');
$this->Cell(100,$l,'','B',0,'L');
$this->Cell(35,$l,'',0,0,'L');
$this->Cell(15,$l,'Data:',0,0,'L');
$this->Cell(20,$l,date('d/m/Y'),'B',0,'L'); // INSIRO A DATA CORRENTE NA CELULA

$this->Ln();
$this->Cell(20,$l,'Dados 2:',0,0,'L');
$this->Cell(100,$l,'','B',0,'L');
$this->Ln();
$this->Cell(20,$l,'Dados 3:',0,0,'L');
$this->Cell(100,$l,'','B',0,'L');>
$this->Cell(35,$l,'',0,0,'L');
$this->Cell(15,$l,'Dados 4:',0,0,'L');
$this->Cell(20,$l,'','B',0,'L');
$this->Ln(); //FINAL DO CABECALHO COM DADOS

//ABAIXO É CRIADO O TITULO DA TABELA DE DADOS
$this->Cell(190,2,'',0,0,'C');
//ESPAÇAMENTO DO CABECALHO PARA A TABELA
$this->Ln();

$this->SetTextColor(255,255,255);
$this->Cell(190,$l,'Titulo 1',1,0,'C',1);
$this->Ln();

//TITULO DA TABELA DE SERVIÇOS
$this->SetFillColor(232,232,232);
$this->SetTextColor(0,0,0);
$this->SetFont('Arial','B',8);
$this->Cell(10,$l,'Titulo 1',1,0,'L',1);
$this->Cell(31,$l,'Titulo 2',1,0,'l',1);
$this->Cell(70,$l,'Titulo 3,1,0,'L',1);
$this->Cell(12,$l,'Titulo 4',1,0,'C',1);
$this->Cell(12,$l,'Titulo 5',1,0,'C',1);
$this->Cell(40,$l,'Titulo 6',1,0,'C',1);
$this->Cell(15,$l,'Titulo 7',1,0,'C',1);
$this->Ln();
}

function Footer(){ // CRIANDO UM RODAPE

$this->SetXY(15,280);
$this->Rect(10,270,190,20);
$this->SetFont('Arial','',10);
$this->Cell(70,8,'Assinatura ','T',0,'L');
$this->Cell(40,8,' ',0,0,'L');
$this->Cell(70,8,'Assinatura','T',0,'L');
$this->Ln();
$this->SetFont('Arial','',7);
$this->Cell(190,7,'Página '.$this->PageNo().' de {nb}',0,0,'C');
}

}

//CONECTE SE AO BANCO DE DADOS SE PRECISAR
include("config.php"); // A MINHA CONEXÃO FICOU EM CONFIG.PHP

$pdf=new PDF('P','mm','A4'); //CRIA UM NOVO ARQUIVO PDF NO TAMANHO A4
$pdf->AddPage(); // ADICIONA UMA PAGINA
$pdf->AliasNbPages(); // SELECIONA O NUMERO TOTAL DE PAGINAS, USADO NO RODAPE
$pdf->SetFont('Arial','',8);
$y = 59; // AQUI EU COLOCO O Y INICIAL DOS DADOS

$sql = "select * from tabela"; //SELECAO DOS DADOS QUE IRÃO PRO PDF
$result = mysql_query($sql);
$l=5; // ALTURA DA LINHA
while($row = mysql_fetch_array($result)) {
// ENQUANTO OS DADOS VÃO PASSANDO, O FPDF VAI INSERINDO OS DADOS NA PAGINA

$dados1 = $row["0"];
$dados2 = utf8_decode($row["1"]); // NESTE CASO, EU DECODIFIQUEI OS DADOS, POIS É UM CAMPO DE TEXTO.
$dados3 = $row["2"];
$dados4 = $row["3"];
$dados5 = $row["4"];
$dados6 = $row["5"];
$dados7 = $row["6"];

$l = 5 * contaLinhas($dados2,48);
// Eu criei a função "contaLinhas" para contar quantas linhas um campo pode conter se tiver largura = 48

if($y+$l>=230){ // 230 É O TAMANHO MAXIMO ANTES DO RODAPE

$pdf->AddPage(); // SE ULTRAPASSADO, É ADICIONADO UMA PÁGINA
$y=59; // E O Y INICIAL É RESETADO
}

//DADOS
$pdf->SetY($y);
$pdf->SetX(10);
$pdf->Rect(10,$y,70,$l);
$pdf->MultiCell(70,6,$dados2,0,2); // ESTA É A CELULA QUE PODE TER DADOS EM MAIS DE UMA LINHA
$pdf->SetFont('Arial','',6);
$pdf->SetY($y);
$pdf->SetX(20);
$pdf->Rect(20,$y,31,$l);
$pdf->MultiCell(31,6,$dados1,0,2);
$pdf->SetY($y);
$pdf->SetX(51);
$pdf->Rect(51,$y,10,$l);
$pdf->MultiCell(10,5,$dados3,0,2);
$pdf->SetY($y);
$pdf->SetX(121);
$pdf->Rect(121,$y,12,$l);
$pdf->MultiCell(12,6,$dados4,0,2,'C');
$pdf->SetY($y);
$pdf->SetX(133);
$pdf->Rect(133,$y,12,$l);
$pdf->MultiCell(12,6,$dados5,0,2,'C');
$pdf->SetY($y);
$pdf->SetX(145);
$pdf->Rect(145,$y,40,$l);
$pdf->MultiCell(40,6,$dados6,0,2,'C');
$pdf->SetY($y);
$pdf->SetX(185);
$pdf->Rect(185,$y,15,$l);
$pdf->MultiCell(15,6,$dados7,0,2,'C');
$pdf->Ln();
$y += $l;

}
 

mysql_close(); // FECHA A CONEXÃO COM MYSQL
$pdf->Output(); // IMPRIME O PDF NA TELA
Header('Pragma: public'); // ESTA FUNÇÃO É USADA PELO FPDF PARA PUBLICAR NO IE


Espero que tenha sido uma boa explicação para esta simples classe.
Comentem e/ou tirem suas dúvidas por e-mail.

Até o proximo post!

29 Comentários

Annimo disse... Muito boa a sua dica.
Valeu
Data: 19/03/2010 11:46
Jardel disse... Valeu Henrique, era o que eu tava procurando, já mexi há muito tempo com a Classe FPDF, mas não lembrava absolutamente nada, e encontrei aqui o que eu precisava... Muito obrigado. Data: 22/04/2010 17:06
Anônimo disse... boa dica Henrique, mas função contaLinhas() não está declarada. Como ela funciona? Valeu. Data: 22/04/2010 17:07
Anônimo disse... boa dica Henrique, mas função contaLinhas() não está declarada. Como ela funciona? Valeu. Data: 22/04/2010 17:08
Henrique Corrêa disse... Pessoas,
A função de contar linhas é o seguinte. Você informa quantos caracteres deseja por linha e ele divide o número de caracteres existentes por este número para saber quantas linhas serão necessárias.
Abraços
Data: 22/04/2010 17:09
Anônimo disse... mais nao entendi muito bem a funçâo contalinhas() pode me ayuda como ela que funciona? obrigado Data: 15/07/2010 17:27
herval disse... Como resolver esse problema abaixo?

Fatal error: Call to undefined function: contalinhas() in...
Data: 25/10/2010 17:28
Henrique Corrêa disse... Pessoas,

Sobre os comentários da função ContaLinhas():

Esta função é uma função que eu mesmo criei. Se vocês pretendem utiliza-la é simples. Ela simplesmente recebe um texto uma largura. Depois ele divide o número de caracteres existentes no texto por esta largura para saber quantas linhas serão necessárias no campo.

O número de linhas deste campo será utilizado para criar o retângulo em volta dele.

Não é uma função obrigatória ok. É utilizada somente para isso.

Abraços
Data: 25/10/2010 17:29
Anônimo disse... Cara, PERFEITO
Mastigadinho... mto bom pra quem ta começando
Data: 15/03/2011 17:30
Anônimo disse... Caro Henrique.
O tutorial é muito bom.
Mas dá erro
Veja: FPDF error: Some data has already been output, can't send PDF file

O que pode ser.

No aguardo
Data: 08/07/2011 17:30
Henrique Corrêa disse... Amigo "Anônimo"...
Alguma informação que você está tentando escrever no pdf não está sendo aceita.
Seria bom verificar as informações que está tentando enviar.

Se for melhor pra você, poste aqui o seu cósigo e podemos analisar juntos.

Abraço
Data: 08/07/2011 17:36
Anônimo disse... tem quantos metodos? Data: 31/08/2011 17:37
Henrique Corrêa disse... Amigo "Anônimo"...
Não entendi muito bem o valor de sua pergunta.
Pode ser mais claro sobre a importância da quantidade de métodos de uma classe?
Data: 31/08/2011 17:37
Edinho disse... Opa, preciso de ajuda e gostei do seu script, mas minha duvida está no seguinte, tenho um cadastro de protudos onde tenho a referencia do produto, e o nome da foto dele, consigo gerar uma lista formatada com uma coluna referencia e uma coluna o nome da foto e outra com a foto. Até ai tranquilo, preciso que gere um uma pagina pdf essa lista mas em 3 colunas, só com a foto e a referencia logo abaixo, tipo um catalogo de produtos. Pensei em uma "matriz" de 6 linhas por 5 colunas com os dados dentro, mas nao consigo gerar isso... Data: 22/11/2011 13:40
Henrique Corrêa disse... Olá Edinho,

Fiz um relatório assim já.
O que você terá que fazer é modelar suas prórias páginas dentro de uma página só:
- Você terá que utilizar a largura dos campos fixa. $largura;
- utilize uma variável para contar a linha atual, quando esta variável chegar ao tamanho da página, você volta para $pos_y = 0 e $pos_x = $pos_x + $largura;
- Se a coluna for a terceira, então você terá que utilizar a função $pdf->AddPage();

Bom... tentei explicar como fiz, qualquer coisa, estarei aqui!

Obrigado!
Data: 22/11/2011 13:47
Eduardo Oliveira disse... OLÁ jovem,comigo acontece o seguinte erro hora que eu xamooarquivo

Notice: Undefined offset: 1 in C:\aaa\aaa\aaa\bibliotecas\fpdf\fpdf.php on line 1494
Data: 03/02/2012 09:40
Eduardo Oliveira disse... OLÁ jovem,comigo acontece o seguinte erro hora que eu xamooarquivo

Notice: Undefined offset: 1 in C:\aaa\aaa\aaa\bibliotecas\fpdf\fpdf.php on line 1494
Data: 03/02/2012 09:42
Henrique Corrêa disse... Eduardo,
O erro é interno à sua biblioteca FPDF, não estando explícito na mensagem que você enviou, podendo variar de versão para versão do FDPF. Seria útil você verificar esta linha do arquivo fpdf.php e enviá-la. Assim eu conseguiria verificar mais facilmente o problema.
Data: 03/02/2012 11:13
Eduardo Oliveira disse... este é o seeu código que eu adaptei uma consulta a ele...

http://pastebin.com/2b4g3fNN

a mensagem que ele me retorna quando chamo esse código

Notice: Undefined offset: 1 in C:\aaaa\aaa\aaa\bibliotecas\fpdf\fpdf.php on line 1494
FPDF error: Some data has already been output, can't send PDF file

e a seguir o código que está na linha que o erro se refere...

http://pastebin.com/AABqd8Ph

eu comentei a linha 1494, é a primeira dentro do ELSE

Agradeço Muito pela Atenção Obrigado...Aguardo
Data: 03/02/2012 15:18
Henrique Corrêa disse... Eduardo,

Não consegui descobrir exatamente o que pode ser, mas pelo que procedeu no código que você enviou, parece algo que acontece quando exibe a paginação no rodapé.
Tente comentar esta parte do código e veja se o erro persiste. Baixe uma versão mais antiga da biblioteca em http://fpdf.org e veja se ainda continua errado.
No exemplo passado neste post foi utilizado a versão 1.53.
Me diga o resultado ok!
Até mais
Data: 03/02/2012 15:47
Eduardo Oliveira disse... Sim, vou estar testando aqui, e até baixando uma versão mais antiga dela, pois a que estou trabalhando senão me engano é a mais recente...jaja eu volto pra dizer Obrigado Data: 03/02/2012 15:55
Eduardo Oliveira disse... Olá Henrique, baxei a versão que vc utilza no tuto a 1.53, no entanto os erros persistem inclusive os anteriores veja


Deprecated: Function set_magic_quotes_runtime() is deprecated in C:\xampp\htdocs\boletim_colegio\bibliotecas\fpdf\fpdf.php on line 910

Deprecated: Function set_magic_quotes_runtime() is deprecated in C:\xampp\htdocs\boletim_colegio\bibliotecas\fpdf\fpdf.php on line 923

Notice: Undefined offset: 1 in C:\xampp\htdocs\boletim_colegio\bibliotecas\fpdf\fpdf.php on line 1124

Deprecated: Function set_magic_quotes_runtime() is deprecated in C:\xampp\htdocs\boletim_colegio\bibliotecas\fpdf\fpdf.php on line 1165

Deprecated: Function set_magic_quotes_runtime() is deprecated in C:\xampp\htdocs\boletim_colegio\bibliotecas\fpdf\fpdf.php on line 1203
FPDF error: Some data has already been output, can't send PDF file

até cheguei a ativar o magic_quotes_runtime mas sem exito
Data: 03/02/2012 16:04
Eduardo Oliveira disse... Quando disse que tentei ativar o magic_quotes_runtime, foi no aquivo da pasta do php, em PHP.INI não sei ao certo se tem algo a ver.... Data: 03/02/2012 16:05
Eduardo Oliveira disse... Quando disse que tentei ativar o magic_quotes_runtime, foi no aquivo da pasta do php, em PHP.INI não sei ao certo se tem algo a ver.... Data: 03/02/2012 16:17
Eduardo Oliveira disse... Nossa cara eu devo ta enxendo o saco já kkk mas que estou fazendo pra 1 trabalho coisa séria daí o apavvoro....

eu troquei a versão novamente agora pra 1.6 todos os erros referente ao get_magic_quotes_runtime e set_quotes_runtime foram resolvidos porém este permanece

Notice: Undefined offset: 1 in C:\xampp\htdocs\boletim_colegio\bibliotecas\fpdfv16\fpdf.php on line 1417
FPDF error: Some data has already been output, can't send PDF file

se puder me ajudar fico grato
Data: 03/02/2012 16:54
Eduardo Oliveira disse... este foi resolvido
Notice: Undefined offset: 1 in C:\xampp\htdocs\boletim_colegio\bibliotecas\fpdfv16\fpdf.php on line 1417

na linha do erro coloquei um ISSET pois nela não existia

$l=isset($this->links[$pl[4]]);

agora este eu não faço idéia de como arruma

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

não ha espaços em branco nem no inicio nem no fim do código...i ele não abre
Data: 03/02/2012 17:02
Henrique Corrêa disse... Eduardo,
Dei uma estudada rápida aqui e ainda não consegui identificar o que realmente pode ser.
Fiz o seguinte... troquei os seus dados de conexão por texto e tudo funcionou. Tente verificar se dentro das informações que serão impressas a partir do banco contém aspas simples ou duplas, ou se contém conteúdo html.

Data: 03/02/2012 17:41
Henrique Corrêa disse... Eduardo,

Qualquer coisa, tente entrar em contato diretamente com o site fpdf.org.

Data: 03/02/2012 17:55
Eduardo Oliveira disse... Salve jovem, muito obrigado pela sua força, tem sido muito util, venho informar que consegui corrigir o erro esta no INCLUDE da conexao, eu a fiz direto no arquivo ai ele abre, só que no documento ele só me mostra as bordas e a imagem, porque orestante não é mostrado?

Desde ja´Muitoo Obrigado
Data: 03/02/2012 19:44

Deixe seu comentário

Não será exibido

Desejo acompanhar os comentários para este post.

Desejo receber novidades do site.

Redes Sociais

  1. RSS

Parceiros

DFGS Sistemas Permesso Pubblicitá