prawn 2.4.0 → 2.5.0

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 (203) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/prawn/document/bounding_box.rb +213 -141
  4. data/lib/prawn/document/column_box.rb +61 -26
  5. data/lib/prawn/document/internals.rb +25 -16
  6. data/lib/prawn/document/span.rb +20 -18
  7. data/lib/prawn/document.rb +257 -171
  8. data/lib/prawn/encoding.rb +2 -5
  9. data/lib/prawn/errors.rb +23 -34
  10. data/lib/prawn/font.rb +248 -135
  11. data/lib/prawn/font_metric_cache.rb +11 -10
  12. data/lib/prawn/fonts/afm.rb +85 -45
  13. data/lib/prawn/fonts/dfont.rb +7 -1
  14. data/lib/prawn/fonts/otf.rb +4 -1
  15. data/lib/prawn/fonts/to_unicode_cmap.rb +151 -0
  16. data/lib/prawn/fonts/ttc.rb +7 -2
  17. data/lib/prawn/fonts/ttf.rb +305 -93
  18. data/lib/prawn/fonts.rb +14 -0
  19. data/lib/prawn/graphics/blend_mode.rb +25 -28
  20. data/lib/prawn/graphics/cap_style.rb +9 -12
  21. data/lib/prawn/graphics/color.rb +57 -34
  22. data/lib/prawn/graphics/dash.rb +45 -42
  23. data/lib/prawn/graphics/join_style.rb +17 -11
  24. data/lib/prawn/graphics/patterns.rb +190 -69
  25. data/lib/prawn/graphics/transformation.rb +48 -41
  26. data/lib/prawn/graphics/transparency.rb +16 -40
  27. data/lib/prawn/graphics.rb +363 -253
  28. data/lib/prawn/grid.rb +184 -57
  29. data/lib/prawn/image_handler.rb +27 -10
  30. data/lib/prawn/images/image.rb +8 -10
  31. data/lib/prawn/images/jpg.rb +42 -19
  32. data/lib/prawn/images/png.rb +92 -41
  33. data/lib/prawn/images.rb +44 -57
  34. data/lib/prawn/measurement_extensions.rb +39 -8
  35. data/lib/prawn/measurements.rb +60 -5
  36. data/lib/prawn/outline.rb +114 -108
  37. data/lib/prawn/repeater.rb +51 -35
  38. data/lib/prawn/security/arcfour.rb +4 -4
  39. data/lib/prawn/security.rb +75 -70
  40. data/lib/prawn/soft_mask.rb +42 -30
  41. data/lib/prawn/stamp.rb +38 -42
  42. data/lib/prawn/text/box.rb +146 -96
  43. data/lib/prawn/text/formatted/arranger.rb +87 -26
  44. data/lib/prawn/text/formatted/box.rb +221 -150
  45. data/lib/prawn/text/formatted/fragment.rb +130 -14
  46. data/lib/prawn/text/formatted/line_wrap.rb +33 -24
  47. data/lib/prawn/text/formatted/parser.rb +112 -72
  48. data/lib/prawn/text/formatted/wrap.rb +12 -17
  49. data/lib/prawn/text/formatted.rb +75 -0
  50. data/lib/prawn/text.rb +441 -196
  51. data/lib/prawn/transformation_stack.rb +29 -10
  52. data/lib/prawn/utilities.rb +13 -13
  53. data/lib/prawn/version.rb +2 -1
  54. data/lib/prawn/view.rb +68 -53
  55. data/lib/prawn.rb +23 -18
  56. data.tar.gz.sig +0 -0
  57. metadata +54 -177
  58. metadata.gz.sig +0 -0
  59. data/.yardopts +0 -10
  60. data/Gemfile +0 -5
  61. data/Rakefile +0 -25
  62. data/manual/absolute_position.pdf +0 -0
  63. data/manual/basic_concepts/adding_pages.rb +0 -26
  64. data/manual/basic_concepts/basic_concepts.rb +0 -43
  65. data/manual/basic_concepts/creation.rb +0 -38
  66. data/manual/basic_concepts/cursor.rb +0 -32
  67. data/manual/basic_concepts/measurement.rb +0 -24
  68. data/manual/basic_concepts/origin.rb +0 -37
  69. data/manual/basic_concepts/other_cursor_helpers.rb +0 -39
  70. data/manual/basic_concepts/view.rb +0 -48
  71. data/manual/bounding_box/bounding_box.rb +0 -41
  72. data/manual/bounding_box/bounds.rb +0 -48
  73. data/manual/bounding_box/canvas.rb +0 -23
  74. data/manual/bounding_box/creation.rb +0 -22
  75. data/manual/bounding_box/indentation.rb +0 -45
  76. data/manual/bounding_box/nesting.rb +0 -52
  77. data/manual/bounding_box/russian_boxes.rb +0 -40
  78. data/manual/bounding_box/stretchy.rb +0 -29
  79. data/manual/contents.rb +0 -35
  80. data/manual/cover.rb +0 -43
  81. data/manual/document_and_page_options/background.rb +0 -29
  82. data/manual/document_and_page_options/document_and_page_options.rb +0 -34
  83. data/manual/document_and_page_options/metadata.rb +0 -25
  84. data/manual/document_and_page_options/page_margins.rb +0 -36
  85. data/manual/document_and_page_options/page_size.rb +0 -34
  86. data/manual/document_and_page_options/print_scaling.rb +0 -23
  87. data/manual/example_helper.rb +0 -8
  88. data/manual/graphics/blend_mode.rb +0 -52
  89. data/manual/graphics/circle_and_ellipse.rb +0 -21
  90. data/manual/graphics/color.rb +0 -22
  91. data/manual/graphics/common_lines.rb +0 -29
  92. data/manual/graphics/fill_and_stroke.rb +0 -41
  93. data/manual/graphics/fill_rules.rb +0 -38
  94. data/manual/graphics/gradients.rb +0 -43
  95. data/manual/graphics/graphics.rb +0 -64
  96. data/manual/graphics/helper.rb +0 -34
  97. data/manual/graphics/line_width.rb +0 -36
  98. data/manual/graphics/lines_and_curves.rb +0 -40
  99. data/manual/graphics/polygon.rb +0 -27
  100. data/manual/graphics/rectangle.rb +0 -20
  101. data/manual/graphics/rotate.rb +0 -25
  102. data/manual/graphics/scale.rb +0 -42
  103. data/manual/graphics/soft_masks.rb +0 -44
  104. data/manual/graphics/stroke_cap.rb +0 -30
  105. data/manual/graphics/stroke_dash.rb +0 -47
  106. data/manual/graphics/stroke_join.rb +0 -29
  107. data/manual/graphics/translate.rb +0 -29
  108. data/manual/graphics/transparency.rb +0 -33
  109. data/manual/how_to_read_this_manual.rb +0 -39
  110. data/manual/images/absolute_position.rb +0 -22
  111. data/manual/images/fit.rb +0 -20
  112. data/manual/images/horizontal.rb +0 -24
  113. data/manual/images/images.rb +0 -41
  114. data/manual/images/plain_image.rb +0 -17
  115. data/manual/images/scale.rb +0 -21
  116. data/manual/images/vertical.rb +0 -30
  117. data/manual/images/width_and_height.rb +0 -24
  118. data/manual/layout/boxes.rb +0 -26
  119. data/manual/layout/content.rb +0 -24
  120. data/manual/layout/layout.rb +0 -27
  121. data/manual/layout/simple_grid.rb +0 -22
  122. data/manual/outline/add_subsection_to.rb +0 -60
  123. data/manual/outline/insert_section_after.rb +0 -46
  124. data/manual/outline/outline.rb +0 -33
  125. data/manual/outline/sections_and_pages.rb +0 -66
  126. data/manual/repeatable_content/alternate_page_numbering.rb +0 -36
  127. data/manual/repeatable_content/page_numbering.rb +0 -55
  128. data/manual/repeatable_content/repeatable_content.rb +0 -35
  129. data/manual/repeatable_content/repeater.rb +0 -54
  130. data/manual/repeatable_content/stamp.rb +0 -40
  131. data/manual/security/encryption.rb +0 -28
  132. data/manual/security/permissions.rb +0 -43
  133. data/manual/security/security.rb +0 -28
  134. data/manual/table.rb +0 -16
  135. data/manual/text/alignment.rb +0 -43
  136. data/manual/text/color.rb +0 -24
  137. data/manual/text/column_box.rb +0 -30
  138. data/manual/text/fallback_fonts.rb +0 -41
  139. data/manual/text/font.rb +0 -40
  140. data/manual/text/font_size.rb +0 -44
  141. data/manual/text/font_style.rb +0 -25
  142. data/manual/text/formatted_callbacks.rb +0 -70
  143. data/manual/text/formatted_text.rb +0 -61
  144. data/manual/text/free_flowing_text.rb +0 -50
  145. data/manual/text/inline.rb +0 -40
  146. data/manual/text/kerning_and_character_spacing.rb +0 -38
  147. data/manual/text/leading.rb +0 -24
  148. data/manual/text/line_wrapping.rb +0 -60
  149. data/manual/text/paragraph_indentation.rb +0 -31
  150. data/manual/text/positioned_text.rb +0 -37
  151. data/manual/text/registering_families.rb +0 -51
  152. data/manual/text/rendering_and_color.rb +0 -36
  153. data/manual/text/right_to_left_text.rb +0 -54
  154. data/manual/text/rotation.rb +0 -52
  155. data/manual/text/single_usage.rb +0 -36
  156. data/manual/text/text.rb +0 -75
  157. data/manual/text/text_box_excess.rb +0 -35
  158. data/manual/text/text_box_extensions.rb +0 -48
  159. data/manual/text/text_box_overflow.rb +0 -51
  160. data/manual/text/utf8.rb +0 -27
  161. data/manual/text/win_ansi_charset.rb +0 -62
  162. data/prawn.gemspec +0 -51
  163. data/spec/data/curves.pdf +0 -66
  164. data/spec/extensions/encoding_helpers.rb +0 -11
  165. data/spec/prawn/document/bounding_box_spec.rb +0 -550
  166. data/spec/prawn/document/column_box_spec.rb +0 -75
  167. data/spec/prawn/document/security_spec.rb +0 -176
  168. data/spec/prawn/document_annotations_spec.rb +0 -76
  169. data/spec/prawn/document_destinations_spec.rb +0 -15
  170. data/spec/prawn/document_grid_spec.rb +0 -99
  171. data/spec/prawn/document_reference_spec.rb +0 -27
  172. data/spec/prawn/document_span_spec.rb +0 -44
  173. data/spec/prawn/document_spec.rb +0 -805
  174. data/spec/prawn/font_metric_cache_spec.rb +0 -54
  175. data/spec/prawn/font_spec.rb +0 -544
  176. data/spec/prawn/graphics/blend_mode_spec.rb +0 -63
  177. data/spec/prawn/graphics/transparency_spec.rb +0 -81
  178. data/spec/prawn/graphics_spec.rb +0 -872
  179. data/spec/prawn/graphics_stroke_styles_spec.rb +0 -229
  180. data/spec/prawn/image_handler_spec.rb +0 -53
  181. data/spec/prawn/images/jpg_spec.rb +0 -20
  182. data/spec/prawn/images/png_spec.rb +0 -283
  183. data/spec/prawn/images_spec.rb +0 -229
  184. data/spec/prawn/measurements_extensions_spec.rb +0 -24
  185. data/spec/prawn/outline_spec.rb +0 -512
  186. data/spec/prawn/repeater_spec.rb +0 -166
  187. data/spec/prawn/soft_mask_spec.rb +0 -74
  188. data/spec/prawn/stamp_spec.rb +0 -173
  189. data/spec/prawn/text/box_spec.rb +0 -1110
  190. data/spec/prawn/text/formatted/arranger_spec.rb +0 -466
  191. data/spec/prawn/text/formatted/box_spec.rb +0 -849
  192. data/spec/prawn/text/formatted/fragment_spec.rb +0 -343
  193. data/spec/prawn/text/formatted/line_wrap_spec.rb +0 -495
  194. data/spec/prawn/text/formatted/parser_spec.rb +0 -697
  195. data/spec/prawn/text_draw_text_spec.rb +0 -150
  196. data/spec/prawn/text_rendering_mode_spec.rb +0 -48
  197. data/spec/prawn/text_spacing_spec.rb +0 -95
  198. data/spec/prawn/text_spec.rb +0 -603
  199. data/spec/prawn/text_with_inline_formatting_spec.rb +0 -35
  200. data/spec/prawn/transformation_stack_spec.rb +0 -66
  201. data/spec/prawn/view_spec.rb +0 -63
  202. data/spec/prawn_manual_spec.rb +0 -35
  203. data/spec/spec_helper.rb +0 -48
