Есть ли способ заставить задание на восстановление отправить сгенерированный PDF-файл прямо в браузер?

Мне нужна система, в которой PDF-файл генерируется динамически, асинхронно и напрямую передается в браузер. Дисковое хранилище недоступно. Приступить к использованию креветок, похоже, легко: нужно взять эти данные и отправить их в браузер, не сохраняя их где-то в первую очередь. Я ничего не могу найти в Интернете. Я думал о Фэй, но может ли Фэй отправить PDF-файл в браузер?

3 ответа

Вы можете использовать "PDFkit" для этого. пример кода

def some_action
  ...
  respond_to do |format|
    format.html
    format.pdf do
      generate_pdf(file.html.haml, :css => [array of css file names that need to be added])
    end
  end
end

в контроллере приложения -

def generate_pdf(template, options={})
  html = render_to_string(template, :layout => false)
  kit = PDFKit.new(html, :orientation => 'Landscape')
  kit.stylesheets << "#{Rails.root}/app/assets/stylesheets/default_css1.css"
  kit.stylesheets << "#{Rails.root}/app/assets/stylesheets/default_css2.css"

  # Add CSS
  if options[:css]
    options[:css].each do |css|
      kit.stylesheets << "#{Rails.root}/app/assets/stylesheets/#{css}.css"
    end
  end

  send_data(kit.to_pdf, :filename => 'latest.pdf', :type => 'application/pdf', :disposition => 'inline')
end

Насколько велики эти PDF-файлы? В вашей базе данных есть столбцы BLOB (если у вас нет хранилища, вы не используете SQLite...), и вы можете сохранить полученный PDF-файл в нем.

Или вы можете сохранить полученный PDF в Redis DB. Или сохраните его в S3.

С другой стороны, браузер будет время от времени опрашивать (с помощью ajax), чтобы узнать, завершен ли PDF, и как только он будет готов, он загрузит его и покажет пользователю.

Я делал это раньше в.net, где у меня есть атрибут src iframe, установленный на сервис, который возвращает поток. Сервис также переворачивает заголовок http на content-inline, чтобы браузер не пытался загрузить его, а вместо этого попытался сделать его встроенным. Если вы попытаетесь это сделать, это не сработает, если в браузере нет плагина pdf (должны быть у современных, но у вас всегда есть этот парень, использующий IE6). Я не знаю, что такое ruby, но думаю, что вы сможете сделать что-то подобное, или, по крайней мере, но iframe на странице, которая предназначена для службы, написанной в другом месте.

Другие вопросы по тегам