Forum: Italian Ruby user group Creare pdf batch con prawn

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Eff93e9bbe063b7136c9b6f218071a09?d=identicon&s=25 Marco Mastrodonato (marcomd)
on 2009-05-13 09:57
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?
Eff93e9bbe063b7136c9b6f218071a09?d=identicon&s=25 Marco Mastrodonato (marcomd)
on 2009-05-14 17:26
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 topic is locked and can not be replied to.