@@ -1,38 +1,77 @@
1
1
  # encoding: ASCII-8BIT
2
-
3
2
  # frozen_string_literal: true
4
3
 
5
- # png.rb : Extracts the data from a PNG that is needed for embedding
6
- #
7
- # Based on some similar code in PDF::Writer by Austin Ziegler
8
- #
9
- # Copyright April 2008, James Healy. All Rights Reserved.
10
- #
11
- # This is free software. Please see the LICENSE and COPYING files for details.
12
-
13
4
  require 'stringio'
14
5
  module Prawn
15
- module Images
16
- # A convenience class that wraps the logic for extracting the parts
17
- # of a PNG image that we need to embed them in a PDF
18
- #
6
+ module Images # rubocop: disable Style/Documentation
7
+ # A convenience class that wraps the logic for extracting the parts of a PNG
8
+ # image that we need to embed them in a PDF.
19
9
  class PNG < Image
20
10
  # @group Extension API
21
11
 
22
- attr_reader :palette, :img_data, :transparency
23
- attr_reader :width, :height, :bits
24
- attr_reader :color_type, :compression_method, :filter_method
25
- attr_reader :interlace_method, :alpha_channel
26
- attr_accessor :scaled_width, :scaled_height
12
+ # Palette data.
13
+ # @return [String]
14
+ attr_reader :palette
15
+
16
+ # Image data.
17
+ # @return [String]
18
+ attr_reader :img_data
19
+
20
+ # Transparency data.
21
+ # @return [Hash{Symbol => String}]
22
+ attr_reader :transparency
23
+
24
+ # Image width in pixels.
25
+ # @return [Integer]
26
+ attr_reader :width
27
+
28
+ # Image height in pixels.
29
+ # @return [Integer]
30
+ attr_reader :height
31
+
32
+ # Bits per sample or per palette index.
33
+ # @return [Integer]
34
+ attr_reader :bits
35
+
36
+ # Color type.
37
+ # @return [Integer]
38
+ attr_reader :color_type
39
+
40
+ # Compression method.
41
+ # @return [Integer]
42
+ attr_reader :compression_method
43
+
44
+ # Filter method.
45
+ # @return [Integer]
46
+ attr_reader :filter_method
27
47
 
