2011-12-28 17 views
11

Rails (3.1.1) 'deki Prawn kitaplığının (v1.0.1rc) en son sürümünde bir pdf dosyası oluşturuyorum ve kodumu çalıştırdığımda PDF'yi uygulamanın köküne oluşturur.PDF için tarayıcınıza PDF dosyası oluşturulamıyor Görüntülenecek Ruby için Rails

Bunu istemiyorum. Çıktının yerel olarak sunucuya kaydedilmeden kullanıcının tarayıcı penceresine çıkarılmasını istiyorum.

Lütfen bunu nasıl başarabileceğimi söyle. İşte benim dosyalar şunlardır:

görüntüleme/foo/show.pdf.erb:

<%= 

require 'prawn' 

pdf = Prawn::Document.new(:page_size => 'LETTER', :page_layout => :landscape, :margin => 50, :top_margin => 20, :bottom_margin => 50) 

..... 

render_file("foo.pdf") 

%> 

kontrolörleri/foo_controller:

class AuditsController < ApplicationController 
    before_filter :authenticate_user! 
    layout 'application' 
    can_edit_on_the_spot 
    respond_to :html, :xml, :js, :pdf 

    def index 
    @audits = Audit.all 
    respond_with @audits 
    end 

    def show 
    @audit = Audit.find(params[:id]) 
    respond_with @audit do |format| 
     format.pdf { render :layour => false } 
    end 
    end 

cevap

19

Gemfile

gem 'prawn' 

/config/initializers/mime_types.rb

Mime::Type.register "application/pdf", :pdf 

AuditsController

def show 
    @audit = Audit.find(params[:id]) 
    respond_to do |format| 
    format.html 
    format.pdf do 
     pdf = Prawn::Document.new 
     pdf.text "This is an audit." 
     # Use whatever prawn methods you need on the pdf object to generate the PDF file right here. 

     send_data pdf.render, type: "application/pdf", disposition: "inline" 
     # send_data renders the pdf on the client side rather than saving it on the server filesystem. 
     # Inline disposition renders it in the browser rather than making it a file download. 
    end 
    end 
end 

Rails 3.1 önce prawnto mücevher kullanmak için kullanılır, ancak bu hack biraz olmadan çalışmaz artık. Bu, doğrudan Prawn'a erişerek PDF nesnesini 3.1'de başlatmak ve görüntülemek için çok daha temiz bir yoldur.

Bu tekniği, Ryan Bates'in Railscasts numaralı telefonundan aldım. O zamandan beri kullanıyordum. Bu belirli bölüm here görüntüleyebilirsiniz. Prawn alt sınıflandırma ve PDF oluşturma kodunu denetleyiciden dışarıya taşıma hakkında daha fazla ayrıntıya giriyor. Ayrıca başlamanıza yardımcı olacak birçok faydalı Karides yöntemini gösterir. Şiddetle tavsiye edilir.

Bölümlerin çoğu ücretsizdir, ancak bu gözden geçirilmiş Prawn bölümü yalnızca ücretli bir abonelikle kullanılabilenlerden biridir. Yine de 9 aylık/aylık bir abonelik, hızlı bir şekilde kendisi için öder.

+0

Teşekkür Vickash: (ihtiyaçlarınız başına değişikliği) outputted dosyayı gönderir

match 'print_ticket', to: 'tickets#print_ticket' 

eylemi rb. Bu kesinlikle işe yaradı ve abonelik noktasına katılıyorum - buna değer! – Betjamin

+0

Bunu dolaylı olarak yapmanın bir yolu var mı? – 0112

1

Müşterinin tarayıcısına bir pdf göndermenin en iyi yolunun indirmeyi bir bağlantıya dönüştürmek olduğunu buluyorum. Çoğu zaman form gönderiminden sonra bir pdf oluşturmanız gerekir, ancak başka bir sayfaya yönlendirmeniz gerekir.

Sen yönlendirmek ve pdf eşzamanlı göndermek, ancak yeniden yönlendirmek ve daha sonra şöyle bir indirme bağlantısını sağlayabilir olamaz:

Önce gemfile için gem 'prawn' ekleyin. Paketi. Ardından aşağıdakileri yapın: özel baskı eylemine

Linki senin görünümünde yolları özel baskı eyleme

<%= link_to 'print ticket', print_ticket_path %> 

rota.

def print_ticket 
    if session[:token] 
     @pdf = generate_pdf(session[:token]) 
     send_data(@pdf, :filename => "output.pdf", :type => "application/pdf") 
    end 
    end 

    private 
    def generate_pdf(token) 
    Prawn::Document.new do 
     formatted_text [ { :text=>"xxx.org", :styles => [:bold], :size => 30 } ] 
     move_down 20 
     text "Please proceed to the following web address:" 
     move_down 20 
     text "http://xxx.org/finder" 
     move_down 20 
     text "and enter this code:" 
     move_down 20 
     formatted_text [ { :text=>token, :styles => [:bold], :size => 20 } ] 
    end.render 
    end 
İlgili konular