Se a sua vida for a melhor coisa que já te aconteceu, acredite, você tem mais sorte do que pode imaginar. - Daniel Godri

Relatórios em PDF com PHP usando a classe FPDF

01 de Agosto 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.

FPDF

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


/* Editado em 12/04/2013 */
Atendendo à vários pedidos, eis a Função contaLinhas();
/* Fim da Edição */


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!

97 Comentários

Annimo  Annimo disse... Muito boa a sua dica.
Valeu
Data: 19/03/2010 11:46
Jardel  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  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 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 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  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  herval disse... Como resolver esse problema abaixo?

Fatal error: Call to undefined function: contalinhas() in...
Data: 25/10/2010 17:28
Henrique Corrêa 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  Anônimo disse... Cara, PERFEITO
Mastigadinho... mto bom pra quem ta começando
Data: 15/03/2011 17:30
Anônimo  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 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  Anônimo disse... tem quantos metodos? Data: 31/08/2011 17:37
Henrique Corrêa 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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
Matheus Matheus disse... Opa Henrique, o seu tutorial me ajudou bastante, mas estou com um problema. Eu puxo dados do banco postgres sendo que tenho que gerar pdf com até 200 mil linhas do banco em uma só string, para isso entendo que tenho que quebrá-lo ou esvaziar o buffer para ser gerado uma determinada quantidade no browser, como posso fazer para que ele gere vários pdfs em uma chamada só? Data: 20/07/2012 21:09
Henrique Corrêa Henrique Corrêa disse... Matheus, eu ainda não experimentei o FPDF com grande volume de dados. O que posso concluir é que você está certo em quebrar o texto em vários, porém não sei dizer qual a melhor forma para quebrar tanta informação e gerar o pdf em tela.
Talvez o melhor seja gerar para Download.
Para isso você pode utilizar:

$pdf->Output('nomedoarquivo.pdf','D');

Espero ter ajudado.
Data: 22/07/2012 02:00
Thiago Duarte Thiago Duarte disse... Otimo tuto, parabens. Estou com uma duvida, quero colocar o relatorio no estilo zebra, ou seja cor sim, cor nao. Mas ja rodei a ainda nao consegui poderia me ajudar? Data: 04/09/2012 11:46
Thiago Duarte Thiago Duarte disse... Otimo tuto, parabens. Estou com uma duvida, quero colocar o relatorio no estilo zebra, ou seja cor sim, cor nao. Mas ja rodei a ainda nao consegui poderia me ajudar? Data: 04/09/2012 12:15
Thiago Duarte Thiago Duarte disse... Obrigado novamente pelo tuto. Ja consegui dessifrar o misterio segue o exemplo para deixa a celula colorida:
//Novo objeto PDF
$pdf = new Documento1('P','pt','A4');
//Add Pagina
$pdf->AddPage();

$pdf->AliasNbPages();
$pdf->SetFont('Arial','B',10);
$pdf->Cell(540,10,'_______________________________________________________________________________________________',0,0,'L');
$pdf->Ln(20);

//Criando Cabecalho da tabela
$pdf->Cell(20,10,'Cod',0,0,'C');
$pdf->Cell(100,10,'Nome',0,0,'L');
$pdf->Cell(100,10,'Sobre Nome',0,0,'L');

//Povoando a Tabela
for($x=1;$x<100;$x++){
$pdf->Ln(10);
$pdf->Cell(20,10,$x,0,0,'C');
$pdf->Cell(100,10,'x',0,0,'L');
$pdf->Cell(100,10,'xx',0,0,'L');
$pdf->Ln(10);
$x=$x+1;
$pdf->SetFillColor(192,192,192);//Deixa o fundo da celula colorido
$pdf->Cell(20,10,$x,0,0,'C',1);
$pdf->Cell(100,10,'Y',0,0,'L',1);
$pdf->Cell(100,10,'YY',0,0,'L',1);
}
$pdf->OutPut();
Data: 04/09/2012 12:19
Henrique Corrêa Henrique Corrêa disse... Excelente Thiago,
Vale lembrar que existem outras formas de se criar um formulário zebrado.