48
+ # Interlace method.
49
+ # @return [Integer]
50
+ attr_reader :interlace_method
51
+
52
+ # Extracted alpha-channel.
53
+ # @return [String, nil]
54
+ attr_reader :alpha_channel
55
+
56
+ # Scaled width of the image in PDF points.
57
+ # @return [Number]
58
+ attr_accessor :scaled_width
59
+
60
+ # Scaled height of the image in PDF points.
61
+ # @return [Number]
62
+ attr_accessor :scaled_height
63
+
64
+ # Can this image handler process this image?
65
+ #
66
+ # @param image_blob [String]
67
+ # @return [Boolean]
28
68
  def self.can_render?(image_blob)
29
69
  image_blob[0, 8].unpack('C*') == [137, 80, 78, 71, 13, 10, 26, 10]
30
70
  end
31
71
 
32
72
  # Process a new PNG image
33
73
  #
34
- # <tt>data</tt>:: A binary string of PNG data
35
- #
74
+ # @param data [String] A binary string of PNG data.
36
75
  def initialize(data)
37
76
  super()
38
77
  data = StringIO.new(data.dup)
@@ -93,8 +132,9 @@ module Prawn
93
132
  @img_data = Zlib::Inflate.inflate(@img_data)
94
133
  end
95
134
 
