wicked_pdf 1.0.3 → 2.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. checksums.yaml +5 -5
  2. data/.github/issue_template.md +15 -0
  3. data/.github/workflows/ci.yml +56 -0
  4. data/.rubocop.yml +60 -0
  5. data/.rubocop_todo.yml +84 -37
  6. data/CHANGELOG.md +230 -0
  7. data/README.md +188 -30
  8. data/Rakefile +13 -9
  9. data/gemfiles/5.0.gemfile +8 -0
  10. data/gemfiles/5.1.gemfile +8 -0
  11. data/gemfiles/5.2.gemfile +9 -0
  12. data/gemfiles/6.0.gemfile +10 -0
  13. data/gemfiles/6.1.gemfile +12 -0
  14. data/gemfiles/7.0.gemfile +12 -0
  15. data/generators/wicked_pdf/templates/wicked_pdf.rb +9 -0
  16. data/lib/generators/wicked_pdf_generator.rb +5 -9
  17. data/lib/wicked_pdf/binary.rb +65 -0
  18. data/lib/wicked_pdf/middleware.rb +3 -3
  19. data/lib/wicked_pdf/option_parser.rb +229 -0
  20. data/lib/wicked_pdf/pdf_helper.rb +101 -88
  21. data/lib/wicked_pdf/progress.rb +33 -0
  22. data/lib/wicked_pdf/railtie.rb +6 -33
  23. data/lib/wicked_pdf/tempfile.rb +38 -7
  24. data/lib/wicked_pdf/version.rb +1 -1
  25. data/lib/wicked_pdf/wicked_pdf_helper/assets.rb +212 -88
  26. data/lib/wicked_pdf/wicked_pdf_helper.rb +29 -26
  27. data/lib/wicked_pdf.rb +37 -274
  28. data/test/fixtures/database.yml +4 -0
  29. data/test/fixtures/manifest.js +3 -0
  30. data/test/fixtures/wicked.js +1 -0
  31. data/test/functional/pdf_helper_test.rb +74 -5
  32. data/test/functional/wicked_pdf_helper_assets_test.rb +86 -25
  33. data/test/functional/wicked_pdf_helper_test.rb +15 -13
  34. data/test/test_helper.rb +22 -7
  35. data/test/unit/wicked_pdf_binary_test.rb +26 -0
  36. data/test/unit/wicked_pdf_option_parser_test.rb +128 -0
  37. data/test/unit/wicked_pdf_test.rb +14 -168
  38. data/test/unit/wkhtmltopdf_location_test.rb +48 -0
  39. data/wicked_pdf.gemspec +20 -14
  40. metadata +69 -38
  41. data/.travis.yml +0 -57
  42. data/CHANGLOG.md +0 -48
  43. data/gemfiles/2.3.gemfile +0 -10
  44. data/gemfiles/3.0.gemfile +0 -7
  45. data/gemfiles/3.1.gemfile +0 -8
  46. data/gemfiles/3.2.gemfile +0 -7
  47. data/gemfiles/4.0.gemfile +0 -6
  48. data/gemfiles/4.1.gemfile +0 -6
  49. data/gemfiles/4.2.gemfile +0 -6
  50. data/gemfiles/rails_edge.gemfile +0 -6