Até
Data: 04/09/2012 12:48
Rogério Faber Rogério Faber disse... Usei o seu código para gerar um relatório que estou fazendo. Na query que seleciona os dados do meu banco de dados, quando faço select *, tudo bem, os dados aparecem no relatório, mas quando tento selecionar entre duas datas usando o comando BETWEEN $vardata1 and $vardata2 o relatório não me traz os dados, o relatório aparece mas sem registros. No meu BD o campo está como data no formato yyyy-mm-dd. Data: 26/09/2012 15:57
Henrique Corrêa Henrique Corrêa disse... Olá Rogério,

Pode ser apenas um erro no seu script sql. Tente colocar as datas entre aspas simples, ex: Select * form tabela where data between '$data1' and '$data2'.
O formato da data não interfere para que ela apareça, apenas interfere no formato mostrado na tela.

Até mais!
Data: 27/09/2012 00:25
Ricardo Ricardo disse... Henrique... 2 perguntas.. quer fazer sub grupos com totalizador.. e a cada novo cabeçalho quero incluir om campo do select... como faço?
manjo pouco....
Data: 27/09/2012 17:42
Ricardo Ricardo disse... outro problema... os dados de uma celular está sobrepondo a outra... como limito a exibição? Data: 27/09/2012 17:45
Henrique Corrêa Henrique Corrêa disse... Ricardo,

Você pode criar uma função para gerar os subgrupos que deseja, limitando pelo tamanho e o espaço referidos de cada página.

E para não sobrepor células é necessário que o tamanho da célula seja maior que o texto que ela exibe. Você também pode calcular este tamanho com funções.

Até!
Data: 27/09/2012 18:03
Ricardo Ricardo disse... outro problema... os dados de uma celular está sobrepondo a outra... como limito a exibição? Data: 28/09/2012 08:52
Ricardo Ricardo disse... Certo Henrique...

mas o valor da celula é variavel pode ter até 60 caracteres, mas so quero que mostre o tamanho até o tamanho da celula de 30 por exemplo... mas vou ver o que faço.. vlw..
Data: 28/09/2012 08:54
Henrique Corrêa Henrique Corrêa disse... Ricardo,

Você pode utilizar a função substr na variável.

Ex.:
$var = substr($valor, 0 , 30);
$pdf->Cell($x, $alt, $valor, 0, 0, 'L');

Este exemplo pega os 30 primeiros caracteres da variável.

Até!
Data: 28/09/2012 09:19
Mel Mel disse... Olá! Eu listo um relatório contas a pagar e queria abaixo dos valores tipo Valor 1,2 ,3 abaixo do 3, por exemplo aparecer o total desses valores, ou seja o valor total de contas a pagar. Tem como? Data: 14/10/2012 19:17
Mel Mel disse... Olá! Eu listo um relatório contas a pagar e queria abaixo dos valores tipo Valor 1,2 ,3 abaixo do 3, por exemplo aparecer o total desses valores, ou seja o valor total de contas a pagar. Tem como? Data: 14/10/2012 23:37
Mel Mel disse... Olá! Eu listo um relatório contas a pagar e queria abaixo dos valores tipo Valor 1,2 ,3 abaixo do 3, por exemplo aparecer o total desses valores, ou seja o valor total de contas a pagar. Tem como? Data: 15/10/2012 04:42
Henrique Corrêa Henrique Corrêa disse... Tem sim Mel,
Crie uma variável somando os valores linha à linha, e na ultima linha escreva os dados.
Data: 15/10/2012 08:10
Tynha Azevedo Tynha Azevedo disse... o que faço com caracteres especiais.... Ex: á,à, é, è, ç .... Eles aparecem uns símbolos.... Data: 13/11/2012 11:01
Henrique Corrêa Henrique Corrêa disse... Olá Tynha,

O FPDF usa codificação padrão ISO-8859-1 ou Windows-1252. Porém você pode utilizar a função utf8_decode() para converter os acentos.
Ex.:
$str = utf8_decode($str);

