pelargir / railspdf

Adds pdf-writer support to Rails. The original project is outdated. This fork supports 2.3.2 and adds a few other goodies.

This URL has Read+Write access

railspdf / lib / railspdf.rb
100644 60 lines (47 sloc) 2.171 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
require 'pdf/writer'
require 'pdf/simpletable'
 
module RailsPDF
  
  #this code comes from http://wiki.rubyonrails.com/rails/pages/HowtoGeneratePDFs
class PDFRender < ActionView::Base
   include ApplicationHelper
 
   def initialize(action_view)
     @action_view = action_view
   prefix = action_view.controller.class.to_s.gsub(/Controller/, '')
        self.class.send(:include, "#{prefix}Helper".constantize)
   end
 
  
    def render(template, local_assigns = {})
    
     #get the instance variables setup
    @action_view.controller.instance_variables.each do |v|
        instance_variable_set(v, @action_view.controller.instance_variable_get(v))
      end
 
#keep ie happy
if @action_view.controller.request.env['HTTP_USER_AGENT'] =~ /msie/i
         @action_view.controller.headers['Pragma'] ||= ''
         @action_view.controller.headers['Cache-Control'] ||= ''
    else
         @action_view.controller.headers['Pragma'] ||= 'no-cache'
         @action_view.controller.headers['Cache-Control'] ||= 'no-cache, must-revalidate'
    end
   
   
    @action_view.controller.headers["Content-Type"] ||= 'application/pdf'
if @rails_pdf_name
@action_view.controller.headers["Content-Disposition"] ||= 'attachment; filename="' + @rails_pdf_name + '"'
elsif @rails_pdf_inline
#set no headers
else #rails_pdf_inline was set to false. set filename = controller name
#since we weren't provided a custom name
@action_view.controller.headers["Content-Disposition"] ||= 'attachment; filename="' + @action_view.controller.controller_name + '.pdf' + '"'
end
      
      if @landscape
      pdf = PDF::Writer.new( :paper => (@paper || 'A4'), :orientation => :landscape )
      else
      pdf = PDF::Writer.new( :paper => (@paper || 'A4') )
      end
  pdf.compressed = true if RAILS_ENV != 'development'
 
eval template.source, nil, "#{@action_view.base_path}/#{@action_view.first_render}.#{@action_view.finder.pick_template_extension(@action_view.first_render)}"
    pdf.render
   end
  
   def compilable?
      false
    end
  end
end