Подтвердить что ты не робот

Как отобразить PDF файл в ROR (Ruby)?

Я посмотрел в Интернете, но, похоже, не смог найти, как отображать PDF файл в рельсах (я могу найти информацию только о том, как его создать).

Кто-нибудь знает, какой код/​​драгоценный камень мне нужно отобразить?

4b9b3361

Ответ 1

В вашем контроллере:

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

В config/environment/production.rb:

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

или

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

Требуется модификация конфигурации, поскольку она позволяет веб-серверу отправлять файл непосредственно с диска, что дает хороший прирост производительности.

Обновление

Если вы хотите отобразить его, а не загружать его, используйте параметр :disposition send_file:

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

Если вы хотите отобразить его inline, этот вопрос будет намного более полным, чем я когда-либо мог бы быть.

Ответ 2

В основном вам просто нужно написать его в html в своем представлении. Итак, это простое решение для меня:

В 'show.hmtl.erb'

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

просто поместить местоположение файла во встроенный рубин, поскольку источник тега iframe работал у меня после нескольких часов и часов поиска. "сертификат" - моя модель, а "certificate_pdf" - это файл вложения.

Ответ 3

В зависимости от того, откуда приходит PDF-документ, вам может помочь следующее. У меня есть приложение, в котором я храню много вещей, а некоторые из них имеют (дополнительные) PDF файлы, связанные с элементами. Я храню элементы в каталоге /public/res/<item_id>/. res означает результат, а item_id - это числовой идентификатор этого элемента в Rails.

В представлении я предоставляю ссылку на PDF файлы следующим (псевдо) кодом в качестве вспомогательного метода, который может использоваться в представлении:

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

Соответствующая часть здесь - это link_to name, "/res/#{res.id}/#{File.basename(file)}".

Ответ 4

Это может быть слишком просто, но мне не удалось найти простой ответ на мою проблему, поэтому я размещаю его здесь. Я действительно не хотел добавлять к моему контроллеру еще одно действие только для загрузки статического файла.

Я только что загрузил свой файл на S3 и использовал ссылку_, ссылаясь на путь, который S3 предоставляет после загрузки файла и установки разрешений (помните, каждый должен иметь возможность загружать и загружать его). Я храню много данных для приложения на S3, поэтому он выглядел как прекрасный выбор.

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

Ответ 5

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