+3

Gerando documentos PDF com a classe FPDF

criado por Nivaldo Pereira de Arruda Neto em 10/08/2006 7:16pm
O FPDF é uma classe para PHP de grande utilidade no processo de criação de relatórios em formato PDF, utilizando funções simples e poderosas. O FPDF é um Software Livre (e gratuito), o que significa que você poderá utilizá-lo livremente para uso pessoal ou comercial, além de poder modificá-lo e estudar seu código-fonte, ao contrário da PDFlib, que exige o pagamento de licenças para uso comercial.

O FPDF possui suporte às principais funções para geração de relatórios, como por exemplo:

- Formatação de cabeçalho (Header) e rodapé (Footer);
- Quebra de página automática;
- Quebra de linha e justificação de texto automática;
- Suporte a imagens (JPEG e PNG);
- Suporte a fontes TrueType e Type1;

Instalando o FPDF

Antes de mais nada, acesse o endereço http://www.fpdf.org e faça o download da última versão do FPDF. Depois, descompacte o arquivo (.zip ou .tgz) no diretório em que ficará hospedado seu website.

Primeiros passos

Crie um arquivo com o nome de modelo.php, por exemplo, e adicione as seguintes linhas:

<?php 
define('FPDF_FONTPATH', 'font/');
require('fpdfxxx/fpdf.php'); // onde xxx é a versão da FPDF
$pdf = new FPDF();
$pdf->Open();
$pdf->AddPage();
$pdf->SetFont('Arial', 'B', 12);
$pdf->Write(4, 'Olá Mundo!!');
$pdf->Output();
?>

Agora vamos analisar cada linha:

define('FPDF_FONTPATH','font/');

Aqui você define onde está o diretório font/, criado na instalação do FPDF. Esta linha é obrigatória.

require('sub_diretorio/fpdf.php');

Nesta linha você informa onde está o arquivo fpdf.php. É neste arquivo que estão todas as funções utilizadas neste artigo. Esta linha também é obrigatória.

$pdf = new FPDF();

Cria o objeto FPDF. Os valores default para página são: tamanho A4 e no modo Retrato, com as medidas em milímetros (mm). A sintaxe da função FPDF() é:

FPDF([String Orientação [,String Unidade [,mixed formato]]]);
O parâmetro Orientação pode ser preenchido com:

- P: Portrait (Retrato) ou
- L: Landscape (Paisagem).

Em Unidade podemos informar os valores:

- pt: para pontos;
- mm: para milímetros;
- cm: para centímetros ou
- in: para polegadas.

E em Formato:

- A3;
- A4;
- A5;
- Letter;
- Legal.

$pdf->Open();

Inicia um novo documento PDF.

$pdf->AddPage();

Adiciona uma página ao documento, com o cursor a 1cm de distância da margem esquerda e 1cm de distância da margem superior;

$pdf->SetFont('Arial','B',12);

Aqui a Fonte é definida como Arial, tamanho 12 e em negrito. A sintaxe da função SetFont() é:

SetFont(string família [,string Estilo [,float tamanho]]);

Onde a família pode ser:

- Courier;
- Helvetica ou Arial;
- Times;
- Symbol ou;
- ZapfDingbats.

Estilo pode receber os valores:

- Vazio : Normal (sem formatação);
- B: Negrito;
- I: Itálico ou
- U: Sublinhado.

$pdf->Write(4,'Olá Mundo!!');

Imprime algum texto no documento. Neste caso, "Olá Mundo!!". A sintaxe da função Write() é:

Write(float altura_da_linha, string texto [, mixed link]);

O parâmetro link deve receber uma URL ou um identificador retornado pela função AddLink(). Não veremos essa função neste artigo, pois o seu propósito é criar relatórios dinâmicos para impressão ou armazenagem.

$pdf->Output();

Cria o arquivo PDF. Se o navegador tiver o plugin Adobe Acrobat Reader instalado, o documento será aberto pelo próprio navegador. Caso contrário, ele pedirá para fazer o download do PDF gerado.

Comentários:

