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 ( |
"Populando" a tabela
Agora, inserimos o nome dos colunistas do iMasters.
INSERT INTO colunistas VALUES("1",
"Júlio César Martini", "PHP"); |
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
<? /************** NÃO MEXER DAQUI PRA BAIXO ***************/ //CONECTA
COM O MYSQL //VERIFICA
SE RETORNOU ALGUMA LINHA //CALCULA
QUANTAS PÁGINAS VÃO SER NECESSÁRIAS //PREPARA
PARA GERAR O PDF //INICIALIZA
AS VARIÁVEIS //PÁGINAS //VERIFICA //QUEBRA
DE LINHA //MONTA O
CABEÇALHO //EXIBE
OS REGISTROS //SAIDA DO
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!
Fabrício Olmo Aride
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
É 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
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
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->Execute($sql);
if (!$rs_andamento) {
error_exit($db->ErrorMsg(), $tpl, $sql);
} else {
if($rs_andamento->RecordCount() > 0) {
$pdf->Ln(4);
$pdf->Cell(20);
$pdf->SetFont('Arial', 'I', 10);
$pdf->Cell(15, 5, 'ACOMPANHAMENTO', 0, 1, 'L');
$pdf->SetFont('Arial', '', 10);
$pdf->Cell(20);
$pdf->Cell(35, 5, 'Data', 0, 0, 'L');
$pdf->MultiCell(0, 5, 'Descrição', 0, 1);
$pdf->SetFont('Arial', 'B', 10);
while (!$rs_andamento->EOF) {
$Dh_Andamento =
converte_data($rs_andamento->fields["dh_andamento"]);
$pdf->Cell(20);
$pdf->Cell(35, 5, $Dh_Andamento, 0, 0, 'L');
$pdf->MultiCell(0, 5, $rs_andamento->fields["descricao"],
0, 1);
$rs_andamento->MoveNext();
}
}
$rs_andamento->Close();
}
Só que ele não imprime justificado mas de jeito nenhum. Estou fazendo
algo errado ?
Rafael
Julio, nao estou conseguindo fazer o relatorio em PDF com o Oracle.... algumadica..
Obrigado
Rodrigo
Benito Graciano
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
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
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
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
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
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
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
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
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
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
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
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
Acabei conceguindo acertar o script...
Muito Obrigado a todos...
Patrício João dos Santos
como imprimir com num tamanho personalizado?
ou seja, como posso utilizar este script para imprimir cartões???
grato pela atenção
2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.