Como criar PDFs incríveis usando Ruby + Prawn + Gruff

Introdução 🙂

Criar PDFs para exportar dados, gerar boletos e etc é uma tarefa comum em vários sistemas e é claro que o Ruby On Rails possui várias maneiras de resolver este problema. A minha preferida é utilizando a gem Prawn porque ela te permite realizar customizações complexas de uma maneira bem simples e intuitiva.

O que vamos aprender?

Nesse tutorial eu vou abordar a criação de dois tipos de documentos em PDF, o primeiro é um contrato gerado através de alguns dados básicos como nome do cliente, descrição, valor e etc e o segundo documento vai ser um PDF com dois gráficos diferentes baseados nos dados de despesas de uma empresa.
Nós vamos aprender como usar a sintaxe básica do prawn e também como gerar gráficos incríveis usando o gruff.

INGREDIENTES
Objetivos

Criar um projeto que permita exportar os dados de duas tabelas de uma empresa em PDF.
A primeira gerando um contrato (em PDF) e a segunda um gráfico sobre as contas de uma empresa (em PDF).

Passo a Passo
  1. Criar a estrutura do Projeto
  2. Incluir os links e métodos de export
  3. Criar nossos métodos para gerar os PDFs
Mãos à Obra \o/
Parte 1 – Criando o Projeto

Primeiro vamos criar nosso projeto Rails, nossas tabelas e também dois scaffolds básicos para podermos gerenciar os dados que serão usados para gerar os PDFs.

1 – Para começar, rode no seu console o comando para gerar o projeto:

2 – Inclua no seu Gemfile o prawn e o gruff:

3 – O gruff tem como dependências os seguintes softwares, para instalar no ubuntu rode:

*Caso você esteja em outro sistema, acesse este link para instalar.

4 – Vamos instalar nossas Gems, rode:

5 – Vamos criar nossos scaffolds para poder gerenciar os dados das tabelas que usaremos pra gerar os PDFs, rode este comando para o primeiro scaffold:

E agora este para o segundo, rode:

6 – Vamos rodar nossas migrations (como estamos usando o sqlite3 não precisamos rodar o rake db:create antes)

7 – Vamos rodar o servidor e criar um novo agreement, siga os passos:

  • Rode o servidor

prawn gruff

  • Clique em “New Agreement” e preencha o formulário.
  • Agora acessando http://localhost:3000/agreements seu resultado deve ser semelhante ao da imagem a baixo:
    captura-de-tela-de-2016-11-11-17-44-00

Pronto \o/, nosso projeto foi criado, agora vamos preparar ele para exportar nossos dados.

Parte 2 – Preparando os Exports

Nesta fase nós vamos incluir no nosso projeto os botões de export e também vamos preparar nossos controllers para chamarem nosso módulo gerador de PDF quando ele estiver pronto.

1 – Vamos acrescentar as rotas para exportarmos nossas tabelas. Vá até routes.rb e substitua o conteúdo por:

2 – Vá até o arquivo “app/views/agreements/index.html.erb”, e substitua o conteúdo por:

<%= notice %>

 

Agreements

 

<% @agreements.each do |agreement| %>        <% end %>

Client name Description Price
<%= agreement.client_name %> <%= agreement.description %> <%= agreement.price %> <%= link_to ‘Show’, agreement %> <%= link_to ‘Edit’, edit_agreement_path(agreement) %> <%= link_to ‘Destroy’, agreement, method: :delete, data: { confirm: ‘Are you sure?’ } %> <%= link_to ‘Export’, export_agreement_path(agreement), target: “_blank” %>

<%= link_to ‘New Agreement’, new_agreement_path %>

*Note que incluímos o link para dar o export de cada agreement.

3 – Agora vá até o arquivo “app/views/spendings/index.html.erb”, e substitua o conteúdo por:

<%= notice %>

 

Spendings

 

<% @spendings.each do |spending| %>      <% end %>

Value Section
<%= spending.value %> <%= spending.section %> <%= link_to ‘Show’, spending %> <%= link_to ‘Edit’, edit_spending_path(spending) %> <%= link_to ‘Destroy’, spending, method: :delete, data: { confirm: ‘Are you sure?’ } %>

