Treinamento Online
Terça-feira, 11 de janeiro de 2005 às 12h19

Gerando um PDF através de uma consulta ao MySQL

Fala pessoal! Esse é o primeiro artigo de 2005. Queria, antes de tudo, desejar a todos vocês um Feliz 2005 e que todos os seus desejos possam se realizar. Essa semana aprenderemos a gerar um arquivo PDF a partir de uma consulta feita ao banco de dados MySQL. Ao final você poderá baixar o script completo contendo o script e o arquivo gerado. Para esse artigo estarei utilizando a biblioteca FPDF que pode ser baixada em www.fpdf.org.

Só mais um detalhes, antes de iniciarmos. Uma empresa parceira do iMasters, a HostMídia, abriu vagas para programadores PHP em São Paulo. É necessário que o programador tenha experiência com PHP/MySQL e resida em São Paulo. O salário é de R$750,00 + VT + Refeição. Os interessados devem enviar currículo para faleconosco@imasters.com.br para encaminharmos aos responsáveis pela HostMídia.

Vamos lá:

Criando a tabela no MySQL

Criaremos uma tabela chamada COLUNISTAS que conterá os seguintes campos: ID, NOME e ASSUNTO.

CREATE TABLE colunistas (
  ID int(3) NOT NULL auto_increment,
  NOME varchar(60) NOT NULL default '',
  ASSUNTO varchar(60) NOT NULL default '',
  PRIMARY KEY (ID)
) TYPE=MyISAM;

"Populando" a tabela

Agora, inserimos o nome dos colunistas do iMasters.

INSERT INTO colunistas VALUES("1", "Júlio César Martini", "PHP");
INSERT INTO colunistas VALUES("2", "Flash", "Maxwell Dayvson");
INSERT INTO colunistas VALUES("3", "Sql Server", "Mauro Pichiliani");
INSERT INTO colunistas VALUES("4", "Photoshop", "Fábio Lody");
INSERT INTO colunistas VALUES("5", "Mobile", "Cristiano Trindade");
INSERT INTO colunistas VALUES("6", "Corel", "Alex Falcão");
INSERT INTO colunistas VALUES("7", "3ds Max", "Guilherme Pinheiro");
INSERT INTO colunistas VALUES("8", "B. Intelligence", "Michel Souza");
INSERT INTO colunistas VALUES("9", "JavaScript", "Thiago Prado");
INSERT INTO colunistas VALUES("10", "JDeveloper", "Eduardo Santana");
INSERT INTO colunistas VALUES("11", "Desenho Vetorial", "Erika Pessanha");
INSERT INTO colunistas VALUES("12", "Dreamweaver", "Marcelo Oliveira");
INSERT INTO colunistas VALUES("13", "Segurança", "Alexandre Freire");
INSERT INTO colunistas VALUES("14", "Fireworks", "Leonardo César");
INSERT INTO colunistas VALUES("15", "Cisco Systems", "Thiago Dias");
INSERT INTO colunistas VALUES("16", "Certificações", "Paulo R. Cardoso");
INSERT INTO colunistas VALUES("17", "Oracle", "Rodrigo Almeida");
INSERT INTO colunistas VALUES("18", "CSS", "Mauricio Samy");
INSERT INTO colunistas VALUES("19", "Visual FoxPro", "Nilton Paulino");
INSERT INTO colunistas VALUES("20", "Delphi", "Daniel Nascimento");
INSERT INTO colunistas VALUES("21", "Java", "Almedson Ferreira");
INSERT INTO colunistas VALUES("22", "Redes", "Renato Amadeu");
INSERT INTO colunistas VALUES("23", "Zope", "Daniel Schmitz");
INSERT INTO colunistas VALUES("24", "ColdFusion", "Wender Lima");
INSERT INTO colunistas VALUES("25", "C#", "Caio Azevedo");

Resultado:

Para conferir se tudo está andando conforme o combinado, execute a seguinte query:

SELECT * FROM colunistas;

Abaixo, você tem uma pequena amostra do que foi retornado.

Script PHP