96
- # number of color components to each pixel
135
+ # Number of color components to each pixel.
97
136
  #
137
+ # @return [Integer]
98
138
  def colors
99
139
  case color_type
100
140
  when 0, 3, 4
@@ -104,9 +144,11 @@ module Prawn
104
144
  end
105
145
  end
106
146
 
107
- # split the alpha channel data from the raw image data in images
108
- # where it's required.
147
+ # Split the alpha channel data from the raw image data in images where
148
+ # it's required.
109
149
  #
150
+ # @private
151
+ # @return [void]
110
152
  def split_alpha_channel!
111
153
  if alpha_channel?
112
154
  if color_type == 3
@@ -117,6 +159,9 @@ module Prawn
117
159
  end
118
160
  end
119
161
 
162
+ # Is there an alpha-channel in this image?
163
+ #
164
+ # @return [Boolean]
120
165
  def alpha_channel?
121
166
  return true if color_type == 4 || color_type == 6
122
167
  return @transparency.any? if color_type == 3
@@ -124,9 +169,11 @@ module Prawn
124
169
  false
125
170
  end
126
171
 
127
- # Build a PDF object representing this image in +document+, and return
172
+ # Build a PDF object representing this image in `document`, and return
128
173
  # a Reference to it.
129
174
  #
175
+ # @param document [Prawn::Document]
176
+ # @return [PDF::Core::Reference]
130
177
  def build_pdf_object(document)
131
178
  if compression_method != 0
132
179
  raise Errors::UnsupportedImageType,