@@ -0,0 +1,229 @@
1
+ class WickedPdf
2
+ class OptionParser
3
+ BINARY_VERSION_WITHOUT_DASHES = Gem::Version.new('0.12.0')
4
+
5
+ attr_reader :binary_version
6
+
7
+ def initialize(binary_version = WickedPdf::DEFAULT_BINARY_VERSION)
8
+ @binary_version = binary_version
9
+ end
10
+
11
+ def parse(options)
12
+ [
13
+ parse_extra(options),
14
+ parse_others(options),
15
+ parse_global(options),
16
+ parse_outline(options.delete(:outline)),
17
+ parse_header_footer(:header => options.delete(:header),
18
+ :footer => options.delete(:footer),
19
+ :layout => options[:layout]),
20
+ parse_cover(options.delete(:cover)),
21
+ parse_toc(options.delete(:toc)),
22
+ parse_basic_auth(options)
23
+ ].flatten
24
+ end
25
+
26
+ def valid_option(name)
27
+ if binary_version < BINARY_VERSION_WITHOUT_DASHES
28
+ "--#{name}"
29
+ else
30
+ name
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def parse_extra(options)
37
+ return [] if options[:extra].nil?
38
+ return options[:extra].split if options[:extra].respond_to?(:split)
39
+
40
+ options[:extra]
41
+ end
42
+
43
+ def parse_basic_auth(options)
44
+ if options[:basic_auth]
45
+ user, passwd = Base64.decode64(options[:basic_auth]).split(':')
46
+ ['--username', user, '--password', passwd]
47
+ else
48
+ []
49
+ end
50
+ end
51
+
52
+ def parse_header_footer(options)
53
+ r = []
54
+ unless options.blank?
55
+ %i[header footer].collect do |hf|
56
+ next if options[hf].blank?
57
+
58
+ opt_hf = options[hf]
59
+ r += make_options(opt_hf, %i[center font_name left right], hf.to_s)
60
+ r += make_options(opt_hf, %i[font_size spacing], hf.to_s, :numeric)
61
+ r += make_options(opt_hf, [:line], hf.to_s, :boolean)
62
+ if options[hf] && options[hf][:content]
63
+ @hf_tempfiles = [] unless defined?(@hf_tempfiles)
64
+ @hf_tempfiles.push(tf = WickedPdf::Tempfile.new("wicked_#{hf}_pdf.html"))
65
+ tf.write options[hf][:content]
66
+ tf.flush
67
+ options[hf][:html] = {}
68
+ options[hf][:html][:url] = "file:///#{tf.path}"
69
+ end
70
+ unless opt_hf[:html].blank?
71
+ r += make_option("#{hf}-html", opt_hf[:html][:url]) unless opt_hf[:html][:url].blank?
72
+ end
73
+ end
74
+ end
75
+ r
76
+ end
77
+
78
+ def parse_cover(argument)
79
+ arg = argument.to_s
80
+ return [] if arg.blank?
81
+
82
+ # Filesystem path or URL - hand off to wkhtmltopdf
83
+ if argument.is_a?(Pathname) || (arg[0, 4] == 'http')
84
+ [valid_option('cover'), arg]
85
+ else # HTML content
86
+ @hf_tempfiles ||= []
87
+ @hf_tempfiles << tf = WickedPdf::Tempfile.new('wicked_cover_pdf.html')
88
+ tf.write arg
89
+ tf.flush
90
+ [valid_option('cover'), tf.path]
91
+ end
92
+ end
93
+
94
+ def parse_toc(options)
95
+ return [] if options.nil?
96
+
97
+ r = [valid_option('toc')]
98
+ unless options.blank?
99
+ r += make_options(options, %i[font_name header_text], 'toc')
100
+ r += make_options(options, [:xsl_style_sheet])
101
+ r += make_options(options, %i[depth
102
+ header_fs
103
+ text_size_shrink
104
+ l1_font_size
105
+ l2_font_size
106
+ l3_font_size
107
+ l4_font_size
108
+ l5_font_size
109
+ l6_font_size
110
+ l7_font_size
111
+ level_indentation
112
+ l1_indentation
113
+ l2_indentation
114
+ l3_indentation
115
+ l4_indentation
116
+ l5_indentation
117
+ l6_indentation
118
+ l7_indentation], 'toc', :numeric)
119
+ r += make_options(options, %i[no_dots
120
+ disable_links
121
+ disable_back_links], 'toc', :boolean)
122
+ r += make_options(options, %i[disable_dotted_lines
123
+ disable_toc_links], nil, :boolean)
124
+ end
125
+ r
126
+ end
127
+
128
+ def parse_outline(options)
129
+ r = []
130
+ unless options.blank?
131
+ r = make_options(options, [:outline], '', :boolean)
132
+ r += make_options(options, [:outline_depth], '', :numeric)
133
+ end
134
+ r
135
+ end
136
+
137
+ def parse_margins(options)
138
+ make_options(options, %i[top bottom left right], 'margin', :numeric)
139
+ end
140
+
141
+ def parse_global(options)
142
+ r = []
143
+ unless options.blank?
144
+ r += make_options(options, %i[orientation
145
+ dpi
146
+ page_size
147
+ page_width
148
+ title
149
+ log_level])
150
+ r += make_options(options, %i[lowquality
151
+ grayscale
152
+ no_pdf_compression
153
+ quiet], '', :boolean)
154
+ r += make_options(options, %i[image_dpi
155
+ image_quality
156
+ page_height], '', :numeric)
157
+ r += parse_margins(options.delete(:margin))
158
+ end
159
+ r
160
+ end
161
+
162
+ def parse_others(options)
163
+ r = []
164
+ unless options.blank?
165
+ r += make_options(options, %i[proxy
166
+ username
167
+ password
168
+ encoding
169
+ user_style_sheet
170
+ viewport_size
171
+ window_status])
172
+ r += make_options(options, %i[cookie
173
+ post], '', :name_value)
174
+ r += make_options(options, %i[redirect_delay
175
+ zoom
176
+ page_offset
177
+ javascript_delay], '', :numeric)
178
+ r += make_options(options, %i[book
179
+ default_header
180
+ disable_javascript
181
+ enable_plugins
182
+ disable_internal_links
183
+ disable_external_links
184
+ keep_relative_links
185
+ print_media_type
186
+ disable_local_file_access
187
+ enable_local_file_access
188
+ disable_smart_shrinking
189
+ use_xserver
190
+ no_background
191
+ images
192
+ no_images
193
+ no_stop_slow_scripts], '', :boolean)
194
+ end
195
+ r
196
+ end
197
+
198
+ def make_options(options, names, prefix = '', type = :string)
199
+ return [] if options.nil?
200
+
201
+ names.collect do |o|
202
+ if options[o].blank?
203
+ []
204
+ else
205
+ make_option("#{prefix.blank? ? '' : prefix + '-'}#{o}",
206
+ options[o],
207
+ type)
208
+ end
209
+ end
210
+ end
211
+
212
+ def make_option(name, value, type = :string)
213
+ return value.collect { |v| make_option(name, v, type) } if value.is_a?(Array)
214
+
215
+ if type == :name_value
216
+ parts = value.to_s.split(' ')
217
+ ["--#{name.tr('_', '-')}", *parts]
218
+ elsif type == :boolean
219
+ if value
220
+ ["--#{name.tr('_', '-')}"]
221
+ else
222
+ []
223
+ end
224
+ else
225
+ ["--#{name.tr('_', '-')}", value.to_s]
226
+ end
227
+ end
228
+ end
229
+ end
@@ -1,115 +1,128 @@
1
- module PdfHelper
2
- require 'wicked_pdf'
3
- require 'tempfile'
4
-
5
- def self.included(base)
6
- # Protect from trying to augment modules that appear
7
- # as the result of adding other gems.
8
- return if base != ActionController::Base
9
-
10
- base.class_eval do
11
- alias_method_chain :render, :wicked_pdf
12
- alias_method_chain :render_to_string, :wicked_pdf
13
- after_filter :clean_temp_files
1
+ class WickedPdf
2
+ module PdfHelper
3
+ def self.prepended(base)
4
+ # Protect from trying to augment modules that appear
5
+ # as the result of adding other gems.
6
+ return if base != ActionController::Base
7
+
8
+ base.class_eval do
9
+ after_action :clean_temp_files
10
+ end
11
+ end
12
+
13
+ def render(*args)
14
+ options = args.first
15
+ if options.is_a?(Hash) && options.key?(:pdf)
16
+ render_with_wicked_pdf(options)
17
+ else
18
+ super
19
+ end
20
+ end
21
+
22
+ def render_to_string(*args)
23
+ options = args.first
24
+ if options.is_a?(Hash) && options.key?(:pdf)
25
+ render_to_string_with_wicked_pdf(options)
26
+ else
27
+ super
28
+ end
14
29
  end
