gotenberg-ruby 1.0.0 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ee579fe775ebbac8cc6eef4e931138f9962b8d0401f1e1bc556bcdf81d1c039
4
- data.tar.gz: 8687f9bd12445598334671791e9fbebb50da3f13d4bfabc5be798a9eb89fa3ae
3
+ metadata.gz: 1731138f88801603e7ac087f4ca9c12946d0d78b73655f47b61af96002b43ff4
4
+ data.tar.gz: f11fc54c6125da4e46eb35b8e7110f94f74a8f705f8331cc67aefbbc6aa4c138
5
5
  SHA512:
6
- metadata.gz: 3333fe62ab25ccbe23c9584af9633fb361576e47d97b13f3b43af9378f76fc7431142bb67b53feaf402ff13a7017495445733a68a3bc3dfec5ea5b5d4a6a2b4d
7
- data.tar.gz: ff099effef5eaafe2c1ce89b1a1ca6f935ef44befa19abde53827cd504e5fb6efac7eca43a0e0b906b3a831ee7ed3ade5402b49dcdde4c821f54ad2cfc925190
6
+ metadata.gz: 50b23ee43c4a9b87d704af9e044c14192f0dd2d15ea67048fca0eba328c1f627208ac383cc236e6fbeb1afee95f85998100524e4fa6433c1f54a4c10ce4abb86
7
+ data.tar.gz: d7ce697873e1cff4f3d707eb3973c9829e64cff0f3fedd5e9a2fa362679c3bd949a19907ab481cbbde7a2980a2240f856ca22d7611ca048e9f990e9ee3409ca6
data/README.md CHANGED
@@ -1 +1,443 @@
1
- TODO
1
+ This package is a Ruby client for [Gotenberg](https://gotenberg.dev), a developer-friendly API to interact with powerful
2
+ tools like Chromium and LibreOffice for converting numerous document formats (HTML, Markdown, Word, Excel, etc.) into
3
+ PDF files, and more!
4
+
5
+ ## Requirement
6
+
7
+ This packages requires [Gotenberg](https://gotenberg.dev), a Docker-powered stateless API for PDF files:
8
+
9
+ * 🔥 [Live Demo](https://gotenberg.dev/docs/get-started/live-demo)
10
+ * [Docker](https://gotenberg.dev/docs/get-started/docker)
11
+ * [Docker Compose](https://gotenberg.dev/docs/get-started/docker-compose)
12
+ * [Kubernetes](https://gotenberg.dev/docs/get-started/kubernetes)
13
+ * [Cloud Run](https://gotenberg.dev/docs/get-started/cloud-run)
14
+
15
+ ## Installation
16
+
17
+ ```ruby
18
+ gem "gotenberg-ruby"
19
+ ```
20
+
21
+ ## Usage
22
+
23
+ * [Send a request to the API](#send-a-request-to-the-api)
24
+ * [Chromium](#chromium)
25
+
26
+ ### Send a request to the API
27
+
28
+ After having created the HTTP request (see below), you have two options:
29
+
30
+ 1. Get the response from the API and handle it according to your need.
31
+ 2. Save the resulting file to a given directory.
32
+
33
+ > In the following examples, we assume the Gotenberg API is available at http://localhost:3000.
34
+
35
+ ### Chromium
36
+
37
+ The [Chromium module](https://gotenberg.dev/docs/modules/chromium) interacts with the Chromium browser to convert HTML documents to PDF.
38
+
39
+ #### Convert a target URL to PDF
40
+
41
+ See https://gotenberg.dev/docs/modules/chromium#url.
42
+
43
+ Converting a target URL to PDF is as simple as:
44
+
45
+ ```ruby
46
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
47
+ doc.url 'https://my.url'
48
+ end
49
+ ```
50
+
51
+ #### Usage:
52
+
53
+ ```ruby
54
+ # generate pdf output binary data or raise method exception
55
+ pdf = document.to_binary
56
+
57
+ # safe check if pdf generate is success
58
+ success = document.success?
59
+
60
+ # fetch exception data
61
+ error_message = document.exception.message
62
+
63
+ # save PDF file
64
+ File.open('filename.pdf', 'wb') do |file|
65
+ file << document.to_binary
66
+ end
67
+ ```
68
+
69
+ Available exceptions:
70
+
71
+ ```ruby
72
+ # raise while PDF transform failed
73
+ Gotenberg::TransformError
74
+
75
+ # raise while change PDF metadata failed
76
+ Gotenberg::ModifyMetadataError
77
+
78
+ # raise while loading asset source failed
79
+ Gotenberg::RemoteSourceError
80
+ ```
81
+
82
+ You may inject `<link>` and `<script>` HTML elements thanks to the `extra_link_tags` and `extra_script_tags` arguments:
83
+
84
+ ```ruby
85
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
86
+ doc.url 'https://my.url', ['https://my.css'], ['https://my.js']
87
+ end
88
+ ```
89
+
90
+ Please note that Gotenberg will add the `<link>` and `<script>` elements based on the order of the arguments.
91
+
92
+ #### Rails integrations
93
+
94
+ For rails apps gem provide few helpful helpers for easier access to assets inside your rails app:
95
+
96
+ ```ruby
97
+ # read from assets pipeline or webpacker
98
+ gotenberg_image_tag 'logo.svg'
99
+
100
+ # read from absolute file path (use with carefully for security reasons)
101
+ gotenberg_image_tag 'app/assets/images/logo.svg', absolute_path: true
102
+
103
+ # also you can encode you source as base64 data resource (useful for header and footer)
104
+ gotenberg_image_tag 'app/assets/images/logo.svg', absolute_path: true, inline: true
105
+
106
+ # same methods available for js
107
+ gotenberg_javascript_tag 'application.js', inline: true
108
+
109
+ # ... and css.
110
+ gotenberg_stylesheet_tag 'application.css', inline: true
111
+ ```
112
+
113
+ ⚠️ Warning! Nested resources for CSS is not supported yet.
114
+
115
+ #### Convert an HTML document to PDF
116
+
117
+ See https://gotenberg.dev/docs/modules/chromium#html.
118
+
119
+ Prepare HTML content with build-in Rails methods:
120
+
121
+ ```ruby
122
+ # declare HTML renderer
123
+ renderer = ApplicationController.renderer.new(https: true, http_host: 'localhost:3000')
124
+
125
+ # render HTML string for passing into service
126
+ index_html = renderer.render 'pdf/document', layout: 'pdf', locals: {}
127
+ ```
128
+
129
+ You may convert an HTML document string with:
130
+
131
+ ```ruby
132
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
133
+ doc.html index_html
134
+ end
135
+ ```
136
+
137
+ You may also send additional files, like images, fonts, stylesheets, and so on. The only requirement is that their paths
138
+ in the HTML DOM are on the root level.
139
+
140
+ ```ruby
141
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
142
+ doc.html index_html
143
+ doc.assets ['/path/to/my.css', '/path/to/my.js']
144
+ end
145
+ ```
146
+
147
+ #### Change PDF meta with exiftools
148
+
149
+ If you want to use this feature, you need to install additional package to host system:
150
+
151
+ ```
152
+ sudo apt install exiftool
153
+ ```
154
+
155
+ and now you can change PDF metatags using exiftools:
156
+
157
+ ```ruby
158
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
159
+ doc.html index_html
160
+ doc.meta title: 'Custom PDF title'
161
+ end
162
+ ```
163
+
164
+ Note: for Rails based apps, you can setup <title>Custom PDF title</title> header in index.html and
165
+ it will be automatically added to output PDF.
166
+
167
+ #### Configuration file (optionally)
168
+
169
+ ```ruby
170
+ Gotenberg.configure do |config|
171
+ # activate HTML debug mode
172
+ config.html_debug = false
173
+
174
+ # default temporary directory for output
175
+ config.backtrace_dir = Rails.root.join('tmp', 'gotenberg')
176
+ end
177
+ ```
178
+
179
+ #### Convert one or more markdown files to PDF
180
+
181
+ See https://gotenberg.dev/docs/modules/chromium#markdown.
182
+
183
+ You may convert markdown files with:
184
+
185
+ ```ruby
186
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
187
+ doc.markdown wrapper_html, ['/path/to/file.md']
188
+ end
189
+ ```
190
+
191
+ The first argument is a `Stream` with HTML content, for instance:
192
+
193
+ ```html
194
+ <!doctype html>
195
+ <html lang="en">
196
+ <head>
197
+ <meta charset="utf-8">
198
+ <title>My PDF</title>
199
+ </head>
200
+ <body>
201
+ {{ toHTML "file.md" }}
202
+ </body>
203
+ </html>
204
+ ```
205
+
206
+ Here, there is a Go template function `toHTML`. Gotenberg will use it to convert a markdown file's content to HTML.
207
+
208
+ Like the HTML conversion, you may also send additional files, like images, fonts, stylesheets, and so on. The only
209
+ requirement is that their paths in the HTML DOM are on the root level.
210
+
211
+ ```ruby
212
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
213
+ doc.markdown wrapper_html, ['/path/to/file.md', '/path/to/my2.md']
214
+ doc.assets ['/path/to/my.css', '/path/to/my.js']
215
+ end
216
+ ```
217
+
218
+ #### Paper size
219
+
220
+ You may override the default paper size with:
221
+
222
+ ```ruby
223
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
224
+ doc.html index_html
225
+ doc.paper_size width, height
226
+ end
227
+ ```
228
+
229
+ Examples of paper size (width x height, in inches):
230
+
231
+ * `Letter` - 8.5 x 11 (default)
232
+ * `Legal` - 8.5 x 14
233
+ * `Tabloid` - 11 x 17
234
+ * `Ledger` - 17 x 11
235
+ * `A0` - 33.1 x 46.8
236
+ * `A1` - 23.4 x 33.1
237
+ * `A2` - 16.54 x 23.4
238
+ * `A3` - 11.7 x 16.54
239
+ * `A4` - 8.27 x 11.7
240
+ * `A5` - 5.83 x 8.27
241
+ * `A6` - 4.13 x 5.83
242
+
243
+ #### Margins
244
+
245
+ You may override the default margins (i.e., `0.39`, in inches):
246
+
247
+ ```ruby
248
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
249
+ doc.html index_html
250
+ doc.margins top: 1, bottom: 1, left: 0.39, right: 0.39
251
+ end
252
+ ```
253
+
254
+ #### Prefer CSS page size
255
+
256
+ You may force page size as defined by CSS:
257
+
258
+ ```ruby
259
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
260
+ doc.html index_html
261
+ doc.prefer_css_page_size
262
+ end
263
+ ```
264
+
265
+ #### Print the background graphics
266
+
267
+ ```ruby
268
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
269
+ doc.html index_html
270
+ doc.print_background
271
+ end
272
+ ```
273
+
274
+ #### Landscape orientation
275
+
276
+ You may override the default portrait orientation with:
277
+
278
+ ```ruby
279
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
280
+ doc.html index_html
281
+ doc.landscape
282
+ end
283
+ ```
284
+
285
+ #### Scale
286
+
287
+ You may override the default scale of the page rendering (i.e., `1.0`) with:
288
+
289
+ ```ruby
290
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
291
+ doc.html index_html
292
+ doc.scale 2
293
+ end
294
+ ```
295
+
296
+ #### Page ranges
297
+
298
+ You may set the page ranges to print, e.g., `1-5, 8, 11-13`. Empty means all pages.
299
+
300
+ ```ruby
301
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
302
+ doc.html index_html
303
+ doc.native_page_ranges '1-2'
304
+ end
305
+ ```
306
+
307
+ #### Header and footer
308
+
309
+ You may add a header and/or a footer to each page of the PDF:
310
+
311
+ ```ruby
312
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
313
+ doc.header header_html
314
+ doc.html index_html
315
+ doc.footer footer_html
316
+ doc.margins top: 1, bottom: 1
317
+ end
318
+ ```
319
+
320
+ Each of them has to be a complete HTML document:
321
+
322
+ ```html
323
+ <html>
324
+ <head>
325
+ <style>
326
+ body {
327
+ font-size: 8rem;
328
+ margin: 4rem auto;
329
+ }
330
+ </style>
331
+ </head>
332
+ <body>
333
+ <p><span class="pageNumber"></span> of <span class="totalPages"></span></p>
334
+ </body>
335
+ </html>
336
+ ```
337
+
338
+ The following classes allow you to inject printing values:
339
+
340
+ * `date` - formatted print date.
341
+ * `title` - document title.
342
+ * `url` - document location.
343
+ * `pageNumber` - current page number.
344
+ * `totalPages` - total pages in the document.
345
+
346
+ ⚠️ Make sure that:
347
+
348
+ 1. Margins top and bottom are large enough (i.e., `margins(top: 1, bottom: 1, left: 0.39, right: 0.39)`)
349
+ 2. The font size is big enough.
350
+
351
+ ⚠️ There are some limitations:
352
+
353
+ * No JavaScript.
354
+ * The CSS properties are independent of the ones from the HTML document.
355
+ * The footer CSS properties override the ones from the header;
356
+ * Only fonts installed in the Docker image are loaded - see the [Fonts chapter](https://gotenberg.dev/docs/customize/fonts).
357
+ * Images only work using a base64 encoded source - i.e., `data:image/png;base64, iVBORw0K....`
358
+ * `background-color` and color `CSS` properties require an additional `-webkit-print-color-adjust: exact` CSS property in order to work.
359
+ * Assets are not loaded (i.e., CSS files, scripts, fonts, etc.).
360
+
361
+ #### Wait delay
362
+
363
+ When the page relies on JavaScript for rendering, and you don't have access to the page's code, you may want to wait a
364
+ certain amount of time (i.e., `1s`, `2ms`, etc.) to make sure Chromium has fully rendered the page you're trying to generate.
365
+
366
+ ```ruby
367
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
368
+ doc.html index_html
369
+ doc.wait_delay '3s'
370
+ end
371
+ ```
372
+
373
+ #### Wait for expression
374
+
375
+ You may also wait until a given JavaScript expression returns true:
376
+
377
+ ```ruby
378
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
379
+ doc.html index_html
380
+ doc.wait_for_expression("window.status === 'ready'")
381
+ end
382
+ ```
383
+
384
+ #### User agent
385
+
386
+ You may override the default `User-Agent` header used by Gotenberg:
387
+
388
+ ```ruby
389
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
390
+ doc.html index_html
391
+ doc.user_agent("Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0")
392
+ end
393
+ ```
394
+
395
+ #### Extra HTTP headers
396
+
397
+ You may add HTTP headers that Chromium will send when loading the HTML document:
398
+
399
+ ```ruby
400
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
401
+ doc.url 'https://my.url'
402
+ doc.extra_http_headers [
403
+ 'My-Header-1' => 'My value',
404
+ 'My-Header-2' => 'My value'
405
+ ]
406
+ end
407
+ ```
408
+
409
+ #### Fail on console exceptions
410
+
411
+ You may force Gotenberg to return a `409 Conflict` response if there are exceptions in the Chromium console:
412
+
413
+ ```ruby
414
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
415
+ doc.url 'https://my.url'
416
+ doc.fail_on_console_exceptions
417
+ end
418
+ ```
419
+
420
+ #### Emulate media type
421
+
422
+ Some websites have dedicated CSS rules for print. Using `screen` allows you to force the "standard" CSS rules.
423
+ You may also force the `print` media type:
424
+
425
+ ```ruby
426
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
427
+ doc.url 'https://my.url'
428
+ doc.emulate_media_type 'screen'
429
+ end
430
+ ```
431
+
432
+ #### PDF Format
433
+
434
+ See https://gotenberg.dev/docs/modules/pdf-engines#engines.
435
+
436
+ You may set the PDF format of the resulting PDF with:
437
+
438
+ ```ruby
439
+ document = Gotenberg::Chromium.call(ENV['GOTENBERG_URL']) do |doc|
440
+ doc.url 'https://my.url'
441
+ doc.pdf_format 'PDF/A-1a'
442
+ end
443
+ ```
@@ -1,5 +1,6 @@
1
1
  require 'faraday'
2
2
  require 'base64'
3
+ require 'gotenberg/exceptions'
3
4
 
4
5
  module Gotenberg
5
6
  module Analyzers
@@ -25,7 +26,7 @@ module Gotenberg
25
26
  def remote_source
26
27
  Faraday.get(src).body
27
28
  rescue StandardError => e
28
- raise 'Unable to load remote source. %s' % e.message
29
+ raise RemoteSourceError.new('Unable to load remote source. %s' % e.message)
29
30
  end
30
31
 
31
32
  def local_source
@@ -1,6 +1,5 @@
1
1
  require 'faraday'
2
2
  require 'base64'
3
- require 'uri'
4
3
  require 'gotenberg/analyzers/base'
5
4
 
6
5
  module Gotenberg
@@ -0,0 +1,33 @@
1
+ require 'launchy'
2
+
3
+ module Gotenberg
4
+ class Backtrace
5
+ attr_accessor :files
6
+
7
+ def initialize files
8
+ @files = files
9
+ @backtrace_location = build_backtrace_location
10
+ end
11
+
12
+ def call
13
+ FileUtils.mkdir_p(@backtrace_location)
14
+
15
+ files.each do |file|
16
+ File.open(File.join(@backtrace_location, file.original_filename), 'wb') do |f|
17
+ f << file.io.read
18
+ end
19
+
20
+ file.io.rewind
21
+ end
22
+
23
+ ::Launchy.open(File.join(@backtrace_location, 'index.html'))
24
+ end
25
+
26
+ def build_backtrace_location
27
+ File.join(
28
+ Gotenberg.configuration.backtrace_dir,
29
+ "#{Time.now.to_f.to_s.tr('.', '_')}_#{rand(0x100000000).to_s(36)}"
30
+ )
31
+ end
32
+ end
33
+ end
@@ -10,8 +10,6 @@ module Gotenberg
10
10
  def header header
11
11
  compiler = Compiler.new(header)
12
12
 
13
- #File.open('header.html', 'w') { |f| f.write(compiler.body) }
14
-
15
13
  files << multipart_file(compiler.body, 'header.html', 'text/html')
16
14
  end
17
15
 
@@ -20,8 +18,6 @@ module Gotenberg
20
18
  def footer footer
21
19
  compiler = Compiler.new(footer)
22
20
 
23
- #File.open('footer.html', 'w') { |f| f.write(compiler.body) }
24
-
25
21
  files << multipart_file(compiler.body, 'footer.html', 'text/html')
26
22
  end
27
23
 
@@ -37,8 +33,6 @@ module Gotenberg
37
33
 
38
34
  binary_assets(compiler.assets)
39
35
 
40
- #File.open('index.html', 'w') { |f| f.write(compiler.body) }
41
-
42
36
  @endpoint = '/forms/chromium/convert/html'
43
37
 
44
38
  self
@@ -60,16 +54,16 @@ module Gotenberg
60
54
  end
61
55
 
62
56
  # Sets the additional files, like images, fonts, stylesheets, and so on.
63
- def binary_assets assets
64
- assets.each do |(io, filename)|
57
+ def binary_assets sources
58
+ sources.each do |(io, filename)|
65
59
  files << multipart_file(io, filename)
66
60
  end
67
61
 
68
62
  self
69
63
  end
70
64
 
71
- def assets assets
72
- assets.each do |f|
65
+ def assets sources
66
+ sources.each do |f|
73
67
  files << multipart_file(IO.binread(f), File.basename(f))
74
68
  end
75
69
 
@@ -129,7 +129,7 @@ module Gotenberg
129
129
  properties['extraLinkTags'] = links.to_json
130
130
  properties['extraScriptTags'] = scripts.to_json
131
131
 
132
- endpoint = '/forms/chromium/convert/url'
132
+ @endpoint = '/forms/chromium/convert/url'
133
133
 
134
134
  self
135
135
  end
@@ -5,6 +5,8 @@ require 'gotenberg/chromium/metadata'
5
5
  require 'gotenberg/client'
6
6
  require 'gotenberg/exiftools'
7
7
  require 'gotenberg/extractors'
8
+ require 'gotenberg/exceptions'
9
+ require 'gotenberg/backtrace'
8
10
 
9
11
  module Gotenberg
10
12
  class Chromium
@@ -26,6 +28,7 @@ module Gotenberg
26
28
  end
27
29
 
28
30
  def call
31
+ backtrace if html_debug?
29
32
  transform
30
33
 
31
34
  if success? && metadata_available?
@@ -36,29 +39,37 @@ module Gotenberg
36
39
  end
37
40
 
38
41
  def success?
39
- @exception == nil
42
+ exception == nil
40
43
  end
41
44
 
42
45
  def to_binary
43
- response
46
+ response || raise(exception)
47
+ end
48
+
49
+ def html_debug?
50
+ Gotenberg.configuration.html_debug == true
44
51
  end
45
52
 
46
53
  private
47
54
 
55
+ def backtrace
56
+ Backtrace.new(files).call
57
+ end
58
+
48
59
  def transform
49
60
  @response = client.adapter.post(endpoint, properties.merge(files: files), headers).body
50
61
  rescue StandardError => e
51
- @exception = e
62
+ @exception = Gotenberg::TransformError.new(e)
52
63
  end
53
64
 
54
65
  def modify_metadata
55
66
  @response = Exiftools.modify(response, metadata)
56
67
  rescue StandardError => e
57
- @exception = e
68
+ @exception = Gotenberg::ModifyMetadataError.new(e)
58
69
  end
59
70
 
60
71
  def client
61
- @client ||= Client.new(base_path)
72
+ Client.new(base_path)
62
73
  end
63
74
  end
64
75
  end
@@ -10,12 +10,16 @@ module Gotenberg
10
10
  end
11
11
 
12
12
  def adapter
13
- @adapter ||= Faraday.new(base_path) do |c|
13
+ @adapter ||= Faraday.new(base_path, headers: default_headers) do |c|
14
14
  c.request :multipart
15
15
  c.request :url_encoded
16
16
  c.adapter :net_http
17
17
  c.response :raise_error
18
18
  end
19
19
  end
20
+
21
+ def default_headers
22
+ {'Content-Type' => 'multipart/form-data'}
23
+ end
20
24
  end
21
25
  end
@@ -0,0 +1,15 @@
1
+ module Gotenberg
2
+ class Configuration
3
+ attr_accessor :backtrace_dir, :html_debug
4
+
5
+ def initialize
6
+ @backtrace_dir = if defined?(Rails)
7
+ Rails.root.join('tmp', 'gotenberg')
8
+ else
9
+ Dir.mktmpdir
10
+ end
11
+
12
+ @html_debug = false
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ module Gotenberg
2
+ class TransformError < StandardError; end
3
+ class ModifyMetadataError < StandardError; end
4
+ class RemoteSourceError < StandardError; end
5
+ end
@@ -0,0 +1,46 @@
1
+ module Gotenberg
2
+ module Helpers
3
+ module ActionView
4
+ def gotenberg_image_tag source, options = {}
5
+ gootenberg_source_tag(source, options.merge(tag: 'image'))
6
+ end
7
+
8
+ def gotenberg_javascript_tag source, options = {}
9
+ gootenberg_source_tag(source, options.merge(tag: 'js'))
10
+ end
11
+
12
+ def gotenberg_stylesheet_tag source, options = {}
13
+ gootenberg_source_tag(source, options.merge(tag: 'css'))
14
+ end
15
+
16
+ private
17
+
18
+ def gootenberg_source_tag source, options = {}
19
+ src = if options[:absolute_path]
20
+ File.join(Rails.root, source)
21
+ elsif Rails.env.development?
22
+ gootenberg_asset_location(source, :url)
23
+ else
24
+ File.join(Rails.public_path, gootenberg_asset_location(source, :path))
25
+ end
26
+
27
+ gootenberg_context_tag(src: src, **options)
28
+ end
29
+
30
+ def gootenberg_context_tag attributes
31
+ ('<!-- GOTENBERG-CONTEXT-TAG %s -->' % attributes.to_json).html_safe
32
+ end
33
+
34
+ def gootenberg_asset_location source, type
35
+ webpacker = Module.const_defined?(:Webpacker)
36
+
37
+ case type
38
+ when :path
39
+ public_send((webpacker ? :asset_pack_path : :asset_path), source)
40
+ when :url
41
+ public_send((webpacker ? :asset_pack_url : :asset_url), source)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,11 @@
1
+ require 'gotenberg/helpers/action_view'
2
+
3
+ module WillPaginate
4
+ class Railtie < Rails::Railtie
5
+ initializer "gotenberg.register" do |app|
6
+ ActiveSupport.on_load :action_view do
7
+ include Gotenberg::Helpers::ActionView
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module Gotenberg
2
- VERSION = '1.0.0'
2
+ VERSION = '1.0.3'
3
3
  end
@@ -1,5 +1,15 @@
1
1
  require 'gotenberg/version'
2
+ require 'gotenberg/railtie' if defined?(Rails::Railtie)
2
3
 
3
4
  module Gotenberg
4
5
  autoload :Chromium, 'gotenberg/chromium'
6
+ autoload :Configuration, 'gotenberg/configuration'
7
+
8
+ def self.configuration
9
+ @configuration ||= Configuration.new
10
+ end
11
+
12
+ def self.configure
13
+ yield(configuration)
14
+ end
5
15
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gotenberg-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - sanzstez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-09-22 00:00:00.000000000 Z
11
+ date: 2022-09-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -52,6 +52,26 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: 1.0.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: launchy
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '2.2'
62
+ - - "<"
63
+ - !ruby/object:Gem::Version
64
+ version: '3'
65
+ type: :runtime
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: '2.2'
72
+ - - "<"
73
+ - !ruby/object:Gem::Version
74
+ version: '3'
55
75
  description: A gem that provides a client interface for the Gotenberg PDF generate
56
76
  service
57
77
  email:
@@ -67,6 +87,7 @@ files:
67
87
  - lib/gotenberg/analyzers/css.rb
68
88
  - lib/gotenberg/analyzers/image.rb
69
89
  - lib/gotenberg/analyzers/js.rb
90
+ - lib/gotenberg/backtrace.rb
70
91
  - lib/gotenberg/chromium.rb
71
92
  - lib/gotenberg/chromium/files.rb
72
93
  - lib/gotenberg/chromium/headers.rb
@@ -74,8 +95,12 @@ files:
74
95
  - lib/gotenberg/chromium/properties.rb
75
96
  - lib/gotenberg/client.rb
76
97
  - lib/gotenberg/compiler.rb
98
+ - lib/gotenberg/configuration.rb
99
+ - lib/gotenberg/exceptions.rb
77
100
  - lib/gotenberg/exiftools.rb
78
101
  - lib/gotenberg/extractors.rb
102
+ - lib/gotenberg/helpers/action_view.rb
103
+ - lib/gotenberg/railtie.rb
79
104
  - lib/gotenberg/version.rb
80
105
  homepage: https://github.com/sanzstez/gotenberg-ruby
81
106
  licenses: