Que faites-vous lors de la génération de PDF avec Rails? Un peu de recherche révèle des gemmes telles que wicked_pdf et la crevette.
Cette fois, j'ai découvert l'existence d'un bijou qui génère des PDF et des images à partir de HTML en utilisant Puppeteer / Chromium appelé grover et je l'ai essayé, donc je vais laisser une note.
Installer le marionnettiste
npm install puppeteer
Décrit dans Gemfile
gem 'grover'
Ajoutez ce qui suit à config / initializers / grover.rb.
# frozen_string_literal: true
Grover.configure do |config|
  config.options = {
    format: 'A4',
    margin: {
      top: '5px',
      bottom: '10cm'
    },
    viewport: {
      width: 640,
      height: 480
    },
    prefer_css_page_size: true,
    emulate_media: 'screen',
    cache: false,
    timeout: 0, # Timeout in ms. A value of `0` means 'no timeout'
    launch_args: ['--font-render-hinting=medium', '--lang=ja'], #Pour l'affichage japonais--lang=ajouter ja
    wait_until: 'domcontentloaded'
  }
end
Décrivez ce qui suit dans controllers / api / sample_controller.rb. N'oubliez pas de décrire le routage.
# frozen_string_literal: true
module Api
  class SampleController < ApplicationController
    include ActionController::MimeResponds #Répondre en mode API_Nécessaire pour utiliser pour
    def show
      controller = ActionController::Base.new
      html = controller.render_to_string(template: 'api/hoges/show', layout: 'pdf')
      pdf = Grover.new(html).to_pdf
      respond_to do |format|
        format.html
        format.pdf do
          send_data(pdf, filename: 'your_filename.pdf', type: 'application/pdf')
        end
      end
    end
Créer un fichier de mise en page pour la génération de pdf
views/layouts/pdf.html.erb
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <style>
    </style>
  </head>
  <body>
    <%= yield %>
  </body>
</html>
api/sample/show.html.erb
<p>Facture d'achat</p>
<style>
p { font-size: 20px; }
</style>
J'ai pu facilement générer un pdf. Le temps de traitement est également un niveau qui n'a pas d'importance. Si vous incluez le marionnettiste, vous n'avez pas besoin de définir la police, donc ça a l'air bien.
Recommended Posts