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
initializer
Utiliser unVous 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' %>