15
- end
16
30
 
17
- def render_with_wicked_pdf(options = nil, *args, &block)
18
- if options.is_a?(Hash) && options.key?(:pdf)
19
- log_pdf_creation
31
+ def render_with_wicked_pdf(options)
32
+ raise ArgumentError, 'missing keyword: pdf' unless options.is_a?(Hash) && options.key?(:pdf)
33
+
20
34
  options[:basic_auth] = set_basic_auth(options)
21
35
  make_and_send_pdf(options.delete(:pdf), (WickedPdf.config || {}).merge(options))
22
- else
23
- render_without_wicked_pdf(options, *args, &block)
24
36
  end
25
- end
26
37
 
27
- def render_to_string_with_wicked_pdf(options = nil, *args, &block)
28
- if options.is_a?(Hash) && options.key?(:pdf)
29
- log_pdf_creation
38
+ def render_to_string_with_wicked_pdf(options)
39
+ raise ArgumentError, 'missing keyword: pdf' unless options.is_a?(Hash) && options.key?(:pdf)
40
+
30
41
  options[:basic_auth] = set_basic_auth(options)
31
42
  options.delete :pdf
32
43
  make_pdf((WickedPdf.config || {}).merge(options))
33
- else
34
- render_to_string_without_wicked_pdf(options, *args, &block)
35
44
  end
