Quelque soit le langage de programmation que vous utilisez, la génération de PDF est toujours quelque chose d’assez sensible à réaliser. Heureusement il existe des solutions.
En Ruby, j’ai nommé Prawn. Je vais passer rapidement sur la génération de documents avec prawn même puisque j’utilise Rails et Prawnto, qui permet de l’y intégrer de manière à peu près propre (quoi que).
Installons prawn et prawnto.
gem install prawn gem install prawnto
Avec Prawn, générons donc un document simple, juste pour montrer. Le reste on le fera avec Prawnto (mais de toute façon, le fonctionnement est le même).
Prawn::Document.generate('nom_du_document.pdf') do
text 'Il est beau mon pdf non ?', :size => 40
end
Qui affichera en gros en haut à gauche de votre document le texte « Il est beau mon pdf non ? »
On a généré notre premier pdf en Ruby. Cool !
Passons à Prawnto.
Ce plugin rails permet de générer des pdf tout en conservant le modèle MVC. Vous spécifiez que vous désirez que telle ou telle vue puisse générer des pdf.
Puis lorsque vous l’appellerez avec params[:format] à ‘pdf’ (sauf exception dans vos routes, en passant .pdf à la fin de l’url), le rendu sera au format pdf.
Commencons donc par déclarer que notre action peut retourner du pdf.
def mon_action
prawnto :inline => false
end
Puis nous créons un fichier « mon_action.pdf.prawn » dans le répertoire de vues du contrôleur. C’est dans ce fichier que l’on définira la manière de générer notre pdf.
Par exemple, voici, rien que pour vous, un extrait de la génération des factures pour les fonctionnalités payantes qui arrivent bientôt sur RefStats !
pdf.bounding_box [70, 700], :width => 150 do
pdf.image "app/views/factures/pdf/logo.jpg", :width => 100
end
pdf.bounding_box [300, 670], :width => 150 do
pdf.text "Receipt", :size => 20
end
pdf.bounding_box [50, 600], :width => 550 do
pdf.text "User: " + @facture.user.username
pdf.text "PAID", :size => 30, :align => :center if @facture.paid
end
data = @facture.items.collect { |i| [i.description, i.price, i.quantity, i.total] }
if !@facture.items.empty?
pdf.bounding_box [0, 400], :width => 550 do
pdf.table data, :position => :center, :width => 550, :headers => ['Description', 'Price (Taxes Included)', 'Quantity', 'Total Price (Taxes Included)']
end
pdf.bounding_box [400, (350-(data.size*20))], :width => 550 do
pdf.table [['Total', @facture.total]], :position => :right, :width => 150
end
else
pdf.text "No items to display (or corrupted receipt)", :at => [200, 400]
end
Quelques explications.
Les bouding boxes permettent de placer des éléments de manière relative dans la page. Ainsi je peux aligner le logo et le texte « Receipt » au même niveau.
Le tableau de chiffres après la définition de la bouding_box indique son emplacement. C’est assez traitre car le premier est l’emplacement par rapport à la gauche du document.
Mais le suivant est l’emplacement par rapport au bas du document.
L’élément table permet de créer un tableau. Si par exemple, votre tableau Ruby ressemble à cela :
[
[ 'Titre', 'Chiffre' ]
[ 'Second Titre', 'Second Chiffre' ]
]
Alors le tableau généré sera le suivant :
| Titre | Chiffre |
| Second Titre | Second Chiffre |
Il est possible de placer des éléments en en-tête avec l’option « headers » (voir comment je génère la mienne).
Pour les autres options, elles parlent d’elle même je pense
Chargez la page et vous aurez un beau document pdf généré ![]()
Et vous, vous utilisez quoi pour générer vos pdf (en ruby !)