@@ -163,7 +210,7 @@ module Prawn
163
210
  Subtype: :Image,
164
211
  Height: height,
165
212
  Width: width,
166
- BitsPerComponent: bits
213
+ BitsPerComponent: bits,
167
214
  )
168
215
 
169
216
  # append the actual image data to the object as a stream
@@ -174,8 +221,8 @@ module Prawn
174
221
  Predictor: 15,
175
222
  Colors: colors,
176
223
  BitsPerComponent: bits,
177
- Columns: width
178
- }
224
+ Columns: width,
225
+ },
179
226
  }
180
227
 
181
228
  # sort out the colours of the image
@@ -191,7 +238,7 @@ module Prawn
191
238
  :Indexed,
192
239
  :DeviceRGB,
193
240
  (palette.size / 3) - 1,
194
- palette_obj
241
+ palette_obj,
195
242
  ]
196
243
  end
197
244
 
@@ -218,7 +265,7 @@ module Prawn
218
265
 
219
266
  # For PNG color types 4 and 6, the transparency data is stored as
220
267
  # a alpha channel mixed in with the main image data. The PNG class
221
- # seperates it out for us and makes it available via the alpha_channel
268
+ # separates it out for us and makes it available via the alpha_channel
222
269
  # attribute
223
270
  if alpha_channel?
224
271
  smask_obj = document.ref!(
@@ -228,7 +275,7 @@ module Prawn
228
275
  Width: width,
229
276
  BitsPerComponent: bits,
230
277
  ColorSpace: :DeviceGray,
231
- Decode: [0, 1]
278
+ Decode: [0, 1],
232
279
  )
233
280
  smask_obj.stream << alpha_channel
234
281
 
@@ -237,8 +284,8 @@ module Prawn
237
284
  Predictor: 15,
238
285
  Colors: 1,
239
286
  BitsPerComponent: bits,
240
- Columns: width
241
- }
287
+ Columns: width,
288
+ },
242
289
  }
243
290
  obj.data[:SMask] = smask_obj
244
291
  end
@@ -247,6 +294,8 @@ module Prawn
247
294
  end
248
295
 
249
296
  # Returns the minimum PDF version required to support this image.
297
+ #
298
+ # @return [Float]
250
299
  def min_pdf_version
251
300
  if bits > 8
252
301
  # 16-bit color only supported in 1.5+ (ISO 32000-1:2008 8.9.5.1)
@@ -265,18 +314,18 @@ module Prawn
265
314
  alpha_bytes = bits / 8
266
315
  color_bytes = colors * bits / 8
267
316
 
268
- scanline_length = (color_bytes + alpha_bytes) * width + 1
317
+ scanline_length = ((color_bytes + alpha_bytes) * width) + 1
269
318
  scanlines = @img_data.bytesize / scanline_length
270
319
  pixels = width * height
271
320
 
272
321
  data = StringIO.new(@img_data)
273
322
  data.binmode
274
323
 
275
- color_data = [0x00].pack('C') * (pixels * color_bytes + scanlines)
324
+ color_data = [0x00].pack('C') * ((pixels * color_bytes) + scanlines)
276
325
  color = StringIO.new(color_data)
277
326
  color.binmode
278
327
 
279
- @alpha_channel = [0x00].pack('C') * (pixels * alpha_bytes + scanlines)
328
+ @alpha_channel = [0x00].pack('C') * ((pixels * alpha_bytes) + scanlines)
280
329
  alpha = StringIO.new(@alpha_channel)
281
330
  alpha.binmode
282
331
 
@@ -285,12 +334,12 @@ module Prawn
285
334
 
286
335
  filter = data.getbyte
287
336
 
288
- color.putc filter
289
- alpha.putc filter
337
+ color.putc(filter)
338
+ alpha.putc(filter)
290
339
 
291
340
  width.times do
292
- color.write data.read(color_bytes)
293
- alpha.write data.read(alpha_bytes)
341
+ color.write(data.read(color_bytes))
342
+ alpha.write(data.read(alpha_bytes))
294
343
  end
295
344
  end
296
345
 
@@ -319,14 +368,16 @@ module Prawn
319
368
 
320
369
  filter = data.getbyte
321
370
 
322
- alpha.putc filter
371
+ alpha.putc(filter)
323
372
 
324
373
  width.times do
325
374
  color = data.read(1).unpack1('C')
326
- alpha.putc alpha_palette[color]
375
+ alpha.putc(alpha_palette[color])
327
376
  end
328
377
  end
329
378
  end
330
379
  end