36
- end
37
45
 
38
- private
46
+ private
39
47
 
40
- def log_pdf_creation
41
- logger.info '*' * 15 + 'WICKED' + '*' * 15 unless logger.nil?
42
- end
48
+ def set_basic_auth(options = {})
49
+ options[:basic_auth] ||= WickedPdf.config.fetch(:basic_auth) { false }
50
+ return unless options[:basic_auth] && request.env['HTTP_AUTHORIZATION']
43
51
 
44
- def set_basic_auth(options = {})
45
- options[:basic_auth] ||= WickedPdf.config.fetch(:basic_auth) { false }
46
- return unless options[:basic_auth] && request.env['HTTP_AUTHORIZATION']
47
- request.env['HTTP_AUTHORIZATION'].split(' ').last
48
- end
52
+ request.env['HTTP_AUTHORIZATION'].split(' ').last
53
+ end
49
54
 
50
- def clean_temp_files
51
- return unless defined?(@hf_tempfiles)
52
- @hf_tempfiles.each(&:close!)
53
- end
55
+ def clean_temp_files
56
+ return unless defined?(@hf_tempfiles)
54
57
 
55
- def make_pdf(options = {})
56
- render_opts = {
57
- :template => options[:template],
58
- :layout => options[:layout],
59
- :formats => options[:formats],
60
- :handlers => options[:handlers]
61
- }
62
- render_opts.merge!(:locals => options[:locals]) if options[:locals]
63
- render_opts.merge!(:file => options[:file]) if options[:file]
64
- html_string = render_to_string(render_opts)
65
- options = prerender_header_and_footer(options)
66
- w = WickedPdf.new(options[:wkhtmltopdf])
67
- w.pdf_from_string(html_string, options)
68
- end
58
+ @hf_tempfiles.each(&:close)
59
+ end
69
60
 
70
- def make_and_send_pdf(pdf_name, options = {})
71
- options[:wkhtmltopdf] ||= nil
72
- options[:layout] ||= false
73
- options[:template] ||= File.join(controller_path, action_name)
74
- options[:disposition] ||= 'inline'
75
- if options[:show_as_html]
61
+ def make_pdf(options = {})
76
62
  render_opts = {
77
63
  :template => options[:template],
78
64
  :layout => options[:layout],
79
65
  :formats => options[:formats],
80
66
  :handlers => options[:handlers],
81
- :content_type => 'text/html'
67
+ :assigns => options[:assigns]
82
68
  }
83
- render_opts.merge!(:locals => options[:locals]) if options[:locals]
84
- render_opts.merge!(:file => options[:file]) if options[:file]
85
- render(render_opts)
86
- else
87
- pdf_content = make_pdf(options)
88
- File.open(options[:save_to_file], 'wb') { |file| file << pdf_content } if options[:save_to_file]
89
- send_data(pdf_content, :filename => pdf_name + '.pdf', :type => 'application/pdf', :disposition => options[:disposition]) unless options[:save_only]
69
+ render_opts[:inline] = options[:inline] if options[:inline]
70
+ render_opts[:locals] = options[:locals] if options[:locals]
71
+ render_opts[:file] = options[:file] if options[:file]
72
+ html_string = render_to_string(render_opts)
73
+ options = prerender_header_and_footer(options)
74
+ w = WickedPdf.new(options[:wkhtmltopdf])
75
+ w.pdf_from_string(html_string, options)
90
76
  end
91
- end
92
77
 