Porém alguns caracteres não são traduzidos corretamente. Se a extenção "iconv" estiver habilitada, utilize:

$str = iconv('UTF-8', 'windows-1252', $str);
Data: 13/11/2012 11:18
ROQ ROQ disse... Iai cara otimo tuto, queria ver se vc pode me ajudar tenho to tentando fazer algo semelhante, e que tenho uma table no BD (PHPMyAdmin), ai tenho uma pagina de pesquisa (que ira pesquisar e retornar um relatorio em forma de PDF) só que nao estou conseguindo elabora o meu script para que eu consiga realizar esse relatorio, se crio o schipt na paginha que tem o formulario de pesquisa ou se crio o script em uma nova pagina que ira receber os valores da pesuisa?? Por favor cara da uma força aee^^ to desesperado se quiser posto os meus script's. aguardo uma resposta Data: 13/11/2012 14:52
ROQ ROQ disse... Iai cara otimo tuto, queria ver se vc pode me ajudar tenho to tentando fazer algo semelhante, e que tenho uma table no BD (PHPMyAdmin), ai tenho uma pagina de pesquisa (que ira pesquisar e retornar um relatorio em forma de PDF) só que nao estou conseguindo elabora o meu script para que eu consiga realizar esse relatorio, se crio o schipt na paginha que tem o formulario de pesquisa ou se crio o script em uma nova pagina que ira receber os valores da pesuisa?? Por favor cara da uma força aee^^ to desesperado se quiser posto os meus script's. aguardo uma resposta Data: 13/11/2012 14:55
Henrique Corrêa Henrique Corrêa disse... Olá ROQ,

Se sua dúvida é sobre onde alocar os scripts, é melhor você fazer uma análise geral em todo o código e verificar o que é melhor para o seu projeto. Existem várias maneiras de se programar e de organizar um código fonte. Precisaria de muitos detalhes para poder lhe ajudar.

Me envie um e-mail pelo formulário de contato e veremos o que pode ser feito.

Att..
Data: 13/11/2012 17:17
ROQ ROQ disse... Ok valeu cara irei mandar sim o e-mail.Abraçç boa tarde ai para ti. Data: 14/11/2012 14:12
ROQ ROQ disse... Ok valeu cara irei mandar sim o e-mail.Abraçç boa tarde ai para ti. Data: 14/11/2012 14:13
Marcos Marcos disse... 1º - muito bom seu tutorial só fiz uma midificação
troquei
if($y + $l >= 230){
$pdf->AddPage();
$y=59;
}
por isso
if($pdf->GetY() >= 180){
$pdf->AddPage();
}
eu to unsado 180 pois utilizo paisagem

uma coisa que não funcionou nem a pau no meu aqui o footer

tem alguma dica pra passar?
Data: 14/11/2012 18:24
Henrique Corrêa Henrique Corrêa disse... Oi Marcos,
Pela adaptação que você fez, tente modificar o Y do footer também. Talvez seja isso.
Data: 14/11/2012 19:16
Ranieri Costa Ranieri Costa disse... OLá Henrique parabéns mais uma vez, o post realmente tem ajudado muita gente e eu sou um deles, minha dúvida é como gerar o relatório por meio de uma váriavel ainda não definida, passada por um GET ou POST, gostaria de definir valores e após isso eu geraria o relatório, desde já obrigado pela compreenção. Data: 15/11/2012 00:35
Henrique Corrêa Henrique Corrêa disse... Olá Ranieri,
Não vejo muita dificuldade em fazer isso.
Receba as variáveis e trate-as antes de montar o PDF.
Você pode fazer isso em qualquer parte antes de chamar as funções relativas ao PDF.
Data: 15/11/2012 13:54
Cesar Cesar disse... Muito bom o seu codigo!


Fatal error: Call to undefined function contaLinhas()

Aparece esta mensagem podes me ajudar a resolver ?
Data: 16/11/2012 15:07
Cesar Cesar disse... Muito bom o seu codigo!


