Modelando relatórios PDF com Smarty
Certa vez li em um texto que os sistemas de informação não existem para armazenar informações, e sim para consultar informações. Todo esforço dispendido para desenvolver, implantar e alimentar um sistema existe para que alguém possa extrair dele informações úteis, através das quais possa tomar suas decisões. É nesse contexto que entram os relatórios, através dos quais os usuários podem consultar informações importantes de forma estruturada. Existem diversos tipos de relatórios e diversas ferramentas para construí-los, para cada necessidade e tecnologia. O objetivo deste artigo é apresentar uma forma simples de, em sistemas web, estruturar relatórios não muito extensos através de templates Smarty e gerá-los como PDF. Estou considerando aqui que o leitor já conheça SQL e já saiba fazer filtros de relatório.
Pra quem não conhece, Smarty é uma engine de templates para PHP. Ele facilita o trabalho de separar regras de negócio da apresentação/interface. A princípio, podemos utilizar o Smarty para criar templates de páginas HTML, mas a boa notícia é que podemos templatizar qualquer coisa com ele: HTML, XML, RSS, CSV, qualquer coisa que seja gerado em texto. Já usei Smarty até para templatezar rotinas para um gerador de códigos PHP…
Primeiramente, vamos modelar visualmente nosso relatório através de HTML. Isso pode ser feito tranquilamente através de editores WYSIWYG ou, para os mais experientes, através de algum editor de textos qualquer. Para fazermos a conversão final para PDF, utilizaremos a biblioteca HTML2PDF, baseada na FPDF. Portanto, não é necessário se ater muito a web standards e instruções CSS mais complexas, porque a HTML2PDF provavelmente não vai reconhecê-las corretamente. Neste caso não tem problema utilizar tabelas para compor o layout ou usar recursos como a tag <font> ou atributos bgcolor…
Antes de prosseguir, vamos ver alguns itens que são importantes estarem presentes em qualquer relatório, além dos dados:
- Título - O título do relatório identifica que tipo de informações ele traz. São nomes como "Relatório de clientes", "Vendas por cliente", "Saldo da Conta mês a mês"… Isso depende muito de cada necessidade. Em alguns casos pode ser interessante dar também um nome abreviado ou numeração a cada relatório, para ficar mais fácil o chefe do usuário pedir "imprime aí um R07, por favor…".
- Data - Como os dados dos sistemas estão sempre em movimento, é bastante útil que o relatório contenha a data em que foi gerado, para que um leitor possa avaliar a época do quadro apresentado nele.
- Nome do usuário - Para fins de controle, também é útil conhecer qual usuário gerou o relatório. Em alguns sistemas nem todos os usuários possuem acesso a todos os níveis de informações existentes, então em alguns casos usuários diferentes podem obter quadros diferentes.
- Filtro utilizado - Usualmente a geração de um relatório passa por uma tela de filtros, onde o usuário pode definir opções que limitem os resultados, como por exemplo período, categorias, intervalos de valores ou qualquer tipo de pesquisa referente às entidades envolvidas. Para que um relatório não vire um papel sem sentido, é muito importante que nele sejam especificados quais filtros geraram aqueles resultados.
- Nome/logomarca da empresa - Isso personaliza mais o seu relatório. Para esta função talvez seja necessário consultador o departamento responsável pela identidade visual da empresa. Em alguns casos não será necessário imprimir os dados da empresa no relatório, por já disporem de papel timbrado. De qual forma, é bom ter as duas opções.
- Número das páginas e total de páginas - Para que o leitor do relatório saiba se não está faltando páginas, quando pegar uma versão impressa.
Agora, mão na massa:
1 - Abaixo, vamos montar um modelo simples de relatório, para exibir uma lista de pessoas. Para isso estou utilizando um editor WYSIWYG qualquer (eu particularmente recomendaria o Dreamweaver), já utilizando algumas tags Smarty. Uma das principais vantagens deste método é poder trabalhar os relatórios visualmente, deixando essa personalização mais flexível para cada cliente ou situação.
2 - Agora vamos trabalhar um pouquinho nesse código HTML/Smarty dele, que, até o momento está mais ou menos assim:
Depois de alguns ajustes, ficou como este código abaixo (atente para os comentários).
3 - Agora, vamos construir a parte do relatório que extrai os dados (não estou montando aqui a lógica de construção dos filtros, que fica por sua conta).
O relatório HTML no navegador vai ficar desta forma:
4 - Agora vamos passar o nosso relatório para PDF. Para isso utilizaremos a biblioteca HTML2PDF, disponível gratuitamente no website http://html2fpdf.sourceforge.net/ . Tive que fazer um pequeno ajuste nela para funcionar com PHP5. A versão ajustada estará disponível para download junto a todo o código fonte, no final deste artigo. O código final vai ficar assim:
…sendo exibido desta forma:
E está pronto o nosso relatório!
Algumas observações importantes:
- Não coloque um relatório para abrir na mesma janela em que está a tela anterior do sistema, envie sempre o usuário para uma nova janela. Isso vai facilitar as coisas quando o usuário quiser voltar às demais telas do sistema. Você pode fazer isso utilizando um target="_blank" no link o formulário que leva ao relatório.
- Por questão de compatibilidade com algumas versões do Internet Explorer, acrescente em algum lugar da URL o texto ".pdf". Por exemplo: relatorio_pessoas.php?sexo=M&_ext=.pdf, caso contrário pode ser que o navegador não reconheça o documento como um pdf e gere um resultado estranho na tela.
- Não use este tipo de abordagem para relatórios cujo tamanho possa ultrapassar a memória disponível de seu computador e configuração do PHP. Todo o conteúdo neste caso é gerado em memória, então conteúdos grandes demais vão gerar um erro que impedirá a exibição correta do relatório. Se o seu relatório vai ter milhares de página, é bom procurar outra solução…
- Provavelmente a aparência em PDF não ficar 100% igual ao HTML que você fez, e provavelmente seu código vai precisar passar por alguns ajustes antes que fique perfeito e correto, mas com o tempo você vai pegando o jeito com a HTML2PDF.
- A numeração das páginas a HTML2PDF faz automaticamente.
Então, é isso; espero que tenha gostado. Seque aqui o código fonte final com tudo.
No demais, vida longa e próspera!