93
- # Given an options hash, prerenders content for the header and footer sections
94
- # to temp files and return a new options hash including the URLs to these files.
95
- def prerender_header_and_footer(options)
96
- [:header, :footer].each do |hf|
97
- next unless options[hf] && options[hf][:html] && options[hf][:html][:template]
98
- @hf_tempfiles = [] unless defined?(@hf_tempfiles)
99
- @hf_tempfiles.push(tf = WickedPdfTempfile.new("wicked_#{hf}_pdf.html"))
100
- options[hf][:html][:layout] ||= options[:layout]
101
- render_opts = {
102
- :template => options[hf][:html][:template],
103
- :layout => options[hf][:html][:layout],
104
- :formats => options[hf][:html][:formats],
105
- :handlers => options[hf][:html][:handlers]
106
- }
107
- render_opts.merge!(:locals => options[hf][:html][:locals]) if options[hf][:html][:locals]
108
- render_opts.merge!(:file => options[hf][:html][:file]) if options[:file]
109
- tf.write render_to_string(render_opts)
110
- tf.flush
111
- options[hf][:html][:url] = "file:///#{tf.path}"
78
+ def make_and_send_pdf(pdf_name, options = {})
79
+ options[:wkhtmltopdf] ||= nil
80
+ options[:layout] ||= false
81
+ options[:template] ||= File.join(controller_path, action_name)
82
+ options[:disposition] ||= 'inline'
83
+ if options[:show_as_html]
84
+ render_opts = {
85
+ :template => options[:template],
86
+ :layout => options[:layout],
87
+ :formats => options[:formats],
88
+ :handlers => options[:handlers],
89
+ :assigns => options[:assigns],
90
+ :content_type => 'text/html'
91
+ }
92
+ render_opts[:inline] = options[:inline] if options[:inline]
93
+ render_opts[:locals] = options[:locals] if options[:locals]
94
+ render_opts[:file] = options[:file] if options[:file]
95
+ render(render_opts)
96
+ else
97
+ pdf_content = make_pdf(options)
98
+ File.open(options[:save_to_file], 'wb') { |file| file << pdf_content } if options[:save_to_file]
99
+ send_data(pdf_content, :filename => pdf_name + '.pdf', :type => 'application/pdf', :disposition => options[:disposition]) unless options[:save_only]
100
+ end
101
+ end
102
+
103
+ # Given an options hash, prerenders content for the header and footer sections
104
+ # to temp files and return a new options hash including the URLs to these files.
105
+ def prerender_header_and_footer(options)
106
+ %i[header footer].each do |hf|
107
+ next unless options[hf] && options[hf][:html] && options[hf][:html][:template]
108
+
109
+ @hf_tempfiles = [] unless defined?(@hf_tempfiles)
110
+ @hf_tempfiles.push(tf = WickedPdf::Tempfile.new("wicked_#{hf}_pdf.html"))
111
+ options[hf][:html][:layout] ||= options[:layout]
112
+ render_opts = {
113
+ :template => options[hf][:html][:template],
114
+ :layout => options[hf][:html][:layout],
115
+ :formats => options[hf][:html][:formats],
116
+ :handlers => options[hf][:html][:handlers],
117
+ :assigns => options[hf][:html][:assigns]
118
+ }
119
+ render_opts[:locals] = options[hf][:html][:locals] if options[hf][:html][:locals]
120
+ render_opts[:file] = options[hf][:html][:file] if options[:file]
121
+ tf.write render_to_string(render_opts)
122
+ tf.flush
123
+ options[hf][:html][:url] = "file:///#{tf.path}"
124
+ end
125
+ options
112
126
  end
113
- options
114
127
  end
115
128
  end
@@ -0,0 +1,33 @@
1
+ class WickedPdf
2
+ module Progress
3
+ require 'pty' if RbConfig::CONFIG['target_os'] !~ /mswin|mingw/ # no support for windows
4
+ require 'English'
5
+
6
+ def track_progress?(options)
7
+ options[:progress] && !on_windows?
8
+ end
9
+
10
+ def invoke_with_progress(command, options)
11
+ output = []
12
+ begin
13
+ PTY.spawn(command.join(' ')) do |stdout, _stdin, pid|
14
+ begin
15
+ stdout.sync
16
+ stdout.each_line("\r") do |line|
17
+ output << line.chomp
18
+ options[:progress].call(line) if options[:progress]
19
+ end
20
+ rescue Errno::EIO # rubocop:disable Lint/HandleExceptions
21
+ # child process is terminated, this is expected behaviour
22
+ ensure
23
+ ::Process.wait pid
24
+ end
25
+ end
26
+ rescue PTY::ChildExited
27
+ puts 'The child process exited!'
28
+ end
29
+ err = output.join('\n')
30
+ raise "#{command} failed (exitstatus 0). Output was: #{err}" unless $CHILD_STATUS && $CHILD_STATUS.exitstatus.zero?
31
+ end
32
+ end
33
+ end
@@ -2,43 +2,16 @@ require 'wicked_pdf/pdf_helper'
2
2
  require 'wicked_pdf/wicked_pdf_helper'