380
+
381
+ Prawn.image_handler.register(Prawn::Images::PNG)
331
382
  end
332
383
  end
data/lib/prawn/images.rb CHANGED
@@ -1,74 +1,62 @@
1
1
  # encoding: ASCII-8BIT
2
-
3
2
  # frozen_string_literal: true
4
3
 
5
- # images.rb : Implements PDF image embedding
6
- #
7
- # Copyright April 2008, James Healy, Gregory Brown. All Rights Reserved.
8
- #
9
- # This is free software. Please see the LICENSE and COPYING files for details.
10
-
11
4
  require 'digest/sha1'
12
5
  require 'pathname'
13
6
 
14
7
  module Prawn
8
+ # PDF image embedding.
15
9
  module Images
16
10
  # @group Stable API
17
11
 
18
- # Add the image at filename to the current page. Currently only
19
- # JPG and PNG files are supported. (Note that processing PNG
20
- # images with alpha channels can be processor and memory intensive.)
21
- #
22
- # Arguments:
23
- # <tt>file</tt>:: path to file or an object that responds to #read and
24
- # #rewind
12
+ # Add the image at `file` to the current page. Currently only JPG and
13
+ # PNG files are supported. (Note that processing PNG images with alpha
14
+ # channels can be processor and memory intensive.)
25
15
  #
26
- # Options:
27
- # <tt>:at</tt>:: an array [x,y] with the location of the top left corner of
28
- # the image.
29
- # <tt>:position</tt>:: One of (:left, :center, :right) or an x-offset
30
- # <tt>:vposition</tt>:: One of (:top, :center, :bottom) or an y-offset
31
- # <tt>:height</tt>:: the height of the image [actual height of the image]
32
- # <tt>:width</tt>:: the width of the image [actual width of the image]
33
- # <tt>:scale</tt>:: scale the dimensions of the image proportionally
34
- # <tt>:fit</tt>:: scale the dimensions of the image proportionally to fit
35
- # inside [width,height]
16
+ # If only one of `:width` or `:height` are provided, the image will be
17
+ # scaled proportionally. When both are provided, the image will be stretched
18
+ # to fit the dimensions without maintaining the aspect ratio.
36
19
  #
37
- # Prawn::Document.generate("image2.pdf", :page_layout => :landscape) do
20
+ # @example
21
+ # Prawn::Document.generate("image2.pdf", page_layout: :landscape) do
38
22
  # pigs = "#{Prawn::DATADIR}/images/pigs.jpg"
39
- # image pigs, :at => [50,450], :width => 450
23
+ # image pigs, at: [50,450], width: 450
40
24
  #
41
25
  # dice = "#{Prawn::DATADIR}/images/dice.png"
42
- # image dice, :at => [50, 450], :scale => 0.75
43
- # end
44
- #
45
- # If only one of :width / :height are provided, the image will be scaled
46
- # proportionally. When both are provided, the image will be stretched to
47
- # fit the dimensions without maintaining the aspect ratio.
48
- #
49
- #
50
- # If :at is provided, the image will be place in the current page but
51
- # the text position will not be changed.
52
- #
53
- #
54
- # If instead of an explicit filename, an object with a read method is
55
- # passed as +file+, you can embed images from IO objects and things
56
- # that act like them (including Tempfiles and open-uri objects).
57
- #
58
- # require "open-uri"
59
- #
60
- # Prawn::Document.generate("remote_images.pdf") do
61
- # image open("http://prawnpdf.org/media/prawn_logo.png")
26
+ # image dice, at: [50, 450], scale: 0.75
62
27
  # end
63
28
  #
64
- # This method returns an image info object which can be used to check the
65
- # dimensions of an image object if needed.
66
- # (See also: Prawn::Images::PNG , Prawn::Images::JPG)
29
+ # @param file [String, IO]
30
+ # Path to file or an object that responds to `#read` and `#rewind`.
31
+ # @param options [Hash{Symbol => any}]
32
+ # @option options :at [Array(Number, Number)]
33
+ # The location of the top left corner of the image. If provided,
34
+ # the image will be place in the current page but the text position will
35
+ # not be changed.
36
+ # @option options :position [:left, :center, :right, Number]
37
+ # Horizontal position relative to the current bounding box.
38
+ # @option options :vposition [:topm :center, :bottom, Number]
39
+ # Vertical position relative to the current bounding box.
40
+ # @option options :height [Number] (actual height of the image)
41
+ # The height of the image.
42
+ # @option options :width [Number] (actual width of the image)
43
+ # The width of the image.
44
+ # @option options :scale [Number]
45
+ # Scale the dimensions of the image proportionally.
46
+ # @option options :fit [Array(Number, Number)]
47
+ # Scale the dimensions of the image proportionally to fit
48
+ # inside the rectangle of specified size (width, height).
49
+ # @return [Prawn::Images::Image]
50
+ # An image handler. All image handlers provided by Prawn are subclasses of
51
+ # {Prawn::Images::Image}. This object can be used to check the image
52
+ # dimensions and get other format-specific information.
67
53
  #
