Générer des PDF depuis une application Rails

Le plug-in PrawnTo permet de créer des documents PDF depuis une application Ruby On Rails. Voici pas à pas comment l'installer et le paramétrer.

Prawn est une librairie qui permet de générer des PDF en Ruby. L'installation est très simple puisque Prawn est packagé en Gem : sudo gem install prawn.

Si vous souhaitez générer des PDF depuis une application Ruby On Rails, le plugin PrawnTo permet de créer des documents directement depuis une vue pdf.prawn (qui contiendra du code Prawn pour générer le PDF). PrawnTo est disponible sur Github sous forme d'un plugin pour Ruby On Rails.


La combinaison de ces deux outils intègre parfaitement la création de PDF à l'application Rails puisqu'ils sont générés via une vue, sans polluer le modèle ou le contrôleur, en respectant le principe MVC :

  # app/controllers/articles_controller.rb
def show
 @article = Article.find(params[:id])
 respond_to do |format|
   format.pdf do
     prawnto :prawn => { :page_layout => :landscape, :page_size => "A5"}, :inline => false
   end
 end
end
# app/views/articles/show.pdf.prawn
pdf.text(@article.title, :size => 14)
pdf.move_down(20)
pdf.text(@article.content)



Le paramètre :inline => false de Prawnto force le navigateur à proposer le téléchargement du document PDF. Pour tester le bon rendu du document, utiliser un helper de test qui permet de sauver la réponse sous forme d'un fichier dans un dossier temporaire :

 def send_file_to_disk(content, filename)
 test_file_path = "#/tmp/tests/"
 FileUtils.mkdir_p(test_file_path)
 File.open(test_file_path+filename, "w") do |f|
   f.write(content)
 end
end
 
# test/functional/articles_controller_test.rb
test ":show in PDF format should render PDF"
 get :show, :id => articles(:test).id, :format => 'pdf'
 
 send_file_to_disk(@response.body, "article.pdf")
end

 

Libre à vous, ensuite, d'aller vérifier le rendu dans le dossier tmp/tests/ de votre application Rails.


Ce tutoriel a été réalisé par Raphaël Emourgeon sous licence Creative Commons.

Ruby / Ruby on Rails