Fatal error: Call to undefined function contaLinhas()

Aparece esta mensagem podes me ajudar a resolver ?
Data: 16/11/2012 15:11
Henrique Corrêa Henrique Corrêa disse... Cesar,
Esta função é uma função9 que fiz aqui para contar quantas linhas irei precisar para colocar meu texto com x caracteres, quando eu uso y caracteres por linha.
Você pode ignora-la ou criá-la como desejar.
Data: 16/11/2012 21:48
Claiton Claiton disse... Olá Henrique, aqui também dá erro na contalinhas e no $dados...

Estou querendo montar relatórios da seguinte forme:

Select * from aluno order by nome (vai trazer o nome, id, data nasc, turma, por exemplo).

Select * from turmas order by descricao(vai trazer as turmas com a descrição, id, por exemplo).

Select * from matriculas (vai trazer as informações de matriculas, por exemplo).

E assim por diante, porém ao colocar a minha query dá erro, se puder me ajudar.

Data: 17/12/2012 19:53
Claiton Claiton disse... Olá Henrique, aqui também dá erro na contalinhas e no $dados...

Estou querendo montar relatórios da seguinte forme:

Select * from aluno order by nome (vai trazer o nome, id, data nasc, turma, por exemplo).

Select * from turmas order by descricao(vai trazer as turmas com a descrição, id, por exemplo).

Select * from matriculas (vai trazer as informações de matriculas, por exemplo).

E assim por diante, porém ao colocar a minha query dá erro, se puder me ajudar.

Data: 18/12/2012 01:24
Claiton Claiton disse... Olá Henrique, aqui também dá erro na contalinhas e no $dados...

Estou querendo montar relatórios da seguinte forme:

Select * from aluno order by nome (vai trazer o nome, id, data nasc, turma, por exemplo).

Select * from turmas order by descricao(vai trazer as turmas com a descrição, id, por exemplo).

Select * from matriculas (vai trazer as informações de matriculas, por exemplo).

E assim por diante, porém ao colocar a minha query dá erro, se puder me ajudar.

Data: 18/12/2012 01:57
Henrique Corrêa Henrique Corrêa disse... Claiton,
Tente utilizar o nome dos campos no lugar de *.
Data: 18/12/2012 09:03
Cristina Cristina disse... Gostaria muito dessa função contalinhas , não consigui fazer
de jeito nenhum
Data: 06/02/2013 21:54
Wagner Gilberto Wagner Gilberto disse... Olá, estou fazendo um relatório utilizando a classe fpdf e consegui exibir os dados( nome, email, telefone0 porem, preciso que seja exibida a foto armazenada no banco de dado que armazena o nome exemplo( 1d1a7989a100839fa0300227f56d3947.jpeg) e a imagem (real) fica na pasta uploads. Existe como fazer a impressao da imagem utilizando a classe FPDF. fiz busca na net hoje o dia inteiro mas não encontrei nada.
Atenciosamente Wagner Gilberto
Data: 07/05/2013 21:20
Henrique Corrêa Henrique Corrêa disse... Olá Wagner,
Você pode inserir imagens do tipo jpg, gif e png.
A função específica é Image. Você ver mais sobre isso no link http://fpdf.org/en/doc/image.htm.
Data: 08/05/2013 09:48
Henrique Corrêa Henrique Corrêa disse... Cristina,
Fiz uma matéria só sobre esta função. Você pode ler mais sobre em http://henriquecorrea.com/news/Funcao-Contar-Linhas
Obrigado!
Data: 08/05/2013 09:49
cleusa collares machado cleusa collares machado disse... Henrique, boa tarde
Estou com dificuldade para fazer o seguinte enviar um variavel junto para o servidor.
$pdf->Cell(30,5, $NroRES,'','B','C');
$pdf->ln(25);
$pdf->SetY(+53);
$pdf->Cell(55);
$pdf->ln(9);



$pdf->Output('Temp/$NroRES._Postagem_Correio.pdf','F');

$pdf->Output($NroRES.'_Postagem_Correio.pdf','D');

Sera que pode ajudar-me . obrigada
Data: 13/08/2013 15:02
Henrique Corrêa Henrique Corrêa disse... Cleusa,
Não entendi muito bem o que você quis dizer... Pode explicar melhor?
Data: 13/08/2013 15:53
Nicole Nicole disse... olá, queria saber como a função conta linhas e se vc poderia mandar um exemplo para mim ..
obg :)
Data: 26/09/2013 15:33
Henrique Corrêa Henrique Corrêa disse... Olá Nicole,
O link para a função está no post!
Data: 26/09/2013 15:36
Álvaro Álvaro disse... Henrique, você já usou a classe mPDF? Se sim, funcionou no scriptcase? Estou querendo mudar tipo de fonte, colocar sumário etc e li que a mPDF faz isso melhor ... Data: 14/10/2013 17:02
Henrique Corrêa Henrique Corrêa disse... Olá Álvaro,
Ainda não conheço esta classe.

