2011-09-21 19 views
28

He buscado en Internet, pero no encuentro la manera de mostrar un PDF en rieles (solo puedo encontrar información sobre cómo crear uno).¿Cómo visualizo un PDF en ROR (Ruby)?

¿Alguien sabe qué código/gema necesito para mostrar uno?

+0

Usar [gamba] (https://github.com/sandal/prawn) es una especie de estándar de facto. – lucapette

Respuesta

47

En su controlador:

def pdf 
    pdf_filename = File.join(Rails.root, "tmp/my_document.pdf") 
    send_file(pdf_filename, :filename => "your_document.pdf", :type => "application/pdf") 
end 

En config/environment/production.rb:

config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache 

o

config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx 

se requiere la modificación de configuración, ya que permite al servidor web para enviar el archivo direc desde el disco, lo que da un buen aumento de rendimiento.

actualización

Si desea mostrar que en lugar de descargarlo, utilice la opción :disposition de send_file:

send_file(pdf_filename, :filename => "your_document.pdf", :disposition => 'inline', :type => "application/pdf") 

Si desea mostrarlo en línea, this question será mucho más completa que alguna vez podría ser

+0

Hola, esto es genial. En términos de enviar un pdf al usuario. ¿Pero qué hay de mostrarlo en el sitio web, antes de enviarlo? :) – Doomsknight

+5

Actualizado mi respuesta. –

+0

Parece que mi respuesta no le satisface, ¿podría decirme por qué? –

1
def pdf 
    pdf_content = ...# create the pdf 
    send_data(pdf_content, :filename => "test.pdf", :type => "application/pdf") 
end 
+0

hola, esto parece prometedor, pero qué pasa si solo quiero cargar y mostrar desde un archivo. Es decir. No tengo una variable pdf_content. – Doomsknight

+0

En ese caso, eche un vistazo a la solución de Benoit. – Matt

3

Dependiendo de dónde provenga el PDF, lo siguiente puede ayudarlo. Tengo una aplicación donde almaceno muchas cosas, y algunas tienen archivos PDF (adicionales) conectados a los artículos. Guardo los artículos en el directorio /public/res/<item_id>/. res significa resultado y item_id es la identificación numérica de ese elemento en Rails.

En la vista, I proporcionar un enlace a los archivos PDF por el siguiente código (pseudo-) como un método de ayuda, que puede ser utilizado en la vista:

def file_link(key, name = nil) 
    res= Ressource.find(:first, :conditions => ["key = ?", key]) 
    list = Dir["public/res/#{res.id}/*"] 
    file= list.empty? ? "" : list[0] 
    return file if file.empty? 
    fn = name ? name : File.basename(file) 
    link_to fn, "/res/#{res.id}/#{File.basename(file)}", :popup => true 
end 

La parte relevante aquí es la link_to name, "/res/#{res.id}/#{File.basename(file)}" cosa.

+0

Dos cosas a tener en cuenta acerca de su solución: 1/solo puede mostrar los archivos que están en la carpeta 'public'. 2/No puede cambiar el nombre del archivo en el cuadro de diálogo de guardar navegador. –

+0

Eso es cierto, pero a veces suficiente. Es una solución simple, lo sé :-) – mliebelt

+1

Tiene toda la razón, solo quería señalar las restricciones que pueden (o no ;-)) ser decisivas. –

2

Esto puede ser demasiado simple, pero tuve problemas para encontrar una respuesta simple a mi problema, así que lo estoy publicando aquí. Realmente no quería agregar otra acción a mi controlador solo para descargar un archivo estático.

Acabo de subir mi archivo a S3 & link_to utilizado para referirme a la ruta, que S3 proporciona después de cargar el archivo y establecer los permisos (recuerde, todos tienen que poder cargarlo y descargarlo). Guardo muchos datos para la aplicación en S3, así que me pareció una buena elección.

<%= link_to "speaker registration form", "https://s3.amazonaws.com/gws_documents/speaker_registration.pdf" %> 
4

Básicamente solo tiene que escribirlo en el html en su vista. Por lo que esta solución simple que funcionó para mí:

En el 'show.hmtl.erb'

<iframe src=<%= @certificate.certificate_pdf %> width="600" height="780" style="border: none;"> </iframe> 

sólo poner la ubicación del archivo de rubí incrustado como la fuente de la etiqueta iframe trabajó para mí después de horas y horas de búsqueda. 'certificado' es mi modelo, y 'certificate_pdf' es mi archivo adjunto.

Cuestiones relacionadas