Bom dia! :graduated:

Tem muita gente perguntando como gerar relatórios PHP e exportar para PDF... Não é um caminho muito árduo, porém requer um pouco de atenção, neste artigo eu irei utilizar o DOMpdf.


Primeiro de tudo temos que baixar o DOMpdf, segue o link para download:


:seta: http://code.google.com/p/dompdf/downloads/detail?name=dompdf-0.5.2.zip


Após baixar a aplicação, extraia os arquivos, deixando todos dentro de uma pasta, pode ser "dompdf" mesmo, não tem problema.

Vamos criar um simples banco de dados contendo algumas informações para nosso relatório.

-- -- Estrutura da tabela `clientes` -- CREATE TABLE IF NOT EXISTS `clientes` ( `cli_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, `cli_datacad` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `cli_empresa` varchar(60) NOT NULL, `cli_tipo` enum('f','j') NOT NULL DEFAULT 'j', `cli_cnpj` char(18) NOT NULL, `cli_tel` char(14) DEFAULT NULL, `cli_ie` varchar(30) NOT NULL, `cli_endereco` varchar(50) NOT NULL, `cli_cidade` varchar(30) NOT NULL, `cli_uf` char(2) NOT NULL, `cli_cep` char(9) DEFAULT NULL, `cli_responsavel` varchar(30) NOT NULL, `cli_tel_resp` char(14) DEFAULT NULL, `cli_cel` char(14) DEFAULT NULL, `cli_dtnascimento` date DEFAULT NULL, `cli_email` varchar(50) DEFAULT NULL, `cli_situacao` set('Ativo','Inativo','Postergado') NOT NULL DEFAULT 'Ativo', PRIMARY KEY (`cli_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5;
Feito isso, vamos agora inserir os dados em nossa tabela para podermos gerar nosso relatório.

INSERT INTO `clientes` (`cli_id`, `cli_datacad`, `cli_empresa`, `cli_tipo`, `cli_cnpj`, `cli_tel`, `cli_ie`, `cli_endereco`, `cli_cidade`, `cli_uf`, `cli_cep`, `cli_responsavel`, `cli_tel_resp`, `cli_cel`, `cli_dtnascimento`, `cli_email`, `cli_situacao`) VALUES (1, '2012-11-04 14:28:14', 'Alaerte Gabriel', 'j', '33.333.333/3333-33', '(33) 3333-3333', '1', '333333333333', '3333333333', 'AC', '33333-333', '3333', '(33) 3333-3333', '', '1111-12-12', 'gtg@ww.com', 'Ativo'), (2, '2012-11-04 14:28:38', 'fff', 'j', '33.333.333/3333-33', '(33) 3333-3333', '1', '333333333333', '3333333333', 'AC', '33333-333', '3333', '(33) 3333-3333', '', '1111-12-12', 'gtg@ww.com', 'Ativo'), (3, '2012-11-04 14:35:49', 'fff', 'j', '11.111.111/1111-11', '(11) 1111-1111', '1', '1111111111', '111111111', 'AC', '11111-111', '1111', '', '(11) 1111-1111', '1111-11-11', 'gtg@ww.com', 'Ativo'), (4, '2012-12-10 21:05:58', 'fff', 'j', '11.111.111/1111-11', '(11) 1111-1111', '1', '1111111111', '111111111', 'AC', '11111-111', '1111', '(11) 1111-1111', '', '1111-11-11', '', 'Ativo');
Agora que temos nossa tabela e nossos dados inseridos, vamos criar uma simples página para listagem desses dados, lembrando que é uma listagem simples, pois meu objetivo é mostrar a prática da exportação desses dados para PDF, a seguir, irei explicar várias coisas e é preciso muita atenção.

Clientes.php <?php //Definindo os dados para conexão e seleção da base de dados define('DB','BANCO_DA_DADOS'); define('USER','root'); define('SENHA',''); define('HOST','localhost'); //Conexão com o banco de dados com base nos dados fornecidos anteriormente. $conexao = mysql_connect(HOST,USER,SENHA)or die('Erro na conexão - '.mysql_error()); ($conexao) ? mysql_select_db(DB, $conexao) : die(mysql_error()); //Query simples para busca dos dados $busca = mysql_query("SELECT * FROM clientes ORDER BY cli_id DESC")or die(mysql_error()); //Verificação das linhas encontradas. if(mysql_num_rows($busca) > 0) { ?> <table width="873" border="1" cellpadding="0" cellspacing="0" id="listacliente"> <tr> <td height="44" colspan="6"> <table width="865" border="0" cellpadding="8" cellspacing="1"> <tr align="center" valign="middle"> <td width="195">Empresa</td> <td width="195">Cadastrada em</td> <td width="155">CNPJ/CPF</td> <td width="111">Email</td> <td width="51">Status</td> <td width="55">Inf.</td> </tr> </table> </td> </tr> <?php //Loop para mostrar os dados, eu costumo utilizar o "do" while do { ?> <tr align="center" valign="middle" onMouseOver="style.backgroundColor='#FF6'" onMouseOut="style.backgroundColor='#FFF'"> <td width="212"><?php echo $ver['cli_empresa']; ?></td> <td width="212"><?php echo $ver['cli_datacad']; ?></td> <td width="173"><?php echo $ver['cli_cnpj']; ?></td> <td width="127"><?php echo $ver['cli_email']; ?></td> <td width="69"><?php $ver['cli_situacao']=='Ativo' ? print '<strong><span style="color:#093">L</span></strong>' : print '<strong><span style="color:red">B</span></strong>'; ?> </td> <td width="80"> <a href="relatorio.php?rel=clientes&id=<?php echo $ver['cli_id']; ?>" title="Gerar PDF" target="_self">Gerar PDF</a> </td> </tr> <?php } while ($ver = mysql_fetch_assoc($busca)); ?> </table> <?php }else{ //Caso não tenha registros a consulta, exibimos a mensagem. print 'Sem Registros'; } ?> Feito isso, vamos para página "relatorio.php" que irá receber a requisição contendo o ID do registros que queremos gerar o PDF.

Percebam o seguinte:
relatorio.php?id=<?php echo $ver['cli_id']; ?> Este é o link que iremos utilizar para gerar o nosso PDF, pois estou passando o ID do registro desejado através da variável "id".

Vamos agora para página de relatórios, que é onde está o nosso segredo para gerar o PDF, crie então uma página chamada "relatorio.php"

OBS: Baixem uma imagem exemplar de uma logomarca que eu estou disponibilizando, ou então criem uma imagem de no máximo 300x300 e dêem o nome de exemplo.jpg   :seta: http://www.alaertegabriel.com.br/arquivos/exemplo.jpg

Sua hierarquia de arquivos deve estar assim:


- dompdf (PASTA CONTENDO TODOS OS ARQUIVOS DA CLASS)
- exemplo.jpg
- Clientes.php
- relatorio.php


ATENÇÃO: Nós vamos gerar o relatório em PDF, com formatações CSS e tabelas, além de uma imagem exemplo para o uso de uma logomarca no futuro, caso queiram utilizar é claro, pois é mais "decente" um relatório com a logomarca da empresa, lógico.


É preciso ter muita atenção nas concatenações para poder armazenar as marcações HTML dentro do PHP, caso contrário qualquer que seja o deslize implicará na má formação do PDF... Utilize sempre a concatenação para armazenas dados complicados ou marcações do tipo.

Abra a página relatorio.php e vamos ao seguinte código:


relatorio.php
  <?php //Definindo os dados para conexão e seleção da base de dados define('DB','banco_de_dados'); define('USER','root'); define('SENHA',''); define('HOST','localhost'); //Conexão com o banco de dados com base nos dados fornecidos anteriormente. $conexao = mysql_connect(HOST,USER,SENHA)or die('Erro na conexão - '.mysql_error()); ($conexao) ? mysql_select_db(DB, $conexao) : die(mysql_error()); $id = isset($_GET['id']) ? (int)$_GET['id'] : false; //Query simples para busca dos dados $busca = mysql_query("SELECT * FROM clientes WHERE cli_id = '$id'")or die(mysql_error()); //Verificação das linhas encontradas. $ver = mysql_fetch_array($busca); ?> <?php $html=' <html> <style type="text/css"> hr { border: 2px solid #39F; } .textos { font-family: Verdana, Geneva, sans-serif; font-size: 13px; line-height: 18px; color: #333; } td { font-family: Verdana, Geneva, sans-serif; font-size: 13px; line-height: 18px; color: #09F; } body { font-family: Calibri; } #dados { font-family: Calibri; font-size: 16px; } h2 { font-family: Calibri; color: #09F; } </style> <body> '; $html.='<table width="657" border="0" cellpadding="0" cellspacing="0"> <tr> <td width="384"><strong>Informações de Cliente/Empresa: </strong> '.$ver['cli_empresa'].'<br /> <span class="textos"><strong>Data de Cadastro:</strong> '.$ver['cli_datacad'].'</span><br /> <span class="textos"><strong>CNPJ:</strong> '.$ver['cli_cnpj'].'</span><span class="textos"><strong> IE:</strong> '.$ver['cli_ie'].'</span><br /> <span class="textos"><strong>Emissão:</strong> '.date('d/m/Y').' </span></td> <td width="52" align="right"><img src="exemplo.jpg" width="230" height="70"></td> </tr> </table> <hr /> <h2>Ficha Cadastral</h2> <div id="dados"> <p><strong>Responsável:</strong> '.$ver['cli_responsavel'].'</p> <p><strong>Endereço:</strong> '.$ver['cli_endereco'].'</p> <p><strong>Cidade:</strong> '.$ver['cli_cidade'].' <strong>UF:</strong> '.$ver['cli_uf'].'</p> <p><strong>Email:</strong> '.$ver['cli_email'].'</p> <p><strong>Situação:</strong> '.$ver['cli_situacao'].'</p> <p><strong>Data de Nascimento: </strong>'.$ver['cli_dtnascimento'].'</p> <p><strong>Tel:</strong> '.$ver['cli_tel'].' <strong>e/ou</strong> '.$ver['cli_tel_resp'].'</p> <p><strong>CEP:</strong>'.$ver['cli_cep'].'</p> </div> <hr /> <p class="textos">Empresa tal bla bla bla - Todos os Direitos Reservados.<br> Aplicações Especiais PHP - Alaerte Gabriel </p> </body> </html>'; ?> <?php mysql_free_result($busca); //Aqui nós chamamos a class do dompdf require_once('dompdf/dompdf_config.inc.php'); //É fundamental definir o TIMEZONE de nossa região para que não tenhamos problemas com a geração. date_default_timezone_set('America/Sao_Paulo'); //Aqui eu estou decodificando o tipo de charset do documento, para evitar erros nos acentos das letras e etc. $html = utf8_decode($html); //Instanciamos a class do dompdf para o processo $dompdf= new DOMPDF(); //Aqui nós damos um LOAD (carregamos) todos os nossos dados e formatações para geração do PDF $dompdf->load_html($html); //Aqui nós damos início ao processo de exportação (renderizar) $dompdf->render(); //por final forçamos o download do documento, coloquei a nomenclatura com a data e mais um string no final. $dompdf->stream(date('d/m/Y').'_cliente.pdf'); ?> Certo, mais Alaerte, eu preciso de meu relatório em orientação "PAISAGEM" e não "RETRATO".   Ok, se vocês tiverem a curiosidade de abrir o arquivo dompdf_config.inc.php verão que nele contém algumas configurações, dentre elas o modo da orientação do papel e o seu tipo de fonte na hora da escrita.   Porém, vocês também podem definir tranquilamente esse parâmetro, logo abaixo do load_html por exemplo:   $dompdf->set_paper('legal','landscape');   Deste modo, o arquivo irá sair na orientação paisagem. Vocês também podem mudar o tipo de fonte etc, é só da uma pesquisada a fundo na biblioteca do dompdf.   Pessoal espero que eu tenha sido claro em meu objetivo e que vocês possam compreender o uso da class dompdf e suprir suas necessidades ao precisar gerar um PDF com PHP. Até mais. :bye:   DOWNLOAD DO PROJETO COMPLETO: :seta: http://www.alaertegabriel.com.br/arquivos/exportandopdf.rar