<?
//CONFIGURAÇÕES DO BD MYSQL
$servidor = "localhost";
$usuario = "root";
$senha = "";
$bd = "imasters";
//TÍTULO DO RELATÓRIO
$titulo = "Colunistas do iMasters";
//LOGO QUE SERÁ COLOCADO NO RELATÓRIO
$imagem = "logo_imasters.png";
//ENDEREÇO DA BIBLIOTECA FPDF
$end_fpdf = "c:/pagina/biblioteca/fpdf";
//NUMERO DE RESULTADOS POR PÁGINA
$por_pagina = 13;
//ENDEREÇO ONDE SERÁ GERADO O PDF
$end_final = "c:/pagina/imasters/110/artigo_php.pdf";
//TIPO DO PDF GERADO
//F-> SALVA NO ENDEREÇO ESPECIFICADO NA VAR END_FINAL
$tipo_pdf = "F";

/************** NÃO MEXER DAQUI PRA BAIXO ***************/

//CONECTA COM O MYSQL
$conn = mysql_connect($servidor, $usuario, $senha);
$db = mysql_select_db($bd, $conn);
$sql = mysql_query("SELECT A.ID, A.NOME, A.ASSUNTO FROM colunistas A", $conn);
$row = mysql_num_rows($sql);

//VERIFICA SE RETORNOU ALGUMA LINHA
if(!$row) { echo "Não retornou nenhum registro"; die; }

//CALCULA QUANTAS PÁGINAS VÃO SER NECESSÁRIAS
$paginas = ceil($row/$por_pagina);

//PREPARA PARA GERAR O PDF
define("FPDF_FONTPATH", "$end_fpdf/font/");
require_once("$end_fpdf/fpdf.php");
$pdf = new FPDF();

//INICIALIZA AS VARIÁVEIS
$linha_atual = 0;
$inicio = 0;

//PÁGINAS
for($x=1; $x<=$paginas; $x++) {

//VERIFICA
$inicio = $linha_atual;
$fim = $linha_atual + $por_pagina;
if($fim > $row) $fim = $row;

$pdf->Open();
$pdf->AddPage();
$pdf->SetFont("Arial", "B", 10);
$pdf->Image($imagem, 0, 8);
$pdf->Ln(2);
$pdf->Cell(185, 8, "Página $x de $paginas", 0, 0, 'R');

//QUEBRA DE LINHA
$pdf->Ln(20);

//MONTA O CABEÇALHO
$pdf->Cell(15, 8, "", 1, 0, 'C');
$pdf->Cell(85, 8, "COLUNISTA", 1, 0, 'L');
$pdf->Cell(85, 8, "ASSUNTO", 1, 1, 'L');

//EXIBE OS REGISTROS
for($i=$inicio; $i<$fim; $i++) {
$pdf->Cell(15, 8, mysql_result($sql, $i, "ID"), 1, 0, 'C');
$pdf->Cell(85, 8, mysql_result($sql, $i, "NOME"), 1, 0, 'L');
$pdf->Cell(85, 8, mysql_result($sql, $i, "ASSUNTO"), 1, 1, 'L');
$linha_atual++;
}//FECHA FOR(REGISTROS - i)
}//FECHA FOR(PAGINAS - x)

//SAIDA DO PDF
$pdf->Output("$end_final", "$tipo_pdf");

?>

Depurando o código:

Linha 13: Parâmetros para conexão com o banco de dados MySQL.

Linha 15: Título do Relatório.

Linha 17: Imagem a ser colocada no topo de cada página do arquivo PDF.

Linha 19: Endereço onde está instalada a biblioteca FPDF.

Linha 21: Quantos resultados serão exibidos por página.

Linha 23: Endereço onde será gravado o arquivo PDF gerado.

Linha 15: Imprime uma célula.

Linha 26: Tipo do PDF a ser gerado, F - salva o arquivo na máquina, para outras opções consulte o manual do FPDF.

Linha 32: Conecta ao MySQL.

Linha 33: Seleciona o Database a ser utilizado.

Linha 34: Executa a query (consulta) ao MySQL.

Linha 35: Total de linhas retornadas pela consulta acima.

Linha 38: Verifica se retornou alguma linha.

Linha 41: Calcula quantas páginas serão necessárias através da função ceil() que arrendonda o valor pra cima.

Linha 46: Instancia a classe.

Linha 53: Começa a montar as páginas.

Linha 59 a 73: Preparo o cabeçalho do arquivo colocando a imagem e campos do relatório.

Linha 46 a 82: Exibe os registros, veja que na função Cell() no penúltimo e último parâmetro temos respectivamente se será pulada uma linha(1) e o tipo de alinhamento (Center, Left, Right).

