Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Alaerte Gabriel

Exportando relatório para PDF

Recommended Posts

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

preciso fazer algo parecido porem eu escolho em uma pagina o nome q eu quero que mostra todos os dados nela. quando eu clico em buscar vai pra pagina q mostra q tem um formulário porem eu deixei os input e dentro coloquei uma tag php. no caso pra essa pagina virar pdf nao estou conseguindo poderia dar alguma dica? pois os downloads do teu exemplo tbm n esta funcionando

Compartilhar este post


Link para o post
Compartilhar em outros sites

Grato
Me ajudou muito

Fiz uma pequena alteração para salvar o arquivo e depois imprimir

No caso é uma impressora bematech 4200 nf

 

Segue:

 

Criei um link para o arquivo com target="_blank"

Depois de gerar o arquivo, uso o lpr do linux para imprimir o mesmo

Então um código java script para fechar a aba

 

Segue o código

$pdf = $dompdf->output();
$arquivo = "/var/www/html/mixvendas/venda/venda.pdf";
file_put_contents($arquivo, $pdf);
system("lpr -#1 /var/www/html/mixvendas/venda/venda.pdf");
<script>
    window.close();
</script>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.