<%= link_to ‘New Spending’, new_spending_path %> <%= link_to ‘Export To Graph’, spending_export_path, target: “_blank”%>

*Note que incluímos o link para dar o export das spendings.

4 – Agora vá até o controller “app/controllers/agreement_controller.rb” e substitua o conteúdo dele por:

* Se você chamar o controller no browser vai quebrar porque ainda não criamos nossa módulo de export, vamos fazer isso na próxima parte.

* Note que o que incluímos foi o método export, o carregamento da lib que vamos criar e o método export no set_agreement para carregar corretamente o record. (Veja com calma os comentários no código)

5 – Agora vá até o controller “app/controllers/spending_controller.rb” e substitua o conteúdo dele por:

* Se você chamar o controller no browser vai quebrar porque ainda não criamos nossa módulo de export, vamos fazer isso na próxima parte.

* Note que o que incluímos foi o método export e o carregamento da lib que vamos criar. (Veja com calma os comentários no código)

Pronto Agora vamos para a parte divertida \o/

Parte 3 – Criando os métodos de Export

Nesta parte nós vamos criar dois métodos dentro de um módulo para gerar nossos PDFs, para fazer isso vamos criar um arquivo dentro do diretório lib e incluir nossas dependências (prawn para o PDF e gruff para gerar as imagens dos gráficos).
Eu comentei linha a linha do código para você entender o funcionamento do Prawn e Guff então, acompanhe com calma o código 🙂

  1. Crie um arquivo chamado “generate_pdf.rb” no diretório “lib” da sua aplicação.
  2. Agora copie dentro desse arquivo o seguinte código:

    Observe que temos 2 métodos dentro do módulo, o primeiro método (agreement) vai gerar nosso contrato usando os parâmetros que criarmos no scaffold de agreement usando o prawn e vai colocar o pdf criado em “public/agreement.pdf” o segundo (spending) cria o nosso PDF com dois gráficos baseados nos dados que entrarmos no scaffold de spendings usando o prawn para gerar o PDF e o gruff para gerar os gráficos (imagens) que serão incluídos dentro do PDF em “public/spending.pdf”. (Leia com calma os comentários do código acima)
  3. Agora finalmente vamos testar nossa pequena aplicação, primeiro rode o seu servidor:
  4. No browser visite http://localhost:3000/agreements
  5. Agora ao lado de um Agreement já criado via form você dever ver um link escrito “export” como na imagem a baixo:
    captura-de-tela-de-2016-11-11-21-02-29
  6. Clique nele, o PDF vai abrir em uma nova aba e o resultado deve ser semelhante a este:
    captura-de-tela-de-2016-11-11-20-44-50
  7. Agora visite http://localhost:3000/spendings
  8. Crie alguns spendings para gerar dados para o gráfico como na imagem a baixo.
    captura-de-tela-de-2016-11-11-20-48-27
  9. Agora na mesma tela (listagem de spendings) clique no link “Export to Graph”, quando você fizer isso o PDF vai se abrir na aba ao lado e a primeira página deve ser semelhante a esta:
    captura-de-tela-de-2016-11-11-20-45-54E a segunda página semelhante a está:
    captura-de-tela-de-2016-11-11-20-46-12
  10. Parabéns \o/ nós conseguimos criar um pequeno sistema que gera contratos e gráficos baseados nos dados das nossas tabelas.

CONCLUSÃO

Gerar PDF usando o ruby + prawn + gruff é uma tarefa muito simples e traz infinitas possibilidades, para você se aprofundar e aprender a fazer mais coisas com essas ferramentas incríveis acesse o manual do Prawn clicando aqui e o repositório do Gruff clicando aqui.

Como de costume o Código completo da aplicação está no Github, caso você queria clonar o código, clique aqui. Aproveita e me segue lá \o/

Se você ficou com dúvidas ou tem sugestões de posts para o Blog comenta aí em baixo ou me adiciona no Facebook clicando aqui.

Muito Obrigado,
Sua presença aqui é uma honra para mim,
Leonardo Scorza :)[:]

outubro 4, 2017
Feito com s2 por OneBitCode
%d blogueiros gostam disto: