Creare pdf batch con prawn


#1

Tramite applicazione web fornisco un anteprima del pdf che costruisco
molto agilmente con la libreria prawn e che interfaccio tramite prawnto:
http://asciicasts.com/episodes/153-pdfs-with-prawn

La creazione però devo farla via batch perchè devo fare delle altre
operazioni sui pdf creati. Sono riuscito a crearli con un task rake,
replicando quanto faccio nel template dell’applicazione web con qualcosa
del genere:

namespace :batch do
namespace :pdf do
desc “Create pdf from data”
task(:create => :environment) do
require ‘prawn’
DATA_DIRECTORY = File.join(RAILS_ROOT, “lib”, “tasks”, “pdf”)
letters = Letter.all
begin
num = 0
letters.each do |letter|
Prawn::Document.generate(File.join(DATA_DIRECTORY,
“#{letter.id.to_s}_#{letter.name}.pdf”), :top_margin => 75) do |pdf|
#Stampa
pdf.move_down(10)
pdf.text letter.object, :size => 10, :style => :bold
pdf.move_down(20)
pdf.text letter.body, :size => 10, :style => :italic
end #Fine prawn
end #Fine do letters
puts "Letters printed: " + num.to_s
rescue StandardError => bang
puts "Error " + bang
end #End begin
end #End task
end #End namespace pdf
end #End namespace batch

Ho ridotto l’esempio per semplicità ma è molto articolato e richiama
anche degli helper, qualche idea per come evitare di duplicare il codice
e sfruttare quello dell’applicativo?


#2

Ho risolto in questo modo:

il codice della vista print.pdf.prawn l’ho spostato dentro una nuova
classe all’interno di lib:

#lib\generate_pdf.rb
class GeneratePdf
def self.print(pdf, *instance_object)
bla bla bla …
end
end

e l’ho sostituito richiamando il metodo della nuova classe:

#view\print.pdf.prawn
require “generate_pdf”
GeneratePdf.print(pdf, @merge, @company, @sign)

ho preferito spostare l’helper usato dentro la nuova classe altrimenti
bastava aggiungere il riferimento

e così in rake mi è bastato usare:

require “generate_pdf”
Prawn::Document.generate(File.join(DATA_DIRECTORY,"#{letter.id.to_s}_#{letter.name}.pdf"),
:top_margin => 75) do |pdf|
GeneratePdf.print(pdf, merge, company, sign)
end # prawn

Ora sto cercando di creare il pdf in realtime ma asincrono con
l’applicativo, con una sorta di accodamento dei processi, usando un
daemon che controlla ogni minuto.