+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 48 comentários
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 (~1 ano atrás)

Paulo Vitor disse:
muito bom .... fiquei muito tempo procurando algo assim...
ajudou muito..

=)
25/10/2008 2:12pm (~1 ano atrás)

Ja conseguiu isso que vc precisa? qq coisa me da um toke!
24/05/2007 11:54am (~3 anos atrás)

Obrigado =)

fico feliz que tenha conseguido =)
24/05/2007 11:51am (~3 anos atrás)

Olá!!!Depois de muito tempo finalmente consegui gerar o pdf completo com textos, imagens e com os dados do bd.

Muito bom...Agora, que estou entendendo um pouco melhor, estou adorando.

Parabéns para você e para mim também(rsrsrs).
23/05/2007 5:08am (~3 anos atrás)

Parabéns pelo artigo! Está claro e objetivo!

Preciso adaptar este script a minha necessidade que é colocar cabeçalho, rodapé e nr em todas as páginas, além de que as linhas devem ser alternadas com a cor branca e cinza, por exemplo.
Ufa!...
Podem me dar mais alguma orientação.
Obrigado.
10/05/2007 10:46am (~3 anos atrás)

ola carol, me desculpe a demora para responder.

Seguinte, acredito qeu esse seu problema esteja na sua busca SQl, pois o PDF em si nao interfere em nada das variaveis vindas do banco, tenta colocar sua busca em algum programa que execute querys (phpmyadmin, sqlyog por exemplo) e veja se retorna alguma coisa.

qq coisa estou por aqui. Abraços
09/05/2007 6:09am (~3 anos atrás)

Olá!!!

Estou com problemas.

Criei o banco de dados, inseri alguns registros e segui o exemplo que você deu.

Bem, gera o pdf somente com os títulos e não está aparecendo as informações do banco de dados, não ocorre nenhuma mensagem com erro, o que pode ser?

Agradeço sua atenção!!!
07/05/2007 10:50am (~3 anos atrás)

Olá JN,

Acredito que isso tenha mais ah ver com o seu SQL ou com lógica de progamação em si do que com o PDF. Porque o PDF você só vai moldar as páginas, mas os dados você tem que pegar do banco de acordo com suas buscas/condições.
01/02/2007 5:42am (~3 anos atrás)

Muito bom seu exemplo. Mas como fazer com quebras? Por ex: Em uma rêde de lojas, com dezenas de vendedores, pegar loja 01 e primeiro vendedor e imprimir as vendas deste do mes de janeiro e totalizar, em seguida fevereiro e totalizar ... assim até dezembro ... depois partir para o segundo vendedor e até o ultimo desta loja. Após listar de todos da loja 01, partir para loja 02 e sim por diante.
Agradeceria muitissimo se desse um exemplo, pois estou migrando de outra linguagem onde desenvolvo relatorios com qualquer nivel de complexidade e em PHP só tenho encontrado exemplos simples.
Agradeço pela ajuda.
01/02/2007 5:08am (~3 anos atrás)

Novo Comentário:

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