+3

Gerando documentos PDF com a classe FPDF

criado por Nivaldo Pereira de Arruda Neto em 10/08/2006 7:16pm
Criando algo realmente útil

Até agora não foi mostrado nem um pouco do poder do PHP para criar relatórios dinâmicos. A brincadeira começa a ficar interessante quando adicionamos funções relacionadas a banco de dados, e é exatamente isso que vamos fazer agora.

Vou mostrar como criar um pdf com dados vindos de uma tabela MySQL. Antes de continuar, crie no MySQL uma tabela chamada vendas com os campos codvendas, produto, quantidade e valorunit. Não esqueça de inserir alguns registros na tabela antes de continuar.

Crie o arquivo modelo2.php com as linhas:

<?php
define('FPDF_FONTPATH', 'font/');
require('sub_diretorio/fpdf.php');

// bd.php deve conter as funções para se conectar no banco de dados
include("bd.php");
// busca os dados no banco de dados
$busca = mysql_query("SELECT * FROM vendas WHERE Vendedor = 'Leandro'");
$pdf = new FPDF();
$pdf->Open();
$pdf->AddPage();
$pdf->SetFont('Arial', 'B', 10);
$pdf->Cell(40, 5, 'Código da Venda');
$pdf->SetX(35);
$pdf->Cell(60, 5, 'Produto');
$pdf->SetX(50);
$pdf->Cell(40, 5, 'Quantidade');
$pdf->SetX(77);
$pdf->Cell(40, 5, 'Valor Unitário');
while ($resultado = mysql_fetch_array($busca)) {
    $pdf->ln();
    $pdf->Cell(40, 5, $resultado['codvenda']);
    $pdf->SetX(35);
    $pdf->Cell(60, 5, $resultado['produto']);
    $pdf->SetX(50);
    $pdf->Cell(40, 5, $resultado['quantidade']);
    $pdf->SetX(77);
    $pdf->Cell(40, 5, $resultado['valorunit']);
}
$pdf->Output();
?>

Neste exemplo vamos ter como resultado uma tabela sem bordas e com quatro campos: Código da Venda, Produto, Quantidade e Valor Unitário, com todas as vendas realizadas pelo vendedor Leandro. Analisando o código, podemos notar que foram usadas três novas funções.

São elas:

ln()
Quebra a linha. Sua sintaxe é: ln(float valor);

Onde o "valor", em milímetros, é o tamanho do espaçamento entre as linhas do texto. Se não for especificado um valor, ele pegará o mesmo da última célula impressa.

SetX()
Muda o cursor para a coordenada em x desejada. SetX(float coordenada);

Cell()
Cria uma célula de tamanho, texto, borda e alinhamento configurados pelo programador. Sintaxe:
Cell(float width [, float height [, string texto [, mixed borda [, int ln [, string alinhamento [, int fill [, mixed link]]]]]]])

Onde width é a largura e height, a altura da célula. Além destes parâmetros, em texto informa-se o conteúdo da célula. A opção borda deve ser preenchida com 0, para retirá-la, ou 1 para colocar a borda. ln indica para onde vai o cursor após a chamada da função Cell(), e seus valores podem ser 0 para a direita, 1 para o começo da próxima linha e 2 para baixo.

Alinhamento pode ser preenchido com L para a esquerda (default), C para centralizado e R para a direita. Em fill, devem-se informar os valores 0 para transparente (default) e 1 para preenchimento de fundo da célula. Em link, novamente poderia se utilizar a URL ou identificador retornado pela função AddLink().


Inserindo imagens no documento:

Para inserir imagens no relatório, devemos utilizar a função Image(), explicada a seguir, em conjunto com as demais funções já mostradas.

Image(string arquivo, float x, float y, float w [, float h [, string Tipo [, mixed link]]]) 

Onde arquivo é o nome do arquivo de imagem, x e y são as coordenadas da imagem no documento, w e h representam o tamanho da imagem em milímetros (se omitido é utilizado o tamanho original da imagem).

Tipo informa o formato da imagem (os seguintes formatos são válidos: jpg, jpeg, png). Se não especificado, esse valor será determinado a partir da extensão do arquivo. Exemplo:

$pdf->Image('logo.jpg',4,5,150,70,jpg);

Adicione essa linha dentro do código que gera o pdf, e ele inserirá a imagem logo.jpg nas coordenadas 4 em x e 5 em y, com o tamanho de 150x70mm no documento.

Definindo o Autor, Criador e o Titulo do Relatório

Para definir o autor do documento, utiliza-se a função SetAuthor(), e sua sintaxe é: SetAuthor(string autor); onde autor é o nome do autor do documento.

A função SetCreator() define o criador do documento, com a sintaxe: SetCreator(string valor); onde valor é o nome do criador do documento. Normalmente utiliza-se o nome da ferramenta que o gerou.

Para definir o título do documento criado, deve-se usar a função SetTitle(), com a sintaxe: SetTitle(string nome_t). Onde nome_t é o título do documento.

Com estas informações, já é possível criar um relatório com o texto formatado e dados fornecidos por tabelas de algum banco de dados, com o MySQL, o que torna muito mais prática a criação do relatório, principalmente se ele utilizar uma grande quantidade de dados. Com a inserção de imagens, também é possível criar relatórios personalizados utilizando a logo da empresa ou algum tipo de gráfico, por exemplo.

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 (~5 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 (~7 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 (~9 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 (~13 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 (~13 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 (~13 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 (~13 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 (~13 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 (~13 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.)