Générer des PDF avec Ruby on Rails

App d’exemple

Pour un aperçu de l’intégration de PDFMonkey, nous avons créé une application Rails de démo que vous pouvez étudier.

Installer la gem pdfmonkey dans votre projet

Ajoutez la gem pdfmonkey au Gemfile de votre projet :

gem 'pdfmonkey'

Authentification

Commencez par récupérer votre clé d’API sur la page Mon compte dans votre tableau de bord.

Une fois votre clé obtenue, vous avez deux options d’authentification.

Utiliser une variable d’environnement

Cette option est la plus pratique dans le cas de l’hébergement sur une plateforme comme Heroku ou dans le cas de l’usage de conteneurs comme Docker.

Réglez simplement la valeur de la variable d’environnement PDFMONKEY_PRIVATE_KEY et c’est fini.

heroku config:set PDFMONKEY_PRIVATE_KEY=VOTRE-CLE -a YOUR-APP
PDFMONKEY_PRIVATE_KEY=VOTRE-CLE
PDFMONKEY_PRIVATE_KEY=VOTRE-CLE bundle exec rails s

Utiliser un initializer

Vous pouvez également choisir d’utiliser un initializer pour régler votre clé d’API :

# config/initializers/pdfmonkey.rb

Pdfmonkey.configure do |config|
  config.private_key = 'VOTRE-CLE'
end

Générer un document

Prenons l’exemple d’un contrat dans votre application.

Pour créer un nouveau PDF chaque fois qu’un contrat est modifié, utilisez un callback after_commit :

# app/models/contract.rb

# Table contracts
# nom_client      String
# adresse_client  String
# prix_total      Integer
# id_pdfmonkey    String
class Contrat < ApplicationRecord
  ID_MODELE='ID-DE-VOTRE-MODEL'

  after_commit :generer_pdf

  private

  def generer_pdf
    # Ne pas lancer le callback si on modifie déjà le champ id_pdfmonkey
    return if previous_changes.key?('id_pdfmonkey')

    # Récupération des données dynamiques à envoyer pour le document
    donnees_dynamiques = attributes.slice('nom_client', 'adresse_client', 'prix_total')

    # Génération du document et attente de la fin de génération
    doc_pdfmonkey = Pdfmonkey::Document.generate!(ID_MODELE, donnees_dynamiques)

    if doc_pdfmonkey.status == 'success'
      # Enregistrement de l'id de document PDFMonkey dans le contrat
      update(id_pdfmonkey: doc_pdfmonkey.id)
    else
      # Gestion du cas où le document n'a pas pu être généré
    end
  end
end

Ajouter un lien de téléchargement

Maintenant que notre document est généré à chaque modification d’un contrat, ajoutons un lien de téléchargement dans notre app.

Chaque fois que vous récupérez un document sur PDFMonkey, nous fournissons une URL de téléchargement. Cette URL est valable uniquement 30 secondes.

Cela signifit que vous pouvez choisir soit de stocker directement le document soit de rafraîchir le document à chaque clic. Dans ce guide nous allons choisir la deuxième option.

# config/routes.rb
resources :contrat_pdfs, only: [:show]

# app/controllers/contrat_pdfs_controller.rb
class ContratPdfsController < ApplicationController
  def show
    contrat = Contrat.find(params[:id])
    document = Pdfmonkey::Document.fetch(contrat.id_pdfmonkey)

    redirect_to document.download_url
  end
end

Vous pouvez ensuite ajouter un lien classique dans une vue :

<%= link_to 'Télécharger', contrat_pdf_path(@contrat), target: '_blank' %>