Relatórios em PDF com PHP usando a classe FPDF

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!

Tags desta matéria

Comentários  (100)

  • Anônimo
    Anônimo 19/03/2010 11:46

    Muito boa a sua dica.

    Valeu

  • Jardel
    Jardel 22/04/2010 17:06

    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.

  • Anônimo
    Anônimo 22/04/2010 17:07

    boa dica Henrique, mas função contaLinhas() não está declarada. Como ela funciona? Valeu.

  • Anônimo
    Anônimo 22/04/2010 17:08

    boa dica Henrique, mas função contaLinhas() não está declarada. Como ela funciona? Valeu.

  • Henrique Corrêa
    Henrique Corrêa 22/04/2010 17:09

    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

  • Anônimo
    Anônimo 15/07/2010 17:27

    mais nao entendi muito bem a funçâo contalinhas() pode me ayuda como ela que funciona?
    obrigado

  • herval
    herval 25/10/2010 17:28

    Como resolver esse problema abaixo?



    Fatal error: Call to undefined function: contalinhas() in...

  • Henrique Corrêa
    Henrique Corrêa 25/10/2010 17:29

    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

  • Anônimo
    Anônimo 15/03/2011 17:30

    Cara, PERFEITO

    Mastigadinho... mto bom pra quem ta começando

  • Anônimo
    Anônimo 08/07/2011 17:30

    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

  • Henrique Corrêa
    Henrique Corrêa 08/07/2011 17:36

    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

  • Anônimo
    Anônimo 31/08/2011 17:37

    tem quantos metodos?

  • Henrique Corrêa
    Henrique Corrêa 31/08/2011 17:37

    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?

  • Edinho
    Edinho 22/11/2011 13:40

    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...

  • Henrique Corrêa
    Henrique Corrêa 22/11/2011 13:47

    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!

  • Eduardo Oliveira
    Eduardo Oliveira 03/02/2012 09:40

    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

  • Eduardo Oliveira
    Eduardo Oliveira 03/02/2012 09:42

    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

  • Henrique Corrêa
    Henrique Corrêa 03/02/2012 11:13

    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.

  • Eduardo Oliveira
    Eduardo Oliveira 03/02/2012 15:18

    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

  • Henrique Corrêa
    Henrique Corrêa 03/02/2012 15:47

    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

  • Eduardo Oliveira
    Eduardo Oliveira 03/02/2012 15:55

    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

  • Eduardo Oliveira
    Eduardo Oliveira 03/02/2012 16:04

    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

  • Eduardo Oliveira
    Eduardo Oliveira 03/02/2012 16:05

    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....

  • Eduardo Oliveira
    Eduardo Oliveira 03/02/2012 16:17

    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....

  • Eduardo Oliveira
    Eduardo Oliveira 03/02/2012 16:54

    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

  • Eduardo Oliveira
    Eduardo Oliveira 03/02/2012 17:02

    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

  • Henrique Corrêa
    Henrique Corrêa 03/02/2012 17:41

    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.

  • Henrique Corrêa
    Henrique Corrêa 03/02/2012 17:55

    Eduardo,

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

  • Eduardo Oliveira
    Eduardo Oliveira 03/02/2012 19:44

    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

  • Matheus
    Matheus 20/07/2012 21:09

    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ó?

  • Henrique Corrêa
    Henrique Corrêa 22/07/2012 02:00

    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.

  • Thiago Duarte
    Thiago Duarte 04/09/2012 11:46

    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?

  • Thiago Duarte
    Thiago Duarte 04/09/2012 12:15

    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?

  • Thiago Duarte
    Thiago Duarte 04/09/2012 12:19

    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();

  • Henrique Corrêa
    Henrique Corrêa 04/09/2012 12:48

    Excelente Thiago,
    Vale lembrar que existem outras formas de se criar um formulário zebrado.

    Até

  • Rogério Faber
    Rogério Faber 26/09/2012 15:57

    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.

  • Henrique Corrêa
    Henrique Corrêa 27/09/2012 00:25

    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!

  • Ricardo
    Ricardo 27/09/2012 17:42

    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....

  • Ricardo
    Ricardo 27/09/2012 17:45

    outro problema... os dados de uma celular está sobrepondo a outra... como limito a exibição?

  • Henrique Corrêa
    Henrique Corrêa 27/09/2012 18:03

    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é!

  • Ricardo
    Ricardo 28/09/2012 08:52

    outro problema... os dados de uma celular está sobrepondo a outra... como limito a exibição?

  • Ricardo
    Ricardo 28/09/2012 08:54

    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..

  • Henrique Corrêa
    Henrique Corrêa 28/09/2012 09:19

    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é!

  • Mel
    Mel 14/10/2012 19:17

    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?

  • Mel
    Mel 14/10/2012 23:37

    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?

  • Mel
    Mel 15/10/2012 04:42

    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?

  • Henrique Corrêa
    Henrique Corrêa 15/10/2012 08:10

    Tem sim Mel,
    Crie uma variável somando os valores linha à linha, e na ultima linha escreva os dados.

  • Tynha Azevedo
    Tynha Azevedo 13/11/2012 11:01

    o que faço com caracteres especiais.... Ex: á,à, é, è, ç .... Eles aparecem uns símbolos....

  • Henrique Corrêa
    Henrique Corrêa 13/11/2012 11:18

    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);

  • ROQ
    ROQ 13/11/2012 14:52

    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

  • ROQ
    ROQ 13/11/2012 14:55

    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

  • Henrique Corrêa
    Henrique Corrêa 13/11/2012 17:17

    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..

  • ROQ
    ROQ 14/11/2012 14:12

    Ok valeu cara irei mandar sim o e-mail.Abraçç boa tarde ai para ti.

  • ROQ
    ROQ 14/11/2012 14:13

    Ok valeu cara irei mandar sim o e-mail.Abraçç boa tarde ai para ti.

  • Marcos
    Marcos 14/11/2012 18:24

    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?

  • Henrique Corrêa
    Henrique Corrêa 14/11/2012 19:16

    Oi Marcos,
    Pela adaptação que você fez, tente modificar o Y do footer também. Talvez seja isso.

  • Ranieri Costa
    Ranieri Costa 15/11/2012 00:35

    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.

  • Henrique Corrêa
    Henrique Corrêa 15/11/2012 13:54

    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.

  • Cesar
    Cesar 16/11/2012 15:07

    Muito bom o seu codigo!


    Fatal error: Call to undefined function contaLinhas()

    Aparece esta mensagem podes me ajudar a resolver ?

  • Cesar
    Cesar 16/11/2012 15:11

    Muito bom o seu codigo!


    Fatal error: Call to undefined function contaLinhas()

    Aparece esta mensagem podes me ajudar a resolver ?

  • Henrique Corrêa
    Henrique Corrêa 16/11/2012 21:48

    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.

  • Claiton
    Claiton 17/12/2012 19:53

    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.

  • Claiton
    Claiton 18/12/2012 01:24

    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.

  • Claiton
    Claiton 18/12/2012 01:57

    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.

  • Henrique Corrêa
    Henrique Corrêa 18/12/2012 09:03

    Claiton,
    Tente utilizar o nome dos campos no lugar de *.

  • Cristina
    Cristina 06/02/2013 21:54

    Gostaria muito dessa função contalinhas , não consigui fazer
    de jeito nenhum

  • Wagner Gilberto
    Wagner Gilberto 07/05/2013 21:20

    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

  • Henrique Corrêa
    Henrique Corrêa 08/05/2013 09:48

    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.

  • Henrique Corrêa
    Henrique Corrêa 08/05/2013 09:49

    Cristina,
    Fiz uma matéria só sobre esta função. Você pode ler mais sobre em http://henriquecorrea.com/news/Funcao-Contar-Linhas
    Obrigado!

  • cleusa collares machado
    cleusa collares machado 13/08/2013 15:02

    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

  • Henrique Corrêa
    Henrique Corrêa 13/08/2013 15:53

    Cleusa,
    Não entendi muito bem o que você quis dizer... Pode explicar melhor?

  • Nicole
    Nicole 26/09/2013 15:33

    olá, queria saber como a função conta linhas e se vc poderia mandar um exemplo para mim ..
    obg :)

  • Henrique Corrêa
    Henrique Corrêa 26/09/2013 15:36

    Olá Nicole,
    O link para a função está no post!

  • Álvaro
    Álvaro 14/10/2013 17:02

    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 ...

  • Henrique Corrêa
    Henrique Corrêa 14/10/2013 17:48

    Olá Álvaro,
    Ainda não conheço esta classe.

  • Lucivaldo Barbosa
    Lucivaldo Barbosa 25/11/2013 15:50

    Muito bom seria legal se você deixar disponivel a tabela do mysql pra gente testar aqui!

    Está de parabéns!

  • Edmundo
    Edmundo 09/12/2013 05:49

    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.

  • Henrique Corrêa
    Henrique Corrêa 09/12/2013 12:48

    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..

  • Henrique Corrêa
    Henrique Corrêa 09/12/2013 12:49

    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.

  • Fred
    Fred 21/08/2014 00:13

    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.

  • Fred
    Fred 21/08/2014 00:17

    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);
    }

  • Fred
    Fred 21/08/2014 00:19

    Mas o exemplo acima vai sempre duplicar os mesmos dados! :( Sugestões?

  • Henrique Corrêa
    Henrique Corrêa 21/08/2014 00:26

    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.

  • Francisco
    Francisco 28/08/2014 11:52

    Muito boa essa dica

  • Ivan Pinheiro
    Ivan Pinheiro 06/09/2014 19:16

    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.

  • Henrique Corrêa
    Henrique Corrêa 08/09/2014 21:32

    Ivan,
    Pode usar o FPDF pra isso. É bem simples.

  • Henrique Corrêa
    Henrique Corrêa 16/09/2014 17:00

    Existem muitas outras informações sobre o FPDF que em breve vou postar aqui no site também. Estou preparando outros tutoriais.

  • Marcio Sales
    Marcio Sales 18/11/2014 16:25

    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

  • Henrique Corrêa
    Henrique Corrêa 18/11/2014 16:46

    Marcio,
    Isso é possível sim e bem simples de implementar.
    Entrarei em contato por e-mail.

    Att..

  • Elder
    Elder 12/01/2015 17:13

    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;

    }

  • Henrique Corrêa
    Henrique Corrêa 13/01/2015 12:39

    Valeu Elder!

  • RIOSTATO
    RIOSTATO 22/08/2015 08:39

    queria saber quanto vcs cobram no programa de vcs, acho q os meu estão muito baratenhos, me liguem +55 14 991452428

  • Everton
    Everton 08/05/2017 13:39

    Como faço para criar um retângulo com os cantos arredondados?

  • Henrique Corrêa
    Henrique Corrêa 16/05/2017 10:50

    Everton, não existe essa função nativa. Você pode usar a criatividade utilizando semi circulos e linhas.

  • Adriano
    Adriano 20/07/2017 14:54

    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.

  • Adriano
    Adriano 20/07/2017 14:56

    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.

  • Henrique Corrêa
    Henrique Corrêa 10/08/2017 11:08

    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.

  • Mauro R
    Mauro R 17/03/2018 16:45

    Código para utilização de acesso à tabela Mysql resultando em um pdf zebrado com os dados dos campos escolhidos:
    Espero que auxilie alguém com necessidade de colorir, linha sim, linha não, os resultados.

  • Neto Sales
    Neto Sales 15/01/2019 00:31

    Gostaria de abrir o meu fpdf numa nova guia ou aba, ou janela. Está funcionando, mas abre na janela ativa, \"em cima\" da janela que gerou, o que gera um warning no código, por conta do redirecionamento.

  • Marcelo
    Marcelo 04/01/2023 13:51

    Olá !
    Gostaria de saber se com esta classe é possível anexar também um gráfico gerado a partir do Google Charts?
    Marcelo

Deixe sua opnião