2 de Julho de 2008 @ 12:17:03
Cara. não tenho nem palavras…
Simplesmente d+++++++++++
estou adaptando para o que vou usar aqui e até agora deu tudo certo.
a unica coisa que queria saber é como fazer um link pra clicar e abrir só o pdf,pq eu fiz uma pagina com um link pra abrir o arquivo “relatório_pessoas.php” e ele abre o pdf certinho só q ficam duas janelas. Como faço um jeito de abrir só a janela do pdf?
Aguardo seu retorno e Parabéns pelo tutorial, ficou exclente.
Abs.
Alisson!!!
9 de Julho de 2008 @ 13:58:45
Obrigado Alisson, fico feliz que tenha gostado…
Não vi seu comentário antes porque parece que houve algum problema no aviso por e-mail.
Para abrir o link na mesma janela, basta tirar o target=”_blank” dele. Era isso mesmo que você queria saber?…
9 de Julho de 2008 @ 15:16:57
Obrigado por responder minha pergunta, consegui arrumar a questão de abrir utilizando:
$pdf->Output(”C:/teste.pdf”,”I”);
Tive outros problemas como: margem direita, fonte, mas foram resolvidos.
Agora que terminei, a única coisa que não consegui e estou tentando arrumar é a questão do sublinhado que na maioria das vezes ele passa do limite que foi pedido ou passa a margem.
Estou gerando certidões de imóveis com imagem de cabeçalho e número de matricula em todas as folhas e os dados do imóvel, como lote, quadra ou gleba, área, proprietario(s) atual(is), onus como hipoteca, penhora, etc…. pegando do banco de dados que ja tenho em sql…tudo isso pelo script que você ensinou nesse tutorial… pois antes eu fazia tudo no word, convertia no computador local, através do win2pdf, pra depois jogar para o servidor, e toda vez que tinha alguma alteração em alguma matricula eu tinha q alterar no word, fazer todo esse processo novamente e ainda editar o banco de dados…agora desse jeito eu preciso apenas alterar no banco de dados… resumindo, FICOU EXCELENTE GRAÇAS A SEU TUTORIAL…
Havia pesquisado muitooo mesmo sobre um conversor de html pra pdf, mas os que encontrei tive muitos problemas, mas o seu caiu como uma luva e é muito bom.
Se puder me informar do que posso fazer para corrigir o erro do sublinhado, ficarei muito grato, pois o seu script ficou perfeito, o unico problema foi esse ai mesmo.
Vou tentar explicar o erro:
se jogo assim:
2) (parte ideal de 25% do imóvel) Marlene Batista da Silva, CPF. 000.000.000-00, CI.RG. 1.111.111-PR
o sublinhado teria que ficar dentro do partenses no caso, mas ele chega até a letra A da palavra Aparecida, não sei pq.
Caso não tenha entendido, salvei um arquivo gerado com esse erro em: www.alisson.info/pdf.pdf
Aproveite e veja o que conseguei com seu tutorial…
Parabéns mais uma vez e fico no aguardo de seu contato…
Desde já agradeço
Alisson!!!
9 de Julho de 2008 @ 18:15:37
Está ficando bem legal a sua certidão!
Fico feliz que esteja sendo útil… Você pode me enviar o HTML que o seu relatório geral para este PDF? (envia pra o meu e-mail “contato arroba adrianoweb.com.br”) Como você está fazendo o sublinhando? Já tentou com <u>?
10 de Julho de 2008 @ 09:33:30
Olá adriano, bom dia!
Já enviei os arquivos por email.
Ignore os “aaaaaaaa” no final do arquivo.rsrsr. era só um teste.
Já estou utilizando o para sublinhar.
Fico no aguardo de uma posição.
Muito obrigado.
Alisson!!!
16 de Julho de 2008 @ 08:51:30
Olá Adriano, bom dia!
Recebeu meu ultimo e-mail? Conseguiu achar alguma coisa??
Abs
Alisson!!!
17 de Julho de 2008 @ 01:56:33
Oi Alisson, recebi sim, só não deu pra olhar ainda com calma; essa semana está um pouco corrida…
Mas se eu descobrir alguma coisa eu te falo.
19 de Novembro de 2008 @ 08:28:43
Pessoal a classe é nota 10!
Mas estou tenho problemas com o tamanho da fonte, pois a mesma se mantêm fixa.
Vi o que o Alisson fez ficou muito legal.
Como vc conseguiu resolver o lance do tamanho da fonte Alisson?
Abraço