# Creare pdf batch con prawn

**URL:** <https://www.ruby-forum.com/t/creare-pdf-batch-con-prawn/167850>\
**Category:** IT\
**Created:** [May 13, 2009, 9:57am UTC](https://www.ruby-forum.com/t/creare-pdf-batch-con-prawn/167850 "2009-05-13T09:57:04Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [May 13, 2009, 9:57am UTC](https://www.ruby-forum.com/t/creare-pdf-batch-con-prawn/167850/1 "2009-05-13T09:57:04Z")

</div>

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](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?

---

<div class="post-metadata">

**Author:** ![triplem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b19c9b/32.png) [@triplem](https://www.ruby-forum.com/u/triplem)\
**Post date:** [May 14, 2009, 5:26pm UTC](https://www.ruby-forum.com/t/creare-pdf-batch-con-prawn/167850/2 "2009-05-14T17:26:57Z")

</div>

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.