Data: 14/10/2013 17:48
Lucivaldo Barbosa Lucivaldo Barbosa disse... Muito bom seria legal se você deixar disponivel a tabela do mysql pra gente testar aqui!

Está de parabéns!
Data: 25/11/2013 15:50
Edmundo Edmundo disse... Muito claro e objetivo, vai ajudar muito. Gostaria de uma ajuda. Como colocar uma variavel (matricula Id) como marca d'agua diagonal por exemplo em um arquivo pdf já escrito, de modo a abrir apenas leitura, colocar o id do usuário como marca d'agua e permitir a impressão desse arquivo. Obrigado, Já valeu. Data: 09/12/2013 05:49
Henrique Corrêa Henrique Corrêa disse... Lucivaldo,
Não disponibilizei o banco pois é apenas um teste mesmo que fiz. Para testar, você pode criar apenas variáveis e depois incorporar uma base de dados de uma forma mais cabível ao seu código.
Att..
Data: 09/12/2013 12:48
Henrique Corrêa Henrique Corrêa disse... Edmundo,
Você pode colocar a matrícula com uma cor de fonte mais clara, mas para colocar na diagonal não conheço opção.
Data: 09/12/2013 12:49
Fred Fred disse... Henrique, desculpa ressuscitar esse tópico! Você poderia me ajudar mostrando como fazer um código enxuto para uma Grid Zebrada? Vi que tem um exemplo acima de um colega, mas achei confuso.

Grato.
Data: 21/08/2014 00:13
Fred Fred disse... Consegui!