Executando o script:

Quando o script for executado será gerado um arquivo pdf no endereço especificado na variável $end_final.

Abrindo o arquivo:

É aberto um arquivo PDF com 02 páginas já que especificamos que teríamos 13 registros por página e na nossa consulta foram retornados 25 registros.

Dica: Para facilitar, baixe a documentação em Português da classe FPDF, clicando AQUI.

Links relacionados:

>> http://www.imasters.com.br/artigo.php?cn=2760&cc=44
>> http://www.imasters.com.br/artigo.php?cn=2798&cc=44
>> http://www.fpdf.org

Para baixar o script, clique no link abaixo.

DOWNLOAD

Clique AQUI e faça o download do script.

Semana que vem tem mais. Espero que vocês tenham gostado :-)

Não deixe de nos enviar críticas ou sugestões para o próximo assunto, afinal a coluna é de vocês. Boa semana a todos!

19 comentários

 Fabrício Olmo Aride
12/01/2005 09h04

Erro

Caro Júlio otimo , solução para o msm , mas ocorre alguns erros, não a quebra de linha nas celulas , tentei adaptar, pra uso em meu sistema , ele encontrou esses erros , outros erros , o texto fica fora da celula , sem quebra de linha , gostaria de uma ajudinha , por favor . Obrigado

 Israel Filho
25/01/2005 10h43

Parabéns, muito bom.

É um excelente artigo. Porém, gostaria de chamar a atenção para o fato de que os INSERTs estão com a ordem dos campos trocada a partir do segundo comando. De resto, parabéns.

 Maicon Santos
23/03/2005 10h36

Dúvida

Amigo parabéns pelo artigo, muito util mesmo...
Porém estou com um problema no tamanho da celula !
Quando o valor "estoura" da celula ele coloca na frente em vez de aumentar a largura da celula, como é comum no html/table. Se alguem souber a solução na dá um toque...
smite@bol.com.br

 Cesar Fernando Sturion
08/04/2005 09h16

Imprimir justificado com fpdf

Ola pessoal,

Estou criando um relatório onde tenho um campo de andamento de tarefa
que deve ser visualizado justificado.

Estou fazendo da seguinte maneira:

$sql = " SELECT * ";
$sql .= " FROM andamento";
$sql .= " WHERE id_processo = ".$Id_Processo;
$sql .= " ORDER BY dh_andamento DESC";

$rs_andamento = $db-&gt;Execute($sql);

if (!$rs_andamento) {
error_exit($db-&gt;ErrorMsg(), $tpl, $sql);
} else {
if($rs_andamento-&gt;RecordCount() &gt; 0) {
$pdf-&gt;Ln(4);
$pdf-&gt;Cell(20);
$pdf-&gt;SetFont('Arial', 'I', 10);
$pdf-&gt;Cell(15, 5, 'ACOMPANHAMENTO', 0, 1, 'L');
$pdf-&gt;SetFont('Arial', '', 10);
$pdf-&gt;Cell(20);
$pdf-&gt;Cell(35, 5, 'Data', 0, 0, 'L');
$pdf-&gt;MultiCell(0, 5, 'Descrição', 0, 1);
$pdf-&gt;SetFont('Arial', 'B', 10);

while (!$rs_andamento-&gt;EOF) {
$Dh_Andamento =
converte_data($rs_andamento-&gt;fields["dh_andamento"]);
$pdf-&gt;Cell(20);
$pdf-&gt;Cell(35, 5, $Dh_Andamento, 0, 0, 'L');
$pdf-&gt;MultiCell(0, 5, $rs_andamento-&gt;fields["descricao"],
0, 1);
$rs_andamento-&gt;MoveNext();
}
}
$rs_andamento-&gt;Close();
}

Só que ele não imprime justificado mas de jeito nenhum. Estou fazendo
algo errado ?

 Rafael
19/04/2005 16h14

COMO FAÇO NO ORACLE ???

Julio, nao estou conseguindo fazer o relatorio em PDF com o Oracle.... algumadica..

Obrigado

Rodrigo

 Benito Graciano
10/06/2005 15h15

PDFlib,

Poderia usar no caso a PDFlib, para ter o mesmo resultado ?
Poderia me monstrar um exemplo com essa biblioteca ?

Abraços

 José Oliveira Joaquim Júnior
25/06/2005 12h02