Mostrando 1 - 10 de 57 comentários
Pessoal, estou com problemas para a quebra de página, alguém pode me ajudar ?? coloquei o cabeçalho, o corpo da tabela (por Mysql) e o rodapé, porém, as páginas além da 1, não sai o cabeçalho e nem o rodapé, o cabeçalho fica só na primeira página e o rodapé na última, alguém pode me ajudar, segue o código:

rel_cad_teste.php

<?php

include 'fpdf/fpdf.php';
include_once("conexao.php");
include 'cad_pdf_cabecalho.php';

$medicamentos = mysql_query("SELECT * FROM saude.medicamento ORDER BY med_descricao");

$pdf = new FPDF('L');
$pdf->AddPage();
$pdf->AliasNbPages();
$pdf->SetFont('Arial','',8);

Cabecalho();
//inserção do enunciado dos dados
Enunciado();
//foreach($linhas as $medicamento) {
while($medicamento = mysql_fetch_array($medicamentos)) {

$pdf->SetFont("Arial","",8);
$pdf->Cell(105,7,utf8_decode($medicamento['med_descricao']),1,0,"L");
$pdf->Cell(25,7,$medicamento['med_referencia'],1,0,"C");
$pdf->Cell(25,7,utf8_decode($medicamento['med_unidade']),1,0,"C");
$pdf->Cell(10,7,$medicamento['med_qtdetotal'],1,0,"C");
$pdf->Cell(80,7,utf8_decode($medicamento['med_observacao']),1,0,"L");
$pdf->Cell(30,7,date('d/m/Y - H:i:s',strtotime($medicamento['med_datacad'])),1,0,"C");
$pdf->Ln();
}
rodape();
$pdf->Output();

?>


cad_pdf_functions

<?php
//montagem do cabeçalho
function Cabecalho()
{
global $pdf;
$pdf -> SetY(0); // configuração da distância da parte superior da página
$pdf -> Image('cabecalho_antigo_oficial_paisagem.jpg', 40, 1); // importar a imagem do cabeçalho
$pdf -> SetXY(10, 45);
$pdf->SetAutoPageBreak(auto, 0);
$pdf->y0=$pdf->GetY();
}

function Enunciado()
{
global $pdf;
$pdf->SetFont('Arial','B',10); //tipo de fonte e tamanho da letra do enunciado
$pdf->Cell(280,5,utf8_decode('Relatório de Medicamentos - Ordem Alfabética'),0,0,"C"); //Título do Enunciado
$pdf->Ln(); // quebra de linha
$pdf->SetFont("Arial","B",8); //tipo de fonte e tamanho da letra
//títulos fixos do enunciado
$pdf->Cell(105,7,"Medicamento",1,0,"C");
$pdf->Cell(25,7,utf8_decode("Código SAM"),1,0,"C");
$pdf->Cell(25,7,"Unidade",1,0,"C");
$pdf->Cell(10,7,"Total",1,0,"C");
$pdf->Cell(80,7,utf8_decode("Observação"),1,0,"C");
$pdf->Cell(30,7,"Data de Cadastro",1,0,"C");
$pdf->Ln(); //quebra de linha
}
// montagem do rodapé
function Rodape()
{
global $pdf;
$pdf->SetY(-25); // configuração da distancia da parte inferior da página
$pdf->SetFont('Arial','',8); // tipo de tamanho da fonte
$pdf->Cell(0,4,utf8_decode("Rodovia Comandante João Ribeiro de Barros, Km 465, Marília/SP - CEP: 17.525.-320 - cx.p 105 - Fone/Fax: (14) 3425-2888 - E-mail: diretoriageral@pmarilia.sap.sp.gov.br"),0,0,'C'); //texto do rodapé
$pdf->ln(); //quebra de linha
$pdf->Cell(0,10,utf8_decode('Página ' .$pdf->PageNo().' de {nb}'),0,0,'C'); //Imprime o número da página
}

?>
27/09/2018 2:36pm (~6 anos atrás)

Prezados,

Boa tarde!

