使用rails中的payday gemfile将报告/发票下载为pdf格式

时间:2014-04-25 05:24:34

标签: ruby-on-rails prawn

我的代码是

class pdfController < ApplicationController
def index
  @posts = Post.all
 respond_to do |format|
  format.html
  format.pdf do
  pdf = Prawn::Document.new
    send_data pdf.render, :filename => "report.pdf", :type => "application/pdf", :disposition => "inline"
   end
  end
 end
end

现在问题是,pdf文件已下载。但我得到一个空文件,该下载文件中没有报告。 代码@posts = Post.all Post是一个表,我可以从Post到下载的pdf文件中获取数据。

1 个答案:

答案 0 :(得分:2)

正如本文所述:http://adamalbrecht.com/2014/01/14/generate-clean-testable-pdf-reports-in-rails-with-prawn/

您可以继承Prawn::Document类,以便轻松配置表格边框颜色和字体大小。

class PdfReport < Prawn::Document

  # Often-Used Constants
  TABLE_ROW_COLORS = ["FFFFFF","DDDDDD"]
  TABLE_FONT_SIZE = 9
  TABLE_BORDER_STYLE = :grid

  def initialize(default_prawn_options={})
    super(default_prawn_options)
    font_size 10
  end

  def header(title=nil)
    text "My Awesome Invoice!!", size: 18, style: :bold, align: :center
    if title
      text title, size: 14, style: :bold_italic, align: :center
    end
  end

  def footer
    # ...
  end

  # ... More helpers
end

现在,通过继承其他课程,上述课程可以在其他地方使用,例如:发布报告,评论报告等。对于您的帖子报告,我们可以这样做:

class PostSummaryReportPdf < PdfReport
  TABLE_WIDTHS = [20, 100, 30, 60]
  TABLE_HEADERS = ["ID", "Name", "Date", "User"]

  def initialize(posts=[])
    super()
    @posts = posts

    header "Posts' Invoice Summary Report"
    display_event_table
    footer
  end

  private

  def display_event_table
    if table_data.empty?
      text "No Events Found"
    else
      table table_data,
      headers: TABLE_HEADERS,
      column_widths: TABLE_WIDTHS,
      row_colors: TABLE_ROW_COLORS,
      font_size: TABLE_FONT_SIZE
    end
  end

  def table_data
    @table_data ||= @posts.map { |p| [p.id, p.name, p.created_at.strftime("%m/%d/%y"), p.created_by.try(:full_name)] }
  end

end

现在一切都准备就绪,可以在控制器中以干燥的方式使用。

class pdfController < ApplicationController
  def index
    @posts = Post.all
    respond_to do |format|
      format.html
      format.pdf do
        pdf = PostSummaryReportPdf.new(@posts)
        send_data pdf.render, :filename => "report.pdf", :type => "application/pdf", :disposition => "inline"
      end
    end
  end
end

我希望有所帮助。