2011-12-28 9 views
11

Estoy creando un archivo pdf en la última versión de la biblioteca de langostino (v1.0.1rc) en Rails (3.1.1) y cuando ejecuto mi código, genera el PDF en la raíz de la aplicación.No se puede procesar el PDF al navegador utilizando Prawn PDF para Ruby on Rails

No quiero esto. Quiero que muestre el resultado en la ventana del navegador del usuario, sin guardarlo localmente en el servidor.

Por favor dígame cómo puedo lograr esto. Aquí están mis archivos:

vistas/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") 

%> 

controladores/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 

Respuesta

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 

Solía ​​usar la gema prawnto antes de carriles 3.1, pero no funciona sin un poco de piratería nunca más. Esta es una forma mucho más limpia de crear instancias y visualizar el objeto PDF en 3.1 accediendo a Prawn directamente.

Obtuve esta técnica directamente de uno de Ryan Bates 'Railscasts. Estado usándolo desde entonces. Puede ver ese episodio específico here. Entra en más detalles sobre la subclasificación de gambas y cómo mover el código de generación de PDF fuera del controlador. También muestra muchos métodos útiles de gambas para que comiences. Muy recomendable.

Muchos de los episodios son gratuitos, pero ese episodio revisado de gambas es uno de esos que solo están disponibles con una suscripción paga. Sin embargo, a $ 9 por mes, una suscripción se amortiza rápidamente.

+0

Gracias Vickash. Eso ciertamente funcionó y estoy de acuerdo con el punto de suscripción, ¡vale la pena! – Betjamin

+0

¿Hay alguna manera de hacer esto implícitamente? – 0112

1

Encuentro que la mejor manera de enviar un pdf al navegador del cliente es poner la descarga en un enlace. A menudo necesita generar un pdf después del envío del formulario, pero también debe redirigirlo a otra página.

No se puede redirigir y enviar el pdf al mismo tiempo, pero puede redirigir y luego proporcionar un enlace de descarga, así:

primero Añadir gem 'prawn' a su Gemfile. Haz. A continuación, haga lo siguiente:

Enlace a su acción de impresión especial en su vista

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

ruta a la acción de impresión especial en rutas.rb

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

acción que envía el archivo resultante (modificar según sus necesidades):

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 
Cuestiones relacionadas