Estou começando a utilizar o FPDF e estou com uma grande dificuldade em fazer as alterações pra que ele aceite os acentos.

Podem me dar algumas dicas?!

No aguardo, desde já agradeço.
11/08/2016 12:12pm (~8 anos atrás)

Estou precisando gerar vários arquivos pdf de uma vez só. Gerar um único arquivo pdf já consegui, mas enviar mais de 1 arquivo de uma só vez e salvar em uma pasta não está dando certo... O programa só gera e salva o primeiro.
Alguém pode me ajudar?

Grata!

Basicamente estou testando assim:

$a=1;

while($a<10) {

$pdf = new PDF();
$pdf->Open();
$pdf->AddPage();

$pdf->SetXY(50, $pdf->GetY()+17);
$pdf->Cell(60, 20, "TESTE",0);

$pdf->SetXY(12, $pdf->GetY()+20);

$pdf->Cell(37, 10, "Teste: ",0,0,'R');
$pdf->Cell(85, 10, $a.'<br>',0,0,'L');

$pdf->Output($a.'_2014.pdf','F');
$a++;
}
13/10/2014 9:06am (~10 anos atrás)

unknow disse:
P.s: Solução encontrada e já implementada.

Segue para consulta:

http://www.fpdf.de/downloads/addons/57/

Grato pela atenção!
11/12/2010 9:50pm (~14 anos atrás)

unknow disse:
Oi boa noite precisava urgente saber em como reiniciar a numeração da pagina.

Ex.:
1/4
2/4
3/4
4/4
1/3
2/3
3/3

Tudo em um mesmo arquivo.

Eu consigo juntar com o buffer, mas não consigo reiniciar a numeração da pagina, ao juntar com o buffer de cada geração do pdf ele coloca o total das paginas.

AGRADECO MUITO A AJUDA!!!
FLW...
11/12/2010 8:10pm (~14 anos atrás)

Olá poderiam me ajudar ...

Estou desenvolvendo um aplicativo que quando clico no link php, deve gerar um relatório com os dados que encontram-se na página com esse link. Quando clico no link qual classe deve ser chamada para gerar o relatorio php?
04/11/2010 10:29am (~14 anos atrás)

Malcoln disse:
Consegui resolver. Vi um comentário na net dizendo que não poderia haver espaços em branco após a tag PHP. E o erro acusado era no arquivo de conexão. Após a tag PHP não havia nenhum código pois era o fim da programação. Mas havia espaços em branco invisíveis. Coloquei o cursor após a tag PHP e fiquei com o delete pressionado. Isso resolveu o problema.
28/10/2010 9:31am (~14 anos atrás)

Malcon, você deve estar dando alguma saida html.

retire todas as tags, todos os echos, prints e qq caractere que saia para o navegador.
24/09/2010 5:51pm (~14 anos atrás)

Malcoln disse:
Fiz como abaixo mas dá erro:

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

<?php
ob_start();
define('FPDF_FONTPATH', 'font/');
require('C:\xampp\htdocs\SCCAC2\fpdf16\fpdf.php');
include "valida_cookie.php";
include "conecta_mysql.inc";
// busca os dados no banco de dados
$busca = mysql_query("SELECT * FROM TBCIDADE");
$pdf = new FPDF();
$pdf->Open();
$pdf->AddPage();
$pdf->SetFont('Arial', 'B', 10);
$pdf->Cell(40, 5, 'Código da Cidade');
$pdf->SetX(35);
$pdf->Cell(60, 5, 'Cidade');

while ($resultado = mysql_fetch_array($busca))
{
$pdf->ln();
$pdf->Cell(40, 5, $resultado['cdcidade']);
$pdf->SetX(35);
$pdf->Cell(60, 5, $resultado['nmcidade']);
$pdf->SetX(50);
}
$pdf->Output();
?>
24/09/2010 3:54pm (~14 anos atrás)

Muito bom mesmo. Há tempos que procurava algo que explicasse de forma clara e objetiva a geração de PDF's utilizando a linguagem de programação PHP.

Parabéns mesmo.
14/07/2009 10:06pm (~15 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)