Biblioteca FPDF

Júlio,
Parabéns pela matéria. Mas eu não estou conseguindo fazer esse exemplo pq naum possuo a biblioteca FPDF e o site onde poderíamos pegar não está funcionando. Se vc tiver ela poderia mandar para o meu email?
jojjunior@hotmail.com

 Vanessa Mendes Yamada
14/10/2005 18h33

biblioteca fpdf.php

Muito bom o artigo!
Também tentei testar mas não tenho a bibiloteca fpdf.php poderia me encaminhar por e-mail? vanessamy@pop.com.br
Atenciosamente,
Vane

 Gilberto Campos Ferraz
05/11/2005 19h56

Link Quebrado

Gostei do artigo, mas o link www.fpdf.org está inativo,
envie-me por email a biblioteca
fpdf p/ gferrazdf@yahoo.com.br

 Héliton Amir
16/11/2005 14h12

VB6

Boa tarde Júlio. No momento ainda não estou nas webs da vida. Gostaria de saber se já viu alguma coisa desse tipo aí (pdf) para VB6, sem ser com Crystal? Obrigado, Rogério.

 Rafael Ogeda
21/08/2006 17h44

Num Funfo!?

OI td bem eu baixei os arquivos porem na hras q eu alterei td e executei ocorreu este problema :
Warning: Missing argument 4 for image() in C:\apache\htdocs\pdf\fpdf.php on line 902

Warning: Cannot add header information - headers already sent by (output started at C:\apache\htdocs\pdf\fpdf.php:902) in C:\apache\htdocs\pdf\fpdf.php on line 1013
FPDF error: Some data has already been output to browser, can't send PDF file
vc poderia me ajudar?
sou iniciante eestou precisando desta função.
mt obrigado!

 Rafael Ogeda
21/08/2006 17h47

Problema com a biblioteca

quando baixei a biblioteca do link especificado ela estava incompleta porem arranjei de um amigo mais continua dando erro vc poderia passa ela pra mim e me responder a duvida acima?
ogedaprogramer@gmail.com

 Marcos Soares
14/09/2006 16h05

Dúvida

Amigo excelente artigo!!..porem tenho uma dúvida. No caso do artigo você montou uma consulta e trouxe os dados do banco para serem exibidos no seu documento pdf, e esse dados foram disponibilizados linha por linha, com a utilização do for para o imcremento das linhas. eu precisava montar o resultado da pesquisa no posição vertical no meu relatório. ele chega a uma parte do documento e pula para outra página, alem de a partir dai começar a bagunçar todos os dados da consulta. você poderia me ajudar com esse problema?..grato pela atenção.

 Elias Frederique de Melo Fernandes
17/10/2007 14h26

Muito bom esse Post me ajudou muito!!! mas surgiu um erro

Olá Júlio...tudo bem?
Amigo to tendo um probleminha.....gostaria de entender...
quando converto o arquivo com dados do banco os registros com acentos vem com caracter estranhos.....
vc poderia me ajudar por favor nisso??

antes de converter ele apresenta os dados numa tela e aparecem certinho com acentos aí quando eu clico em converter pra PDF ele converte só q as palavras com acentos mudam....ficam com caracter estranho

Por favor me ajude...

E quero agradecer tb pois me ajudou e ta ajudando muito esse artigo....fenomenal....mesmo eu tendo esse problema q não consigo resolver....agradeço muito e parabenizo pela dedicação
abraço....

 Will Robson Sampaio
12/04/2008 11h04

Erro no fpdflib

Olá sou novo pro aqui, estou tentanto rodar esse script mas está dando o seguinte erro! alguém aí poderia me ajudar??
Obrigado

