wicked_pdf 0.10.2 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 41040ae8bc94e95e177f1b1a4c84232e45b5eb6b
4
- data.tar.gz: 04a72a2aabb318708b6e3c691e349df3524160a9
3
+ metadata.gz: 54d0ec248323c907fe336b0dea9afff757737f6d
4
+ data.tar.gz: 35626a59f71132ef14fb866f453e23998e1c1982
5
5
  SHA512:
6
- metadata.gz: ba7dded6264c5122179c27ca5195cf32836beefbe5768bf2471884281b4f524fece1d128cb6a72c991176c7525ae7ed4e6eada261d5f5b20634f5f05ec3708d3
7
- data.tar.gz: 90a90533caf7543c88f4b444da0fb2b4c8d7bdd33ea26f7bae134785cc079b6b6c8157bc13aebb52df70c1da6c0d1a8e3f32ce4d128cf22a9b9163c120cad6ae
6
+ metadata.gz: 41d0c2d5e21c6b1086c425e0e4ebe65f09421694f054435b0d97d9d10622dd493a6dc89c606bbbe6afe9a6261a7639d1545efeb7a0faae1d157518c8e6654886
7
+ data.tar.gz: 38cf8a6e92c561713effa3e3f28259a19b8252f9d9810b46f9ee6c31801f895ffbe229748ad10dc81bd215c2db79b78aba8896fbdb81a735d0813c30d83ac077
data/README.md CHANGED
@@ -30,7 +30,7 @@ Note that versions before 0.9.0 [have problems](http://code.google.com/p/wkhtmlt
30
30
  This plugin relies on streams to communicate with wkhtmltopdf.
31
31
 
32
32
  For more information about wkhtmltopdf, see the project's [homepage](http://code.google.com/p/wkhtmltopdf/) and
33
- [github repo](https://github.com/antialize/wkhtmltopdf). There's also some documentation for a recent, stable version
33
+ [github repo](https://github.com/antialize/wkhtmltopdf). There's also some documentation for a recent, stable version
34
34
  on the author's website, [here](http://madalgo.au.dk/~jakobt/wkhtmltoxdoc/wkhtmltopdf-0.9.9-doc.html).
35
35
 
36
36
  Next:
@@ -43,7 +43,7 @@ or add this to your Gemfile:
43
43
  ```ruby
44
44
  gem 'wicked_pdf'
45
45
  ```
46
-
46
+
47
47
  You may also need to add
48
48
  ```ruby
49
49
  Mime::Type.register "application/pdf", :pdf
@@ -111,12 +111,12 @@ class ThingsController < ApplicationController
111
111
  format.html
112
112
  format.pdf do
113
113
  render :pdf => 'file_name',
114
- :disposition => 'attachment', # default 'inline'
114
+ :disposition => 'attachment', # default 'inline'
115
115
  :template => 'things/show.pdf.erb',
116
116
  :file => "#{Rails.root}/files/foo.erb"
117
117
  :layout => 'pdf.html', # use 'pdf.html' for a pdf.html.erb file
118
118
  :wkhtmltopdf => '/usr/local/bin/wkhtmltopdf', # path to binary
119
- :show_as_html => params[:debug].present?, # allow debuging based on url param
119
+ :show_as_html => params[:debug].present?, # allow debugging based on url param
120
120
  :orientation => 'Landscape', # default Portrait
121
121
  :page_size => 'A4, Letter, ...', # default A4
122
122
  :save_to_file => Rails.root.join('pdfs', "#{filename}.pdf"),
@@ -149,6 +149,7 @@ class ThingsController < ApplicationController
149
149
  :disable_smart_shrinking => true,
150
150
  :use_xserver => true,
151
151
  :no_background => true,
152
+ :viewport_size => 'TEXT' # available only with use_xserver or patched QT
152
153
  :extra => '' # directly inserted into the command to wkhtmltopdf
153
154
  :margin => {:top => SIZE, # default 10 (mm)
154
155
  :bottom => SIZE,
@@ -215,6 +216,10 @@ If you need to just create a pdf and not display it:
215
216
  # create a pdf from a string
216
217
  pdf = WickedPdf.new.pdf_from_string('<h1>Hello There!</h1>')
217
218
 
219
+ # create a pdf file from a html file without converting it to string
220
+ # Path must be absolute path
221
+ pdf = WickedPdf.new.pdf_from_html_file('/your/absolute/path/here')
222
+
218
223
  # create a pdf from string using templates, layouts and content option for header or footer
219
224
  WickedPdf.new.pdf_from_string(
220
225
  render_to_string('templates/pdf.html.erb', :layout => 'pdfs/layout_pdf'),
@@ -222,10 +227,10 @@ WickedPdf.new.pdf_from_string(
222
227
  :content => render_to_string(:layout => 'pdfs/layout_pdf')
223
228
  }
224
229
  )
225
-
230
+
226
231
  # or from your controller, using views & templates and all wicked_pdf options as normal
227
232
  pdf = render_to_string :pdf => "some_file_name"
228
-
233
+
229
234
  # then save to a file
230
235
  save_path = Rails.root.join('pdfs','filename.pdf')
231
236
  File.open(save_path, 'wb') do |file|
@@ -37,7 +37,7 @@ class WickedPdf
37
37
  def initialize(wkhtmltopdf_binary_path = nil)
38
38
  @exe_path = wkhtmltopdf_binary_path || find_wkhtmltopdf_binary_path
39
39
  raise "Location of #{EXE_NAME} unknown" if @exe_path.empty?
40
- raise "Bad #{EXE_NAME}'s path" unless File.exists?(@exe_path)
40
+ raise "Bad #{EXE_NAME}'s path: #{@exe_path}" unless File.exists?(@exe_path)
41
41
  raise "#{EXE_NAME} is not executable" unless File.executable?(@exe_path)
42
42
 
43
43
  @binary_version = DEFAULT_BINARY_VERSION
@@ -51,20 +51,22 @@ class WickedPdf
51
51
  end
52
52
  end
53
53
 
54
- def pdf_from_string(string, options={})
54
+ def pdf_from_html_file(filepath, options={})
55
55
  if WickedPdf.config[:retreive_version]
56
56
  retreive_binary_version
57
57
  end
58
58
 
59
59
  temp_path = options.delete(:temp_path)
60
- string_file = WickedPdfTempfile.new("wicked_pdf.html", temp_path)
61
- string_file.binmode
62
- string_file.write(string)
63
- string_file.close
64
60
  generated_pdf_file = WickedPdfTempfile.new("wicked_pdf_generated_file.pdf", temp_path)
65
- command = "\"#{@exe_path}\" #{'-q ' unless on_windows?}#{parse_options(options)} \"file:///#{string_file.path}\" \"#{generated_pdf_file.path}\" " # -q for no errors on stdout
66
- print_command(command) if in_development_mode?
67
- err = Open3.popen3(command) do |stdin, stdout, stderr|
61
+ command = [@exe_path]
62
+ command << '-q' unless on_windows? # suppress errors on stdout
63
+ command += parse_options(options)
64
+ command << "file://#{filepath}"
65
+ command << generated_pdf_file.path.to_s
66
+
67
+ print_command(command.inspect) if in_development_mode?
68
+
69
+ err = Open3.popen3(*command) do |stdin, stdout, stderr|
68
70
  stderr.read
69
71
  end
70
72
  if return_file = options.delete(:return_file)
@@ -78,10 +80,24 @@ class WickedPdf
78
80
  rescue Exception => e
79
81
  raise "Failed to execute:\n#{command}\nError: #{e}"
80
82
  ensure
81
- string_file.close! if string_file
82
83
  generated_pdf_file.close! if generated_pdf_file && !return_file
83
84
  end
84
85
 
86
+ def pdf_from_string(string, options={})
87
+ temp_path = options.delete(:temp_path)
88
+ string_file = WickedPdfTempfile.new("wicked_pdf.html", temp_path)
89
+ string_file.binmode
90
+ string_file.write(string)
91
+ string_file.close
92
+
93
+ pdf = pdf_from_html_file(string_file.path, options)
94
+ pdf
95
+ rescue Exception => e
96
+ raise "Error: #{e}"
97
+ ensure
98
+ string_file.close! if string_file
99
+ end
100
+
85
101
  private
86
102
 
87
103
  def in_development_mode?
@@ -122,40 +138,50 @@ class WickedPdf
122
138
  parse_margins(options.delete(:margin)),
123
139
  parse_others(options),
124
140
  parse_basic_auth(options)
125
- ].join(' ')
141
+ ].flatten
126
142
  end
127
143
 
128
144
  def parse_extra(options)
129
- options[:extra].nil? ? '' : options[:extra]
145
+ return [] if options[:extra].nil?
146
+ return options[:extra].split if options[:extra].respond_to?(:split)
147
+ return options[:extra]
130
148
  end
131
149
 
132
150
  def parse_basic_auth(options)
133
151
  if options[:basic_auth]
134
152
  user, passwd = Base64.decode64(options[:basic_auth]).split(":")
135
- "--username '#{user}' --password '#{passwd}'"
153
+ ["--username", user, "--password", passwd]
136
154
  else
137
- ""
155
+ []
138
156
  end
139
157
  end
140
158
 
141
159
  def make_option(name, value, type=:string)
142
160
  if value.is_a?(Array)
143
- return value.collect { |v| make_option(name, v, type) }.join('')
161
+ return value.collect { |v| make_option(name, v, type) }
162
+ end
163
+ if type == :boolean
164
+ ["--#{name.gsub('_', '-')}"]
165
+ else
166
+ ["--#{name.gsub('_', '-')}", value.to_s]
144
167
  end
145
- "--#{name.gsub('_', '-')} " + case type
146
- when :boolean then ""
147
- when :numeric then value.to_s
148
- when :name_value then value.to_s
149
- else "\"#{value}\""
150
- end + " "
151
168
  end
152
169
 
153
170
  def make_options(options, names, prefix="", type=:string)
154
- names.collect {|o| make_option("#{prefix.blank? ? "" : prefix + "-"}#{o.to_s}", options[o], type) unless options[o].blank?}.join
171
+ return [] if options.nil?
172
+ names.collect do |o|
173
+ if options[o].blank?
174
+ []
175
+ else
176
+ make_option("#{prefix.blank? ? "" : prefix + "-"}#{o.to_s}",
177
+ options[o],
178
+ type)
179
+ end
180
+ end
155
181
  end
156
182
 
157
183
  def parse_header_footer(options)
158
- r=""
184
+ r=[]
159
185
  [:header, :footer].collect do |hf|
160
186
  unless options[hf].blank?
161
187
  opt_hf = options[hf]
@@ -181,22 +207,22 @@ class WickedPdf
181
207
 
182
208
  def parse_cover(argument)
183
209
  arg = argument.to_s
184
- return '' if arg.blank?
185
- r = '--cover '
210
+ return [] if arg.blank?
186
211
  # Filesystem path or URL - hand off to wkhtmltopdf
187
212
  if argument.is_a?(Pathname) || (arg[0,4] == 'http')
188
- r + arg
213
+ ['--cover', arg]
189
214
  else # HTML content
190
215
  @hf_tempfiles ||= []
191
216
  @hf_tempfiles << tf=WickedPdfTempfile.new("wicked_cover_pdf.html")
192
217
  tf.write arg
193
218
  tf.flush
194
- r + tf.path
219
+ ['--cover', tf.path]
195
220
  end
196
221
  end
197
222
 
198
223
  def parse_toc(options)
199
- r = '--toc ' unless options.nil?
224
+ return [] if options.nil?
225
+ r = ['--toc']
200
226
  unless options.blank?
201
227
  r += make_options(options, [ :font_name, :header_text], "toc")
202
228
  r +=make_options(options, [ :depth,
@@ -223,19 +249,22 @@ class WickedPdf
223
249
  end
224
250
 
225
251
  def parse_outline(options)
252
+ r = []
226
253
  unless options.blank?
227
254
  r = make_options(options, [:outline], "", :boolean)
228
255
  r +=make_options(options, [:outline_depth], "", :numeric)
229
256
  end
257
+ r
230
258
  end
231
259
 
232
260
  def parse_margins(options)
233
- make_options(options, [:top, :bottom, :left, :right], "margin", :numeric) unless options.blank?
261
+ make_options(options, [:top, :bottom, :left, :right], "margin", :numeric)
234
262
  end
235
263
 
236
264
  def parse_others(options)
265
+ r = []
237
266
  unless options.blank?
238
- r = make_options(options, [ :orientation,
267
+ r += make_options(options, [ :orientation,
239
268
  :page_size,
240
269
  :page_width,
241
270
  :page_height,
@@ -244,7 +273,8 @@ class WickedPdf
244
273
  :password,
245
274
  :dpi,
246
275
  :encoding,
247
- :user_style_sheet])
276
+ :user_style_sheet,
277
+ :viewport_size])
248
278
  r +=make_options(options, [ :cookie,
249
279
  :post], "", :name_value)
250
280
  r +=make_options(options, [ :redirect_delay,
@@ -266,6 +296,7 @@ class WickedPdf
266
296
  :no_background], "", :boolean)
267
297
  r +=make_options(options, [ :no_stop_slow_scripts ], "", nil)
268
298
  end
299
+ r
269
300
  end
270
301
 
271
302
  def find_wkhtmltopdf_binary_path
@@ -1,3 +1,3 @@
1
1
  class WickedPdf
2
- VERSION = '0.10.2'
2
+ VERSION = '0.11.0'
3
3
  end
@@ -3,10 +3,12 @@ require 'test_helper'
3
3
  WickedPdf.config = { :exe_path => ENV['WKHTMLTOPDF_BIN'] || '/usr/local/bin/wkhtmltopdf' }
4
4
  HTML_DOCUMENT = "<html><body>Hello World</body></html>"
5
5
 
6
- # Provide a public accessor to the normally-private parse_options function
6
+ # Provide a public accessor to the normally-private parse_options function.
7
+ # Also, smash the returned array of options into a single string for
8
+ # convenience in testing below.
7
9
  class WickedPdf
8
10
  def get_parsed_options(opts)
9
- parse_options(opts)
11
+ parse_options(opts).join(' ')
10
12
  end
11
13
  end
12
14
 
@@ -22,7 +24,7 @@ class WickedPdfTest < ActiveSupport::TestCase
22
24
  assert pdf.rstrip.end_with?("%%EOF")
23
25
  assert pdf.length > 100
24
26
  end
25
-
27
+
26
28
  test "should generate PDF from html document with long lines" do
27
29
  wp = WickedPdf.new
28
30
  document_with_long_line_file = File.new("test/fixtures/document_with_long_line.html", "r")
@@ -32,6 +34,15 @@ class WickedPdfTest < ActiveSupport::TestCase
32
34
  assert pdf.length > 100
33
35
  end
34
36
 
37
+ test "should generate PDF from html existing HTML file without converting it to string" do
38
+ wp = WickedPdf.new
39
+ filepath = File.join(Dir.pwd, "test/fixtures/document_with_long_line.html")
40
+ pdf = wp.pdf_from_html_file(filepath)
41
+ assert pdf.start_with?("%PDF-1.4")
42
+ assert pdf.rstrip.end_with?("%%EOF")
43
+ assert pdf.length > 100
44
+ end
45
+
35
46
  test "should raise exception when no path to wkhtmltopdf" do
36
47
  assert_raise RuntimeError do
37
48
  WickedPdf.new " "
@@ -76,7 +87,7 @@ class WickedPdfTest < ActiveSupport::TestCase
76
87
 
77
88
  [:header, :footer].each do |hf|
78
89
  [:center, :font_name, :left, :right].each do |o|
79
- assert_equal "--#{hf.to_s}-#{o.to_s.gsub('_', '-')} \"header_footer\"",
90
+ assert_equal "--#{hf.to_s}-#{o.to_s.gsub('_', '-')} header_footer",
80
91
  wp.get_parsed_options(hf => {o => "header_footer"}).strip
81
92
  end
82
93
 
@@ -87,7 +98,7 @@ class WickedPdfTest < ActiveSupport::TestCase
87
98
 
88
99
  assert_equal "--#{hf.to_s}-line",
89
100
  wp.get_parsed_options(hf => {:line => true}).strip
90
- assert_equal "--#{hf.to_s}-html \"http://www.abc.com\"",
101
+ assert_equal "--#{hf.to_s}-html http://www.abc.com",
91
102
  wp.get_parsed_options(hf => {:html => {:url => 'http://www.abc.com'}}).strip
92
103
  end
93
104
  end
@@ -96,7 +107,7 @@ class WickedPdfTest < ActiveSupport::TestCase
96
107
  wp = WickedPdf.new
97
108
 
98
109
  [:font_name, :header_text].each do |o|
99
- assert_equal "--toc --toc-#{o.to_s.gsub('_', '-')} \"toc\"",
110
+ assert_equal "--toc --toc-#{o.to_s.gsub('_', '-')} toc",
100
111
  wp.get_parsed_options(:toc => {o => "toc"}).strip
101
112
  end
102
113
 
@@ -143,7 +154,7 @@ class WickedPdfTest < ActiveSupport::TestCase
143
154
  [ :orientation, :page_size, :proxy, :username, :password, :dpi,
144
155
  :encoding, :user_style_sheet
145
156
  ].each do |o|
146
- assert_equal "--#{o.to_s.gsub('_', '-')} \"opts\"", wp.get_parsed_options(o => "opts").strip
157
+ assert_equal "--#{o.to_s.gsub('_', '-')} opts", wp.get_parsed_options(o => "opts").strip
147
158
  end
148
159
 
149
160
  [:cookie, :post].each do |o|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wicked_pdf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.2
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miles Z. Sterrett
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-21 00:00:00.000000000 Z
11
+ date: 2014-07-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails