Creare pdf batch con prawn

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?

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.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs