2012-03-12 7 views
9

Attualmente stiamo lavorando su un'applicazione Rails ospitata su Heroku. Stiamo cercando di generare un PDF e di inviarlo all'utente per il download.Utilizzo di Prawn on Heroku

Usiamo Prawn per gestire la generazione di PDF.

Il nostro codice per la generazione del formato PDF è attualmente:

Prawn::Document.generate @name[0]+ ".pdf" do 

seguito da tutti del nostro codice per generare il documento. Sfortunatamente, questo salva il documento sul disco che non è possibile (per quanto ne so io) per le applicazioni ospitate su Heroku.

Abbiamo poi spingerlo verso l'utente che usa

send_file "#{Rails.root}/"[email protected][0]+ ".pdf", :type => 
'application/pdf',:filename => @name[0]+ ".pdf" 

C'è un modo utilizzando Prawn per spingere direttamente il download del documento per l'utente senza salvare il documento su disco prima? In caso contrario, ci sono altre gemme per generare PDF che non richiedono il salvataggio del file sul disco prima di inviare il file?

risposta

7

Su Aspen/Bamboo, è possibile salvare il file su disco nella directory tmp/ nella directory dell'applicazione (possibilmente Rails.root.join("tmp")) o in qualsiasi sottodirectory.

Su Cedar, è possibile salvare il file su disco in qualsiasi punto della directory dell'applicazione, ma è comunque necessario scegliere una sottodirectory della directory dell'applicazione tmp/.

In entrambi i casi, i file salvati sono effimeri. Non sono condivisi tra due istanze in esecuzione della tua applicazione; non sono tenuti tra riavvii; ecc. Non fare affidamento sul salvataggio del file in una richiesta e quindi essere in grado di accedervi in ​​una seconda richiesta.

+0

Vedere l'altro commento sull'utilizzo di prawn senza un nome file da visualizzare in memoria. – kwerle

5

Anche se questo è stato risposto molto tempo fa, posterò per gli altri che potrebbero voler fare questo.

È anche possibile chiamare render senza nome file nell'attuale Prawn v0.13.2. Verrà restituita una stringa, che può essere inviata al cliente con send_data. Il modello è:

pdf = Prawn::Document.new 
# ... calls to build the pdf 
send_data pdf.render, 
      type: 'application/pdf', 
      filename: 'download_filename.pdf', 
      disposition: :inline 

Questo visualizzerà il PDF nel browser. Se si desidera invece che l'utente lo scarichi, omettere , disposition: :inline

Ovviamente si desidera farlo solo se il documento è ragionevolmente corto o il sistema non è molto utilizzato perché consumerà RAM fino al completamento del download dell'utente.

+0

Immagino che una sfida potrebbe essere il limite di 30 secondi imposto da Heroku. Se l'elaborazione dei file impiega più di 30 secondi, c'è una possibilità che l'applicazione fallisca con 500. – tamersalama

+0

@tamersalama Mentre è vero, la soluzione originale dell'OP avrebbe fallito per questo motivo prima di questo perché scrivere e leggere un file è più lento di buffering in memoria. Stavo solo mostrando che è possibile evitare il file i/o. – Gene

+0

d'accordo - stavo solo commentando la tua risposta coz Mi piace :) – tamersalama

Problemi correlati