Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 有没有一种方法可以让resque作业将生成的pdf直接推送到浏览器?_Ruby On Rails_Ruby_Pdf_Prawn_Faye - Fatal编程技术网

Ruby on rails 有没有一种方法可以让resque作业将生成的pdf直接推送到浏览器?

Ruby on rails 有没有一种方法可以让resque作业将生成的pdf直接推送到浏览器?,ruby-on-rails,ruby,pdf,prawn,faye,Ruby On Rails,Ruby,Pdf,Prawn,Faye,我需要一个系统,其中PDF是动态、异步生成的,并直接推送到浏览器,没有可用的磁盘存储。让resque使用prawn似乎很容易,只需将数据发送到浏览器,而无需先将其存储在某个位置,我在网上找不到任何东西。我考虑过Faye,但Faye能处理将PDF推送到浏览器中的问题吗?我以前在.net中做过这件事,在.net中,我将iframe的src属性设置为返回流的服务。该服务还将http头翻转为内联内容,以便浏览器不会尝试下载它,而是尝试内联呈现它。如果你尝试这样做,如果浏览器没有pdf插件(现代的插件肯定

我需要一个系统,其中PDF是动态、异步生成的,并直接推送到浏览器,没有可用的磁盘存储。让resque使用prawn似乎很容易,只需将数据发送到浏览器,而无需先将其存储在某个位置,我在网上找不到任何东西。我考虑过Faye,但Faye能处理将PDF推送到浏览器中的问题吗?

我以前在.net中做过这件事,在.net中,我将iframe的src属性设置为返回流的服务。该服务还将http头翻转为内联内容,以便浏览器不会尝试下载它,而是尝试内联呈现它。如果你尝试这样做,如果浏览器没有pdf插件(现代的插件肯定会有,但你总是有那个家伙在使用IE6),它就不会起作用。我对ruby一窍不通,但我认为你应该可以做类似的事情,或者至少是页面上的一个iframe,其目标是以其他内容编写的服务。

我以前在.net中做过这项工作,其中iframe的src属性设置为返回流的服务。该服务还将http头翻转为内联内容,以便浏览器不会尝试下载它,而是尝试内联呈现它。如果你尝试这样做,如果浏览器没有pdf插件(必须是现代的插件,但你总是让那个家伙使用IE6),它就不会工作。我一点儿都不知道ruby,但我认为你应该能够做类似的事情,或者至少在页面上有一个iframe,目标是用其他东西编写的服务。

u可以使用“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
def generate_pdf(模板,选项={})
html=呈现字符串(模板:布局=>false)
kit=PDFKit.new(html,:orientation=>“横向”)
kit.stylesheets“内联”)
结束
u可以使用“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
def generate_pdf(模板,选项={})
html=呈现字符串(模板:布局=>false)
kit=PDFKit.new(html,:orientation=>“横向”)
kit.stylesheets“内联”)
结束

这些PDF有多大?您的数据库有BLOB列(如果您没有存储,那么您没有使用SQLite…),您可以将生成的PDF存储在其中

或者,您可以将生成的PDF存储在Redis DB中。或者将其保存在S3中


另一方面,浏览器会时不时地(使用ajax)轮询PDF文件是否完整,一旦准备好,它就会下载并向用户显示这些PDF文件。

这些PDF文件有多大?您的数据库有BLOB列(如果您没有存储,那么您没有使用SQLite…),您可以将生成的PDF存储在其中

或者,您可以将生成的PDF存储在Redis DB中。或者将其保存在S3中


另一方面,浏览器会时不时地轮询(使用ajax)以了解PDF是否完整,一旦准备好,它就会下载并向用户显示。

这并不能解决问题,生成这些PDF可能需要20-30分钟。我不能让Unicorn保持一个开放的HTTP连接那么长时间,它需要作为后台工作完成,然后在完成后流式传输给用户。我甚至不允许临时存储这些文件。在我看来,我在沟通这个问题时一定非常糟糕。我已经在使用救援,我在使用对虾。。。这不是问题所在。问题是,一旦我在resque中制作了pdf,如何将其返回到浏览器?如前所述,我无法存储PDF,它必须始终保留在内存中!这是一个硬性要求,客户端不会让步。1)如果生成您的pdf文件需要很多时间,最好在后台生成它(这样服务器就不会超时)。因此“延迟工作”。2) 您不希望保存pdf,但希望在生成pdf时通知用户它已准备好下载。因此,“发送数据(kit.to_pdf,:filename=>'latest.pdf',:type=>'application/pdf',:disposition=>'inline')”。它会给用户一个弹出窗口,询问他是否要加载它(弹出窗口也取决于浏览器设置)。你无法将pdf保存在内存中,因为如果它超出内存,it应用程序可能会出现故障。这并不能解决问题,这些pdf可能需要20-30分钟才能生成。我不能让Unicorn保持一个开放的HTTP连接那么长时间,它需要作为后台工作完成,然后在完成后流式传输给用户。我甚至不允许临时存储这些文件。在我看来,我在沟通这个问题时一定非常糟糕。我已经在使用救援,我在使用对虾。。。这不是问题所在。问题是,一旦我在resque中制作了pdf,如何将其返回到浏览器?如前所述,我无法存储PDF,它必须始终保留在内存中!这是一个硬性要求,客户端不会让步。1)如果生成您的pdf文件需要很多时间,最好在后台生成它(这样服务器就不会超时)。因此“延迟工作”。2) 您不希望保存pdf,但希望在生成pdf时通知用户它已准备好下载。因此,“发送数据(kit.to_pdf,:filename=>'latest.pdf',:type=>'application/pdf',:disposition=>'inline')”。它会给用户一个弹出窗口,询问他是否要加载它(弹出窗口也取决于浏览器设置)。你不能将pdf保存在内存中,因为如果它超出内存,it应用程序可能会出现故障。但这就是问题。。。我在谷歌上找不到如何用ajax轮询resque工作。这不是单个PDF的大小,而是我们没有空间为每个用户存储一个。。。我们有很多用户。我想做的是通过类似Faye的东西发送PDF,但我在Faye中找不到任何东西表明它可以处理PDF。Redis可以将文件存储为临时缓存吗?我听说Redis不适合大数据。但这就是问题所在。。。我能