54
+ # @see Prawn::Images::PNG
55
+ # @see Prawn::Images::JPG
68
56
  def image(file, options = {})
69
57
  Prawn.verify_options(
70
58
  %i[at position vposition height width scale fit],
71
- options
59
+ options,
72
60
  )
73
61
 
74
62
  pdf_obj, info = build_image_object(file)
@@ -106,10 +94,9 @@ module Prawn
106
94
  [image_obj, info]
107
95
  end
108
96
 
109
- # Given a PDF image resource <tt>pdf_obj</tt> that has been added to the
110
- # page's resources and an <tt>info</tt> object (the pair returned from
111
- # build_image_object), embed the image according to the <tt>options</tt>
112
- # given.
97
+ # Given a PDF image resource `pdf_obj` that has been added to the page's
98
+ # resources and an `info` object (the pair returned from
99
+ # {build_image_object}), embed the image according to the `options` given.
113
100
  #
114
101
  # @private
115
102
  def embed_image(pdf_obj, info, options)
@@ -120,7 +107,7 @@ module Prawn
120
107
  x, y = map_to_absolute(options[:at])
121
108
  else
122
109
  x, y = image_position(w, h, options)
123
- move_text_position h
110
+ move_text_position(h)
124
111
  end
125
112
 
126
113
  # add a reference to the image object to the current page
@@ -161,7 +148,7 @@ module Prawn
161
148
  when :top
162
149
  bounds.absolute_top
163
150
  when :center
164
- bounds.absolute_top - (bounds.height - height) / 2.0
151
+ bounds.absolute_top - ((bounds.height - height) / 2.0)
165
152
  when :bottom
166
153
  bounds.absolute_bottom + height
167
154
  when Numeric
@@ -175,7 +162,7 @@ module Prawn
175
162
  when :left
176
163
  bounds.left_side
177
164
  when :center
178
- bounds.left_side + (bounds.width - width) / 2.0
165
+ bounds.left_side + ((bounds.width - width) / 2.0)
179
166
  when :right
180
167
  bounds.right_side - width
181
168
  when Numeric
@@ -1,50 +1,81 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # measurement_extensions.rb: Core extensions for Prawn::Measurements
4
- #
5
- # Copyright December 2008, Florian Witteler. All Rights Reserved.
6
- #
7
- # This is free software. Please see the LICENSE and COPYING files for details.
8
-
9
3
  require_relative 'measurements'
10
4
 
11
5
  # @group Stable API
12
6
 
7
+ # Core extensions for {Prawn::Measurements}.
8
+ #
9
+ # This mainly enables measurements DSL.
10
+ #
11
+ # You have to explicitly require "prawn/measurement_extensions" to enable these.
12
+ #
13
+ # ```ruby
14
+ # require 'prawn/measurement_extensions'
15
+ #
16
+ # 12.mm
17
+ # 2.cm
18
+ # 0.5.in
19
+ # 4.yd + 2.ft
20
+ # ```
13
21
  class Numeric
14
22
  include Prawn::Measurements
15
- # prawns' basic unit is PostScript-Point
16
- # 72 points per inch
23
+ # Prawn's basic unit is PostScript-Point: 72 points per inch.
17
24
 
18
25
  # @group Experimental API
19
26
 
27
+ # Convert from millimeters to points.
28
+ #
29
+ # @return [Number]
20
30
  def mm
21
31
  mm2pt(self)
22
32
  end
23
33
 
34
+ # Convert from centimeters to points.
35
+ #
36
+ # @return [Number]
24
37
  def cm
25
38
  cm2pt(self)
26
39
  end
27
40
 
41
+ # Convert from decimeters to points.
42
+ #
43
+ # @return [Number]
28
44
  def dm
29
45
  dm2pt(self)
30
46
  end
31
47
 
48
+ # Convert from meters to points.
49
+ #
50
+ # @return [Number]
32
51
  def m
33
52
  m2pt(self)
34
53
  end
35
54
 
