Gerando PDF com a gem wicked_pdf no Rails 6
Elisangela Silva
Posted on April 25, 2021
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
Ela se chamará Schedule.
Logo em seguida utilizando o seguinte comando para criar view e controller:
$ rails generate controller Schedule index --skip-routes
Ajuste da rota:
Rails.application.routes.draw do
root "schedule#index"
end
Agora você pode rodar a aplicação:
$ rails s
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'
Agora crie o initializer:
$ rails generate wicked_pdf
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'
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)
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.
- Certifique-se que você tem o yarn instalado ou ou dê uma olhada em https://yarnpkg.com/en/docs/install
- Será necessário o nodejs na versão 10.17.0
- Configure ```
$ rails webpacker:install
- Certifique-se que todos os pacotes estão atualizados
$ yarn install --check-files
- Agora teste iniciando seu servidor Rails
$ 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
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
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>
#app/views/schedele/relatorio.pdf.erb
HTML
<h1>Hello Word!</h1>
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
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') =%>
A partir daí consegui gerar o pdf:
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!
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
November 30, 2024
November 30, 2024