Warning: FPDF::include() [function.include]: Failed opening 'c:/pagina/biblioteca/fpdf/font/helveticab.php' for inclusion (include_path='.;C:\ARQUIV~1\EASYPH~1.0B1\\php5\pear\') in C:\Arquivos de programas\EasyPHP 2.0b1\www\htdocs_SAMPAIO\fpdf\fpdf.php on line 550
FPDF error: Could not include font metric file

 José Benilton
01/03/2009 19h49

Meu script não permite impressão...

Pessoal Boa Noite! Estou com um problema em meu script de PHP para impressão!
Faço o Download Abro-o. MAs na hora de imprimir só visualizo a última folha...
Já bati cabeça... Não sei mais o que fazer.
Por favor alguém poderia me auxiliar?
Desde já agradeço:
José Benilton!

 José Benilton
01/03/2009 19h52

.Meu script não permite impressão...II

Pessoal, segue o script...

<?

ob_start();


$type = $_POST[group1];


require('fpdf/fpdf.php');

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



include('../default/a2conectar.php');



if($type == 0)

{

$pdf = new FPDF('P','cm','A4');

$pdf -> AddPage(0);
$pdf -> SetMargins(1,1,1,1,1);

$lin = 1;
$col = 1;

$status = -2;
$cont = 1;

$inicio = $_POST[inicio];

$folhas = $_POST[folhas];


$folhas = $folhas * 10;

$folhas = (($inicio + $folhas) - 1);



$qry= "SELECT vox_espelho,username FROM cc_card WHERE vox_espelho >= $inicio AND vox_espelho <= $folhas AND nbused = 0 GROUP BY vox_espelho ORDER BY vox_espelho";

$buscar = mysql_query($qry);

while($linha = mysql_fetch_array($buscar))

{

switch($lin)

{

case 1:

if(($lin == 1) and ($col == 1)){$a=3.7; $b=2.2; $c=8.5; $d=5; $col++;} else {

if(($lin == 1) and ($col == 2)){$a=13.3; $b=2.2; $c=17.8; $d=5; $col = 1; $lin++;}}

break;



case 2:

if(($lin == 2) and ($col == 1)){$a=3.7; $b=7.8; $c=8.5; $d=10.5; $col++;} else {

if(($lin == 2) and ($col == 2)){$a=13.3; $b=7.8; $c=17.8; $d=10.5; $col = 1; $lin++;}}

break;



case 3:

if(($lin == 3) and ($col == 1)){$a=3.7; $b=13.2; $c=8.5; $d=16; $col++;} else {

if(($lin == 3) and ($col == 2)){$a=13.3; $b=13.2; $c=17.8; $d=16; $col = 1; $lin++;}}

break;



case 4:

if(($lin == 4) and ($col == 1)){$a=3.7; $b=18.7; $c=8.5; $d=21.5; $col++;} else {

if(($lin == 4) and ($col == 2)){$a=13.3; $b=18.7; $c=17.8; $d=21.5; $col = 1; $lin++;}}

break;

case 5:

if(($lin == 5) and ($col == 1)){$a=3.7; $b=24.2; $c=8.5; $d=27; $col++;} else {

if(($lin == 5) and ($col == 2)){$a=13.3; $b=24.2; $c=17.8; $d=27; $col = 1; $lin=1;} {

#if(($lin == 0) and ($col == 0)){$a=0; $b=0; $c=0; $d=0; $lin= -0; $col= -0;



$status=1;}}

break;

}



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

$pdf -> SetXY($e,$f);


22',0,0,'L');



//Codigo PIN

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

$pdf -> SetXY($a,$b);

$pdf -> Cell(1,0.05,$linha[1],0,0,'L');



//Numero de serie e codigo de barras

$pdf -> SetFont('Arial','',10);

$pdf -> SetXY($c,$d);

$pdf -> Cell(1,0.05,$linha[0],0,0,'L');



if(($status == 1) and ($_POST[folhas] != $cont)){$pdf -> AddPage(); $status = 0; $cont++;}

}

}



$pdf -> Output('arquivo','I');

include('../default/a2desconectar.php');

?>

 José Benilton
01/03/2009 20h25

Aí pessoal Muito Obrigado!

Acabei conceguindo acertar o script...
Muito Obrigado a todos...

 Patrício João dos Santos
07/08/2009 09h12

tamanho personalido

como imprimir com num tamanho personalizado?

ou seja, como posso utilizar este script para imprimir cartões???

grato pela atenção

Cancelar resposta

Qual a sua opinião?

Faça login abaixo ou cadastre-se rapidamente.


Sobre o Autor
Júlio César Martini atualmente presta serviços de WebMaster/Programador para o UOL (http://www.uol.com.br), Graduado em Tecnólogo em Informática pela UNIFIAN - Faculdades Anhanguera e Pós-Graduado em Desenvolvimento de Software para Web pela UFSCAR. Foi o primeiro profissional a chegar à marca de 100 artigos publicados no iMasters e trabalha com PHP desde 2000. Site: http://www.juliocesarmartini.com

2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.