从Rails 3生成pdf - 可以选择哪种工具?

时间:2010-11-07 13:21:21

标签: ruby-on-rails pdf ruby-on-rails-3 pdf-generation prawn

我需要能够从 Rails 3 项目中将一些视图呈现为PDF。我之前从未使用过ruby / rails的PDF生成技术,因此我研究了一些流行的方法,如 Prawn PDF :: Writer ,但所有的例子和文章我发现到目前为止似乎已过时,仅适用于rails 2.x.我还没有看到一个有效的Rails3示例;我尝试自己安装虾和prawnto宝石并复制this Railscasts episode中描述的例子,但是我收到了prawnto方法无法识别的错误。我不确定这是一个实现错误还是只是一个不兼容的迹象,但看到其他人在网上分享 prawn 在Rails3中不再为他们工作我没有费心追踪代码进一步。

是否有人在Rails3中找到了可靠的pdf生成解决方案?您可以分享它或指向外部资源和文档吗? 非常感谢!

5 个答案:

答案 0 :(得分:11)

Prawn适用于Rails 3.我亲自使用它没有任何问题。您必须获取gem的最新版本gem prawnto插件。

PDFkit确实具有使用Webkit呈现引擎的优势,因此您可以使用CSS来定义布局,并且可以通过Safari和Chrome免费获得匹配的网页。它的学习曲线比Prawn略好。

答案 1 :(得分:11)

对旧问题的新答案,以防其他人偶然发现:WickedPDF(使用像PDFkit一样使用wkhtmltopdf)使这一点变得轻而易举。

https://github.com/mileszs/wicked_pdf

答案 2 :(得分:7)

你见过PDFkit吗?我很确定它适用于Rails 3,它是一个Rack中间件,可以将任何HTML页面转换为PDF格式,以匹配以.pdf结尾的路径

答案 3 :(得分:2)

关于大虾,这里是Rails 3的无缝集成,似乎工作得很好:https://github.com/Whoops/prawn-rails

答案 4 :(得分:1)

您可以使用Report gem,它会生成PDF,但也会生成XLSX和CSV。

# a fake Manufacturer class - you probably have an ActiveRecord model
Manufacturer = Struct.new(:name, :gsa)

require 'report'
class ManufacturerReport < Report
  table 'Manufacturers' do # you can have multiple tables, which translate into multiple sheets in XLSX
    head do
      row 'Manufacturer report'
    end
    body do
      rows :manufacturers
      column 'Name', :name
      column 'GSA?', :gsa
    end
  end
  # you would want this so that you can pass in an array
  # attr_reader :manufacturers
  # def initialize(manufacturers)
  #   @manufacturers = manufacturers
  # end
  def manufacturers
    [
      Manufacturer.new('Ford', true),
      Manufacturer.new('Fischer', false),
      Manufacturer.new('Tesla', nil),
    ]
  end
end

当您致电report.pdf.path时,会在tmp目录中生成PDF:

report = ManufacturerReport.new
puts report.pdf.path #=> /tmp/185051406_Report__Pdf.pdf
puts report.xlsx.path #=> /tmp/185050541_Report__Xlsx.xlsx

您可以在控制器中执行以下操作:

@manufacturers = Manufacturer.all
respond_to do |format|
  format.html # index.html.erb
  format.json { render json: @manufacturers }
  format.pdf do
    report = ManufacturerReport.new(@manufacturers) # using the commented-out code
    send_file report.pdf.path, :type => 'application/pdf', :disposition => 'attachment', :filename => 'ManufacturersReport.pdf'
    # tmp files are periodically cleaned up by the operating system, but if you want to be extra clean you can call
    # report.cleanup
    # but this may remove the tmp files before apache/nginx/etc. finishes delivering the file
  end
end

最终结果:

PDF

the pdf

XLSX

the xlsx

请注意,XLSX会自动为您添加自动过滤器。