55
+ # Convert from inches to points.
56
+ #
57
+ # @return [Number]
36
58
  def in
37
59
  in2pt(self)
38
60
  end
39
61
 
62
+ # Convert from yards to points.
63
+ #
64
+ # @return [Number]
40
65
  def yd
41
66
  yd2pt(self)
42
67
  end
43
68
 
69
+ # Convert from feet to points.
70
+ #
71
+ # @return [Number]
44
72
  def ft
45
73
  ft2pt(self)
46
74
  end
47
75
 
76
+ # Convert from points to points.
77
+ #
78
+ # @return [Number]
48
79
  def pt
49
80
  pt2pt(self)
50
81
  end
@@ -1,71 +1,126 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # measurements.rb: Conversions from other measurements to PDF points
4
- #
5
- # Copyright December 2008, Florian Witteler. All Rights Reserved.
6
- #
7
-
8
3
  # rubocop: disable Naming/MethodParameterName
9
4
  module Prawn
10
5
  # @group Stable API
11
6
 
7
+ # Distance unit conversions between metric, imperial, and PDF.
12
8
  module Measurements
13
9
  # metric conversions
10
+
11
+ # Convert centimeter to millimeters.
12
+ #
13
+ # @param cm [Number]
14
+ # @return [Number]
14
15
  def cm2mm(cm)
15
16
  cm * 10
16
17
  end
17
18
 
19
+ # Convert decimeters to millimeters.
20
+ #
21
+ # @param dm [Number]
22
+ # @return [Number]
18
23
  def dm2mm(dm)
19
24
  dm * 100
20
25
  end
21
26
 
27
+ # Convert meters to millimeters.
28
+ #
29
+ # @param m [Number]
30
+ # @return [Number]
22
31
  def m2mm(m)
23
32
  m * 1000
24
33
  end
25
34
 
26
35
  # imperial conversions
27
36
  # from http://en.wikipedia.org/wiki/Imperial_units
37
+
38
+ # Convert feet to inches.
39
+ #
40
+ # @param ft [Number]
41
+ # @return [Number]
28
42
  def ft2in(ft)
29
43
  ft * 12
30
44
  end
31
45
 
46
+ # Convert yards to inches.
47
+ #
48
+ # @param yd [Number]
49
+ # @return [Number]
32
50
  def yd2in(yd)
33
51
  yd * 36
34
52
  end
35
53
 
36
54
  # PostscriptPoint-converisons
55
+
56
+ # Convert points to points. For completeness.
57
+ #
58
+ # @param pt [Number]
59
+ # @return [Number]
37
60
  def pt2pt(pt)
38
61
  pt
39
62
  end
40
63
 
64
+ # Convert inches to points.
65
+ #
66
+ # @param inch [Number]
67
+ # @return [Number]
41
68
  def in2pt(inch)
42
69
  inch * 72
43
70
  end
44
71
 
72
+ # Convert feet to points.
73
+ #
74
+ # @param ft [Number]
75
+ # @return [Number]
45
76
  def ft2pt(ft)
46
77
  in2pt(ft2in(ft))
47
78
  end
48
79
 
80
+ # Convert yards to points.
81
+ #
82
+ # @param yd [Number]
83
+ # @return [Number]
49
84
  def yd2pt(yd)
50
85
  in2pt(yd2in(yd))
51
86
  end
52
87
 
88
+ # Convert millimeters to points.
89
+ #
90
+ # @param mm [Number]
91
+ # @return [Number]
53
92
  def mm2pt(mm)
54
93
  mm * (72 / 25.4)
55
94
  end
56
95
 
96
+ # Convert centimeters to points.
97
+ #
98
+ # @param cm [Number]
99
+ # @return [Number]
57
100
  def cm2pt(cm)
58
101
  mm2pt(cm2mm(cm))
59
102
  end
60
103
 
104
+ # Convert decimeters to points.
105
+ #
106
+ # @param dm [Number]
107
+ # @return [Number]
61
108
  def dm2pt(dm)
62
109
  mm2pt(dm2mm(dm))
63
110
  end
64
111
 
112
+ # Convert meters to points.
113
+ #
114
+ # @param m [Number]
115
+ # @return [Number]
65
116
  def m2pt(m)
66
117
  mm2pt(m2mm(m))
67
118
  end
68
119
 
120
+ # Convert points to millimeters.
121
+ #
122
+ # @param pt [Number]
123
+ # @return [Number]
69
124
  def pt2mm(pt)
70
125
  pt * 1 / mm2pt(1) # (25.4 / 72)
71
126
  end