Gerando PDF com a gem wicked_pdf no Rails 6

likannp

Elisangela Silva

Posted on April 25, 2021

Gerando PDF com a gem wicked_pdf no Rails 6

Hi guys! Espero que vocês estejam bem e seguros 😃. Sou iniciante no Rails e esses dias no trabalho surgiu uma tasks envolvendo a gem wicked_pdf, decidi estudá-la e escrever esse artigo. Espero que gostem!

Dividirei o artigo em duas partes, a primeira parte abordarei as instalações e ajustes necessários,e na segunda parte desenvolverei uma aplicação simples.

Iniciaremos criando a aplicação utilizando o seguinte comando:



$ rails new schedule


Enter fullscreen mode Exit fullscreen mode

Ela se chamará Schedule.

Logo em seguida utilizando o seguinte comando para criar view e controller:



$ rails generate controller Schedule index --skip-routes


Enter fullscreen mode Exit fullscreen mode

Ajuste da rota:



Rails.application.routes.draw do
  root "schedule#index"
end


Enter fullscreen mode Exit fullscreen mode

Agora você pode rodar a aplicação:



$ rails s


Enter fullscreen mode Exit fullscreen mode

image

Caso você não tenha ideia do que esses comandos acima fazem, sua jornada inicia por esse link, este link tem um tutorial legal para iniciantes.

1. Instalações e Ajustes

Tudo ok até aqui?! Caso sim, vamos prosseguir. A documentação da gem mostra o passo a passo de como a gem deve ser instalada, ela funciona nas versões do Rails abaixo do 6, a partir dessa versão vocês terão que realizar algumas modificações que iremos tratar nesse artigo.

Vamos iniciar adicionando a gem ao Gemfile e executar bundle install:



gem  'wicked_pdf'


Enter fullscreen mode Exit fullscreen mode

Agora crie o initializer:



$ rails generate wicked_pdf


Enter fullscreen mode Exit fullscreen mode

Depois de adicionar a gem wicked_pdf, precisamos incluir um detalhe. O wicked_pdf usa o binário wkhtmltopdf que, por sua vez, é baseado no WebKit. Sua funcionalidade é pegar um documento HTML e passar para o wkhtmltopdf que converte em um documento PDF que pode ser baixado pelo usuário.

Então vamos adicionar a gem do wkhtmltopdf ao Gemfile e execute bundle install:



gem  'wkhtmltopdf-binary'


Enter fullscreen mode Exit fullscreen mode

O problema inicia agora, quando você tenta rodar o servidor aparece no console um erro parecido com esse aqui:



Error: No such file or directory @ rb_sysopen - /home/user/folder/schedele/config/webpacker.yml (RuntimeError)


Enter fullscreen mode Exit fullscreen mode

Desde o Rails 6, o Webpacker é o compilador JavaScript padrão. Portanto, você também terá que configurá-lo antes de iniciar seu servidor Rails.

Existem algumas resoluções legais nessa issue, recomendo que você leia e até tente, vou disponibilizar abaixo o que funcionou comigo.

$ rails webpacker:install

-  Certifique-se que todos os pacotes estão atualizados
Enter fullscreen mode Exit fullscreen mode

$ yarn install --check-files

- Agora teste iniciando seu servidor Rails 
Enter fullscreen mode Exit fullscreen mode

$ rails s



### 2. Desenvolvendo a aplicação
Tudo ok até aqui? Caso sim, vamos dar continuidade na construção da aplicação.

Iniciei essa segunda parte pelo controller:
```Ruby


class ScheduleController < AplicationController
  def index
  end
  def relatorio
      render pdf: "file",
      layout: "application.pdf.erb",
      template: "schedule/relatorio.pdf.erb"
  end
end


Enter fullscreen mode Exit fullscreen mode

A action index será a view principal. Já a action relatorio será responsável por renderizar o pdf.

Criei o arquivo "application.pdf.erb" onde será definido o layout principal do pdf.



#app/views/layouts/application.pdf.erb


Enter fullscreen mode Exit fullscreen mode

 HTML
<!DOCTYPE html>
<html>
  <head>
    <title>Schedule</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>
  </head>
  <body>
    <%= yield %>
  </body>
</html>


Enter fullscreen mode Exit fullscreen mode


#app/views/schedele/relatorio.pdf.erb


Enter fullscreen mode Exit fullscreen mode

 HTML
<h1>Hello Word!</h1>


Enter fullscreen mode Exit fullscreen mode

Adicionei a rota da nova action no arquivo routes.rb



Rails.application.routes.draw do
  root "schedule#index"
  get "relatorio", to: "shedule#relatorio"
  resources: :schedele
end


Enter fullscreen mode Exit fullscreen mode

Na view index, adicionei o helper to_link com a path da action que irá renderizar o arquivo pdf.


 HTML
<h1>Schedule#index</h1>
<p>Find me in app/views/schedule/index.html.erb</p>

<%= link_to 'Create PDF document', relatorio_path(format: 'pdf') =%>


Enter fullscreen mode Exit fullscreen mode

Tela com o botão para criar o PDF

A partir daí consegui gerar o pdf:
PDF com a mensagem

No repositório da gem tem dicas de como utlizar css, imagens e javascript no pdf.

Qualquer duvida deixa nos comentários. Obrigada pela paciência e espero ter ajudado. Até mais!

💖 💪 🙅 🚩
likannp
Elisangela Silva

Posted on April 25, 2021

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related