for($i=1;$i<=10;$i++){
$pdf->SetFillColor(220,220,220);
$pdf->Cell(190,5,'Dados sobre despesas... '.$i,0, 1, 'C', 1);
$pdf->SetFillColor(20,225,160);
$pdf->Cell(190,5,'Dados sobre despesas... '.$i,0, 1, 'C', 1);
}
Data: 21/08/2014 00:17
Fred Fred disse... Mas o exemplo acima vai sempre duplicar os mesmos dados! :( Sugestões? Data: 21/08/2014 00:19
Henrique Corrêa Henrique Corrêa disse... Fred,
Crie um contador de linha. Se a divisao dele for exata, pinte o fundo de uma cor. Caso contrario, pinte de outra cor.
Essa é a forma simples de fazer isso.
Data: 21/08/2014 00:26
Francisco Francisco disse... Muito boa essa dica Data: 28/08/2014 11:52
Ivan Pinheiro Ivan Pinheiro disse... Olá eu tenho um arquivo .doc de um contrato a ser gerado através do preenchimento de um formulário pelo usuário dados estes salvos em um banco de dados mysql. Então eu preciso escrever os dados obtidos no formulário pelo usuário e salvar em PDF alguém teria uma sugestão de como fazer essa aplicação?
att.
Data: 06/09/2014 19:16
Henrique Corrêa Henrique Corrêa disse... Ivan,
Pode usar o FPDF pra isso. É bem simples.
Data: 08/09/2014 21:32
Henrique Corrêa Henrique Corrêa disse... Existem muitas outras informações sobre o FPDF que em breve vou postar aqui no site também. Estou preparando outros tutoriais. Data: 16/09/2014 17:00
Marcio Sales Marcio Sales disse... Gostei da ideia.. mas tipo.. se meu formulario for complexo, tipo um certificado, com marca dágua, assinaturas. Da pra aplicar isso??
Tow com uma demanda urgente, e ate gostaria de contratar alguem pra gerar um relatorio personalizado que seja gerado visuLIZADO na tela com botão pra pdf e pra excel. Vc presta serviços assim.. Se positivio, faz contato.. pra fecharmos um orçamento. Obrigado
Data: 18/11/2014 16:25
Henrique Corrêa Henrique Corrêa disse... Marcio,
Isso é possível sim e bem simples de implementar.
Entrarei em contato por e-mail.

Att..
Data: 18/11/2014 16:46
Elder Elder disse... function contaLinhas($value, $maxChars) {
$isBigger = false;
$value = preg_replace("/]*>[\w\W]*?<\/head>[\n\r]*/i", '', $value);
$value = preg_replace("/]*>[\n\r]*/i", '', $value);
$value = preg_replace("/]*>[\w\W]*?<\/script>[\n\r]*/i", '', $value);
$value = preg_replace("/]*>[\w\W]*?<\/style>[\n\r]*/i", '', $value);
$value = strip_tags($value);
if ($maxChars != -1) {
if (strlen(trim($value)) > $maxChars) {
$value = substr($value, 0, $maxChars);
$isBigger = true;
}
}
$value = str_replace(array("<", ">"), array("<", ">"), $value);
if ($value == "") {
$value = " ";
}
if ($isBigger) {
$value .= "...";
}
return $value;

}
Data: 12/01/2015 17:13
Henrique Corrêa Henrique Corrêa disse... Valeu Elder! Data: 13/01/2015 12:39
RIOSTATO RIOSTATO disse... queria saber quanto vcs cobram no programa de vcs, acho q os meu estão muito baratenhos, me liguem +55 14 991452428 Data: 22/08/2015 08:39
Everton Everton disse... Como faço para criar um retângulo com os cantos arredondados? Data: 08/05/2017 13:39
Henrique Corrêa Henrique Corrêa disse... Everton, não existe essa função nativa. Você pode usar a criatividade utilizando semi circulos e linhas. Data: 16/05/2017 10:50
Adriano Adriano disse... Olá, tudo bom? Estou com um cliente que os relatórios dele foram preparados para serem gerados em PDF com o Fpdf , mas agora ele quer que gere também em Excel, existe uma forma de fazer com que esses relatórios sejam gerados para excel e pdf ou que seja gerado em PDF e depois convertido para excel, uma forma que de menos trabalho, não estou pronto para refazer todos os relatórios mudando de pdf para excel, mas sim uma forma que de de colocar as duas opções ou que de pdf gere para Excel. Data: 20/07/2017 14:54
Adriano Adriano disse... Olá, tudo bom? Estou com um cliente que os relatórios dele foram preparados para serem gerados em PDF com o Fpdf , mas agora ele quer que gere também em Excel, existe uma forma de fazer com que esses relatórios sejam gerados para excel e pdf ou que seja gerado em PDF e depois convertido para excel, uma forma que de menos trabalho, não estou pronto para refazer todos os relatórios mudando de pdf para excel, mas sim uma forma que de de colocar as duas opções ou que de pdf gere para Excel. Data: 20/07/2017 14:56
Henrique Corrêa Henrique Corrêa disse... Olá Adriano, existem classes que transformam o HTML em XLS e em PDF. Acredito até que a mesma programação utilizada para o FDPF pode ser aproveitada. Data: 10/08/2017 11:08

Deixe seu comentário

Seu e-mail não será exibido.
Receba as Novidades

Para receber as últimas novidades e promoções do site, digite seu e-mail e clique em enviar.

Arquivo do Blog