代码之家  ›  专栏  ›  技术社区  ›  svilenv

从Rails 3生成pdf-选择什么工具?

  •  11
  • svilenv  · 技术社区  · 14 年前

    我需要能够从 项目。我以前从未在ruby/rails中使用过PDF生成技术,所以我研究了一些流行的方法,比如 大虾 ,但到目前为止,我发现的所有示例和文章似乎都已经过时,只适用于rails 2.x。我还没有看到一个可以工作的Rails3示例;尝试安装prawn和prawnto gems并复制 this Railscasts episode 对虾 在Rails3中不再为它们工作了,我不想再跟踪代码了。

    非常感谢!

    5 回复  |  直到 14 年前
        1
  •  11
  •   Thilo    13 年前

    一个老问题的新答案,以防其他人无意中发现:WickedPDF(它使用wkhtmltopdf就像PDFkit一样)让这个问题变得简单。

    https://github.com/mileszs/wicked_pdf

        2
  •  11
  •   edgerunner    13 年前

    Prawn 确实适用于Rails 3。我个人使用它没有问题。你必须得到最新版本的宝石 prawnto rails插件。

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

        3
  •  7
  •   John Topley    14 年前

    你见过吗 PDFkit ? 我很确定这可以与Rails 3一起工作,它是一个框架中间件,可以将任何HTML页面转换为PDF,匹配以.PDF结尾的路由

        5
  •  1
  •   Seamus Abshere    11 年前

    你可以使用 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

    the xlsx

    请注意,XLSX自动添加了一个自动过滤器。