Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Ruby
Code

Gerando PDFs A Partir de HTML com Rails

by
Difficulty:IntermediateLength:MediumLanguages:

Portuguese (Português) translation by Erick Patrick (you can also view the original English article)

Há inúmeras formas de gerar PDFs no Ruby e no Rails. Como você já conhece HTML e CSS, então usaremos o PDFKit para gerar arquivos PDFs usando HTML das visões e estilos padrões do Rails.

Introdução ao PDFKit

Internamente, o PDFKit usa o wkhtmltopdf (WebKit HTML to PDF), um mecanismo que pega HTML e CSS, renderiza-os usando Webkit e retorna-os como PDFs de alta qualidade.

Para começar, instalemos o wkhtmltopdf. Podemos baixar o binário ou instalá-lo através do Brew no Mac ou do repositório da sua versão Linux.

Também é preciso instalar a gem pdfkit e executar o seguinte código Ruby para gerar um PDF com o texto "Hello Envato!".

Criamos um arquivo, chamado hello.pdf, com o texto no topo.

An example of the PDF that was generated

PDFKit também gera PDFs a partir de uma URL. Se quisermos gerar um PDF do Google, podemos executar:

Como vemos, especificamos page_size—por padrão, A4 é usado. Veja a lista completa de opções.

An example of the Google homepage in PDF format

Estilizando Seu PDF Usando CSS

Mais cedo, mencionamos que geraremos arquivos PDF usando HTML e CSS. Nesse exemplo, adicionei um pouco de CSS para estilizar o HTML de um fatura simples:

Geraremos o arquivo envato_invoice.pdf se executarmos o script. A foto mostra o resultado do exemplo:

An example of an Envato invoice PDF

Como vemos, o PDFKit é bem fácil de usar, se já conhecemos HTML e CSS. Podemos customizar ou estilizar o documento o quanto quisermos.

Usando PDFKit A Partir de uma Aplicação Rails

Agora, vejamos como usar o PDFKit em uma aplicação Rails, para gerarmos arquivos PDF dinamicamente, usando dados de nossos modelos. Nessa seção, construiremos uma aplicação Rails simples para gerar a "Fatura Envato", dinamicamente. Criemos uma nova aplicação rails e adicionemos três modelos:

Agora, adicionemos alguns exemplos na base de dados. Adicione o código abaixo no arquivo db/seeds.rb.

Execute rake db:seed em seu terminal para adicionar uma fatura exemplo à base de dados.

Também queremos uma lista de faturas e o detalhamento ddas mesmas, então, usando geradores Rails, execute rails generate controller Invoices index show para criar o controlador e as visões.

app/controllers/invoices_controller.rb

app/views/invoices/index.html.erb

Precisamos modificar as rotas do Rails para direcionar para InvoicesController por padrão, então, editemos config/routes.rb:

Inicie um servidor com rails server e navegue até localhost:3000 para ver a lista de faturas.

List of invoices

app/views/invoices/show.html.erb

O CSS para a página de detalhes dessa fatura pode ser movido para app/assets/stylesheets/application.scss.

Então, ao clicarmos em uma fatura na listagem principal, veremos seu detalhamento:

Invoice view

Agora, estamos prontos para adicionar a funcionalidade de visualizar ou baixar faturas como PDF, à nossa aplicação Rails.

Classe InvoicePdf para Lidar com Renderização de PDF

Para renderizar as faturas como PDF, precisamos adicionar 3 gems ao Gemfile: PDFKit, render_anywhere e wkhtmltopdf-binary. Por padrão, Rails renderiza visões apenas em controladores, mas usando render_anywhere, podemos renderizá-las em modelos do domínio ou em serviços em segundo plano.

Para não poluir nosso controlador com muita lógica, criaremos uma nova classe InvoicePdf dentro de app/models para envolver a lógica de geração do PDF.

Essa classe receberá a fatura a ser renderizada por parâmetro, em seu construtor. O método privado as_html lê as visões invoices/pdf e layout_pdf, que serão usadas para gerar o HTML necessário para a renderização do PDF. Por último, o método to_pdf usa o PDFKit para salvar o PDF no diretório public do Rails.

Provavelmente, você gerará um nome dinâmico para o PDF para que não seja sobrescrito por acidente em sua aplicação real. Talvez até queira salvar o arquivo na AWS S3 ou em um diretório privado, mas essas ações estão além desse tutorial.

/app/views/invoices/pdf.html.erb

/app/views/layouts/invoice_pdf.erb

Algo a se notar nesse arquivo de layout é que renderizamos os estilos dentro dele. WkHtmlToPdf funciona melhor se fizermos desse jeito.

DownloadsController para Renderizar o PDF da Fatura

Agora, precisamos de uma rota e um controlador que chame a classe InvoicePdf para enviar o arquivo PDF para o navegador. Então, edite o arquivo config/routes.rb, assim:

Se usarmos rake routes, veremos a lista de rotas disponíveis na aplicação:

Crie app/controllers/downloads_controller.rb:

Como podemos ver, quando a requisição buscar um arquivo PDF, o send_invoice_pdf a processará. O método invoice_pdf encontrará a fatura usando o ID e criará uma instância de InvoicePdf. Então, send_invoice_pdf chamará o método to_pdf, enviando o arquivo gerado para o navegador.

Outra coisa a se notar é que estamos passando disposition: "inline" para send_file. Esse parâmetro envia o arquivo para o navegador, que o mostrará na tela. Se quiser forçar o download do arquivo, você precisa passar disposition: "attachment".

Adicione um botão de download para a fatura na visão app/views/invoices/show.html.erb:

Execute a aplicação, navegue pelos detalhes da fatura, clique em download e veja uma nova abar mostrando a fatura em PDF.

Invoice view PDF dynamically generated

Renderizando PDF como HTML Durante Desenvolvimento

Ao criar o código HTML para seu PDF, é preciso gerar um novo PDF toda vez que quiser testar uma mudança. Algumas vezes, isso pode ser lento. Por isso, pode ser bem útil poder visualizar o HTML gerado que será convertido em PDF. Apenas precisamos editar o arquivo /app/controllers/downloads_controller.rb:

Agora, o método show também lida com requisições HTML em modo de desenvolvimento. A rota para a fatura em PDF seria algo assim: http://localhost:3000/invoices/1/download.pdf. Se altararmos para http://localhost:3000/invoices/1/download.html, podemos ver o HTML usado para gerar o PDF da fatura.

Dado o código acima, gerar arquivos PDF usando Ruby on Rails é bem simples e direto, assumindo que seja familiar com a lingugem Ruby e a framework Rails. Talvez, o melhor aspecto desse processo é que não é preciso aprender uma nova linguagem ou coisas específicas sobre geração de PDF.

Espero que esse tutorial tenha sido útli. Por favor, faça quaisquer perguntas, comentários ou feedback na seção de comentário e ficarei feliz em responder!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.