3
3
  require 'wicked_pdf/wicked_pdf_helper/assets'
4
4
 
5
- if defined?(Rails)
6
-
7
- if Rails::VERSION::MAJOR == 3
8
-
5
+ class WickedPdf
6
+ if defined?(Rails.env)
9
7
  class WickedRailtie < Rails::Railtie
10
- initializer 'wicked_pdf.register' do |_app|
11
- ActionController::Base.send :include, PdfHelper
12
- if Rails::VERSION::MINOR > 0 && Rails.configuration.assets.enabled
13
- ActionView::Base.send :include, WickedPdfHelper::Assets
14
- else
15
- ActionView::Base.send :include, WickedPdfHelper
16
- end
8
+ initializer 'wicked_pdf.register', :after => 'remotipart.controller_helper' do |_app|
9
+ ActiveSupport.on_load(:action_controller) { ActionController::Base.send :prepend, PdfHelper }
10
+ ActiveSupport.on_load(:action_view) { include WickedPdfHelper::Assets }
17
11
  end
18
12
  end
19
13
 
20
- elsif Rails::VERSION::MAJOR == 2
21
-
22
- unless ActionController::Base.instance_methods.include? 'render_with_wicked_pdf'
23
- ActionController::Base.send :include, PdfHelper
24
- end
25
- unless ActionView::Base.instance_methods.include? 'wicked_pdf_stylesheet_link_tag'
26
- ActionView::Base.send :include, WickedPdfHelper
27
- end
28
-
29
- else
30
-
31
- class WickedRailtie < Rails::Railtie
32
- initializer 'wicked_pdf.register' do |_app|
33
- ActionController::Base.send :include, PdfHelper
34
- ActionView::Base.send :include, WickedPdfHelper::Assets
35
- end
36
- end
14
+ Mime::Type.register('application/pdf', :pdf) if Mime::Type.lookup_by_extension(:pdf).nil?
37
15
 
38
16
  end
39
-
40
- if Mime::Type.lookup_by_extension(:pdf).nil?
41
- Mime::Type.register('application/pdf', :pdf)
42
- end
43
-
44
17
  end
@@ -1,11 +1,42 @@
1
1
  require 'tempfile'
2
2
 
3
- class WickedPdfTempfile < Tempfile
4
- # ensures the Tempfile's filename always keeps its extension
5
- def initialize(filename, temp_dir = nil)
6
- temp_dir ||= Dir.tmpdir
7
- extension = File.extname(filename)
8
- basename = File.basename(filename, extension)
9
- super([basename, extension], temp_dir)
3
+ class WickedPdf
4
+ class Tempfile < ::Tempfile
5
+ def initialize(filename, temp_dir = nil)
6
+ temp_dir ||= Dir.tmpdir
7
+ extension = File.extname(filename)
8
+ basename = File.basename(filename, extension)
9
+ super([basename, extension], temp_dir)
10
+ end
11
+
12
+ def write_in_chunks(input_string)
13
+ binmode
14
+ string_io = StringIO.new(input_string)
15
+ write(string_io.read(chunk_size)) until string_io.eof?
16
+ close
17
+ self
18
+ rescue Errno::EINVAL => e
19
+ raise e, file_too_large_message
20
+ end
21
+
22
+ def read_in_chunks
23
+ rewind
24
+ binmode
25
+ output_string = ''
26
+ output_string << read(chunk_size) until eof?
27
+ output_string
28
+ rescue Errno::EINVAL => e
29
+ raise e, file_too_large_message
30
+ end
31
+
32
+ private
33
+
34
+ def chunk_size
35
+ 1024 * 1024
36
+ end
37
+
38
+ def file_too_large_message
39
+ 'The HTML file is too large! Try reducing the size or using the return_file option instead.'
40
+ end
10
41
  end
11
42
  end
@@ -1,3 +1,3 @@
1
1
  class WickedPdf
2
- VERSION = '1.0.3'
2
+ VERSION = '2.6.3'.freeze
3
3
  end