byCoder
byCoder

Reputation: 9184

Rails render array to pdf with prawn

I need to render my @manufacturers array to pdf, but do it only via click on some link in view... Now i have such code

def index
    @manufacturers = Manufacturer.all


    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @manufacturers }
      format.pdf { render :layout => false }
    end
  end

I see a lot of examples in web, but i didn't found clear and actual example... Just how simple do in a4 pdf table with my array @manufacturers ?

Upvotes: 0

Views: 1608

Answers (2)

Seamus Abshere
Seamus Abshere

Reputation: 8516

[Note: the Report gem currently only generates on letter-size paper, patch for A4 would be welcome!]

You can use the Report gem, which generates PDF using Prawn but also XLSX and CSV.

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

require 'report'
class ManufacturerReport < Report
  table 'Manufacturers' do
    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

When you call report.pdf.path, a PDF is generating in the tmp directory:

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

You can do it in your controller like:

@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

End result:

PDF

the pdf

XLSX

the xlsx

Note that the XLSX has an autofilter added for you automatically.

Upvotes: 0

jboursiquot
jboursiquot

Reputation: 1271

In addition to prawn, use the prawnto rails plugin to help with rendering the PDF as a template.

See https://github.com/prior/prawnto for the plugin and http://railscasts.com/episodes/153-pdfs-with-prawn for how to use it.

Upvotes: 1

Related Questions