prawn 1.1.0 → 2.4.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 (309) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.yardopts +1 -0
  4. data/GPLv2 +20 -21
  5. data/Gemfile +3 -9
  6. data/Rakefile +9 -40
  7. data/lib/prawn/document/bounding_box.rb +54 -40
  8. data/lib/prawn/document/column_box.rb +8 -10
  9. data/lib/prawn/document/internals.rb +39 -146
  10. data/lib/prawn/document/span.rb +23 -17
  11. data/lib/prawn/document.rb +217 -182
  12. data/lib/prawn/encoding.rb +69 -101
  13. data/lib/prawn/errors.rb +47 -43
  14. data/lib/prawn/font.rb +124 -104
  15. data/lib/prawn/font_metric_cache.rb +23 -21
  16. data/lib/prawn/fonts/afm.rb +292 -0
  17. data/lib/prawn/{font → fonts}/dfont.rb +5 -12
  18. data/lib/prawn/fonts/otf.rb +11 -0
  19. data/lib/prawn/fonts/ttc.rb +36 -0
  20. data/lib/prawn/{font → fonts}/ttf.rb +140 -88
  21. data/lib/prawn/graphics/blend_mode.rb +65 -0
  22. data/lib/prawn/graphics/cap_style.rb +5 -5
  23. data/lib/prawn/graphics/color.rb +46 -44
  24. data/lib/prawn/graphics/dash.rb +27 -11
  25. data/lib/prawn/graphics/join_style.rb +11 -6
  26. data/lib/prawn/graphics/patterns.rb +220 -78
  27. data/lib/prawn/graphics/transformation.rb +20 -12
  28. data/lib/prawn/graphics/transparency.rb +20 -18
  29. data/lib/prawn/graphics.rb +153 -115
  30. data/lib/prawn/grid.rb +93 -50
  31. data/lib/prawn/image_handler.rb +4 -4
  32. data/lib/prawn/images/image.rb +3 -2
  33. data/lib/prawn/images/jpg.rb +31 -24
  34. data/lib/prawn/images/png.rb +101 -68
  35. data/lib/prawn/images.rb +64 -56
  36. data/lib/prawn/measurement_extensions.rb +10 -9
  37. data/lib/prawn/measurements.rb +20 -23
  38. data/lib/prawn/outline.rb +96 -75
  39. data/lib/prawn/repeater.rb +16 -16
  40. data/lib/prawn/security/arcfour.rb +2 -2
  41. data/lib/prawn/security.rb +100 -85
  42. data/lib/prawn/soft_mask.rb +37 -38
  43. data/lib/prawn/stamp.rb +28 -13
  44. data/lib/prawn/text/box.rb +24 -29
  45. data/lib/prawn/text/formatted/arranger.rb +108 -63
  46. data/lib/prawn/text/formatted/box.rb +187 -124
  47. data/lib/prawn/text/formatted/fragment.rb +24 -20
  48. data/lib/prawn/text/formatted/line_wrap.rb +133 -73
  49. data/lib/prawn/text/formatted/parser.rb +147 -127
  50. data/lib/prawn/text/formatted/wrap.rb +48 -35
  51. data/lib/prawn/text/formatted.rb +5 -5
  52. data/lib/prawn/text.rb +103 -68
  53. data/lib/prawn/transformation_stack.rb +44 -0
  54. data/lib/prawn/utilities.rb +10 -22
  55. data/lib/prawn/version.rb +5 -0
  56. data/lib/prawn/view.rb +101 -0
  57. data/lib/prawn.rb +39 -54
  58. data/manual/basic_concepts/adding_pages.rb +6 -7
  59. data/manual/basic_concepts/basic_concepts.rb +34 -25
  60. data/manual/basic_concepts/creation.rb +10 -11
  61. data/manual/basic_concepts/cursor.rb +4 -5
  62. data/manual/basic_concepts/measurement.rb +8 -9
  63. data/manual/basic_concepts/origin.rb +5 -6
  64. data/manual/basic_concepts/other_cursor_helpers.rb +11 -12
  65. data/manual/basic_concepts/view.rb +48 -0
  66. data/manual/bounding_box/bounding_box.rb +30 -28
  67. data/manual/bounding_box/bounds.rb +12 -13
  68. data/manual/bounding_box/canvas.rb +7 -8
  69. data/manual/bounding_box/creation.rb +6 -7
  70. data/manual/bounding_box/indentation.rb +14 -15
  71. data/manual/bounding_box/nesting.rb +25 -18
  72. data/manual/bounding_box/russian_boxes.rb +18 -18
  73. data/manual/bounding_box/stretchy.rb +12 -14
  74. data/manual/contents.rb +28 -22
  75. data/manual/cover.rb +33 -32
  76. data/manual/document_and_page_options/background.rb +15 -13
  77. data/manual/document_and_page_options/document_and_page_options.rb +24 -22
  78. data/manual/document_and_page_options/metadata.rb +20 -18
  79. data/manual/document_and_page_options/page_margins.rb +18 -20
  80. data/manual/document_and_page_options/page_size.rb +13 -13
  81. data/manual/document_and_page_options/print_scaling.rb +18 -15
  82. data/manual/example_helper.rb +5 -4
  83. data/manual/graphics/blend_mode.rb +52 -0
  84. data/manual/graphics/circle_and_ellipse.rb +4 -5
  85. data/manual/graphics/color.rb +7 -9
  86. data/manual/graphics/common_lines.rb +7 -8
  87. data/manual/graphics/fill_and_stroke.rb +5 -6
  88. data/manual/graphics/fill_rules.rb +12 -11
  89. data/manual/graphics/gradients.rb +27 -21
  90. data/manual/graphics/graphics.rb +46 -40
  91. data/manual/graphics/helper.rb +19 -9
  92. data/manual/graphics/line_width.rb +8 -7
  93. data/manual/graphics/lines_and_curves.rb +8 -9
  94. data/manual/graphics/polygon.rb +6 -8
  95. data/manual/graphics/rectangle.rb +4 -5
  96. data/manual/graphics/rotate.rb +6 -9
  97. data/manual/graphics/scale.rb +14 -13
  98. data/manual/graphics/soft_masks.rb +4 -6
  99. data/manual/graphics/stroke_cap.rb +7 -8
  100. data/manual/graphics/stroke_dash.rb +15 -16
  101. data/manual/graphics/stroke_join.rb +6 -7
  102. data/manual/graphics/translate.rb +10 -10
  103. data/manual/graphics/transparency.rb +7 -9
  104. data/manual/how_to_read_this_manual.rb +8 -9
  105. data/manual/images/absolute_position.rb +6 -7
  106. data/manual/images/fit.rb +7 -8
  107. data/manual/images/horizontal.rb +10 -11
  108. data/manual/images/images.rb +28 -27
  109. data/manual/images/plain_image.rb +5 -6
  110. data/manual/images/scale.rb +9 -10
  111. data/manual/images/vertical.rb +16 -14
  112. data/manual/images/width_and_height.rb +10 -11
  113. data/manual/layout/boxes.rb +10 -11
  114. data/manual/layout/content.rb +9 -10
  115. data/manual/layout/layout.rb +17 -18
  116. data/manual/layout/simple_grid.rb +6 -7
  117. data/manual/outline/add_subsection_to.rb +20 -21
  118. data/manual/outline/insert_section_after.rb +15 -16
  119. data/manual/outline/outline.rb +22 -21
  120. data/manual/outline/sections_and_pages.rb +17 -18
  121. data/manual/repeatable_content/alternate_page_numbering.rb +36 -0
  122. data/manual/repeatable_content/page_numbering.rb +17 -16
  123. data/manual/repeatable_content/repeatable_content.rb +27 -23
  124. data/manual/repeatable_content/repeater.rb +15 -16
  125. data/manual/repeatable_content/stamp.rb +14 -15
  126. data/manual/security/encryption.rb +8 -11
  127. data/manual/security/permissions.rb +20 -15
  128. data/manual/security/security.rb +18 -18
  129. data/manual/table.rb +16 -0
  130. data/manual/text/alignment.rb +16 -17
  131. data/manual/text/color.rb +12 -12
  132. data/manual/text/column_box.rb +9 -11
  133. data/manual/text/fallback_fonts.rb +25 -21
  134. data/manual/text/font.rb +11 -12
  135. data/manual/text/font_size.rb +13 -14
  136. data/manual/text/font_style.rb +10 -8
  137. data/manual/text/formatted_callbacks.rb +33 -23
  138. data/manual/text/formatted_text.rb +36 -25
  139. data/manual/text/free_flowing_text.rb +22 -23
  140. data/manual/text/inline.rb +18 -19
  141. data/manual/text/kerning_and_character_spacing.rb +14 -15
  142. data/manual/text/leading.rb +7 -8
  143. data/manual/text/line_wrapping.rb +37 -18
  144. data/manual/text/paragraph_indentation.rb +15 -10
  145. data/manual/text/positioned_text.rb +16 -17
  146. data/manual/text/registering_families.rb +27 -24
  147. data/manual/text/rendering_and_color.rb +9 -10
  148. data/manual/text/right_to_left_text.rb +30 -19
  149. data/manual/text/rotation.rb +33 -24
  150. data/manual/text/single_usage.rb +8 -9
  151. data/manual/text/text.rb +56 -54
  152. data/manual/text/text_box_excess.rb +20 -17
  153. data/manual/text/text_box_extensions.rb +18 -15
  154. data/manual/text/text_box_overflow.rb +24 -17
  155. data/manual/text/utf8.rb +12 -13
  156. data/manual/text/win_ansi_charset.rb +28 -25
  157. data/prawn.gemspec +45 -50
  158. data/spec/extensions/encoding_helpers.rb +3 -3
  159. data/spec/prawn/document/bounding_box_spec.rb +550 -0
  160. data/spec/prawn/document/column_box_spec.rb +75 -0
  161. data/spec/prawn/document/security_spec.rb +176 -0
  162. data/spec/prawn/document_annotations_spec.rb +76 -0
  163. data/spec/prawn/document_destinations_spec.rb +15 -0
  164. data/spec/prawn/document_grid_spec.rb +99 -0
  165. data/spec/prawn/document_reference_spec.rb +27 -0
  166. data/spec/prawn/document_span_spec.rb +44 -0
  167. data/spec/prawn/document_spec.rb +805 -0
  168. data/spec/prawn/font_metric_cache_spec.rb +54 -0
  169. data/spec/prawn/font_spec.rb +544 -0
  170. data/spec/prawn/graphics/blend_mode_spec.rb +63 -0
  171. data/spec/prawn/graphics/transparency_spec.rb +81 -0
  172. data/spec/prawn/graphics_spec.rb +872 -0
  173. data/spec/prawn/graphics_stroke_styles_spec.rb +229 -0
  174. data/spec/prawn/image_handler_spec.rb +53 -0
  175. data/spec/prawn/images/jpg_spec.rb +20 -0
  176. data/spec/prawn/images/png_spec.rb +283 -0
  177. data/spec/prawn/images_spec.rb +229 -0
  178. data/spec/prawn/measurements_extensions_spec.rb +24 -0
  179. data/spec/prawn/outline_spec.rb +512 -0
  180. data/spec/prawn/repeater_spec.rb +166 -0
  181. data/spec/prawn/soft_mask_spec.rb +74 -0
  182. data/spec/prawn/stamp_spec.rb +173 -0
  183. data/spec/prawn/text/box_spec.rb +1110 -0
  184. data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
  185. data/spec/prawn/text/formatted/box_spec.rb +849 -0
  186. data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
  187. data/spec/prawn/text/formatted/line_wrap_spec.rb +495 -0
  188. data/spec/prawn/text/formatted/parser_spec.rb +697 -0
  189. data/spec/prawn/text_draw_text_spec.rb +150 -0
  190. data/spec/prawn/text_rendering_mode_spec.rb +48 -0
  191. data/spec/prawn/text_spacing_spec.rb +95 -0
  192. data/spec/prawn/text_spec.rb +603 -0
  193. data/spec/prawn/text_with_inline_formatting_spec.rb +35 -0
  194. data/spec/prawn/transformation_stack_spec.rb +66 -0
  195. data/spec/prawn/view_spec.rb +63 -0
  196. data/spec/prawn_manual_spec.rb +35 -0
  197. data/spec/spec_helper.rb +19 -25
  198. data.tar.gz.sig +0 -0
  199. metadata +113 -276
  200. metadata.gz.sig +0 -0
  201. data/data/encodings/win_ansi.txt +0 -29
  202. data/data/images/16bit.alpha +0 -0
  203. data/data/images/16bit.color +0 -0
  204. data/data/images/16bit.png +0 -0
  205. data/data/images/arrow.png +0 -0
  206. data/data/images/arrow2.png +0 -0
  207. data/data/images/dice.alpha +0 -0
  208. data/data/images/dice.color +0 -0
  209. data/data/images/dice.png +0 -0
  210. data/data/images/dice_interlaced.png +0 -0
  211. data/data/images/fractal.jpg +0 -0
  212. data/data/images/indexed_color.dat +0 -0
  213. data/data/images/indexed_color.png +0 -0
  214. data/data/images/letterhead.jpg +0 -0
  215. data/data/images/license.md +0 -8
  216. data/data/images/page_white_text.alpha +0 -0
  217. data/data/images/page_white_text.color +0 -0
  218. data/data/images/page_white_text.png +0 -0
  219. data/data/images/pigs.jpg +0 -0
  220. data/data/images/prawn.png +0 -0
  221. data/data/images/ruport.png +0 -0
  222. data/data/images/ruport_data.dat +0 -0
  223. data/data/images/ruport_transparent.png +0 -0
  224. data/data/images/ruport_type0.png +0 -0
  225. data/data/images/stef.jpg +0 -0
  226. data/data/images/tru256.bmp +0 -0
  227. data/data/images/web-links.dat +0 -1
  228. data/data/images/web-links.png +0 -0
  229. data/data/pdfs/complex_template.pdf +0 -0
  230. data/data/pdfs/contains_ttf_font.pdf +0 -0
  231. data/data/pdfs/encrypted.pdf +0 -0
  232. data/data/pdfs/form.pdf +1 -819
  233. data/data/pdfs/hexagon.pdf +0 -61
  234. data/data/pdfs/indirect_reference.pdf +0 -86
  235. data/data/pdfs/multipage_template.pdf +0 -127
  236. data/data/pdfs/nested_pages.pdf +0 -118
  237. data/data/pdfs/page_without_mediabox.pdf +0 -193
  238. data/data/pdfs/resources_as_indirect_object.pdf +0 -83
  239. data/data/pdfs/two_hexagons.pdf +0 -90
  240. data/data/pdfs/version_1_6.pdf +0 -61
  241. data/data/shift_jis_text.txt +0 -1
  242. data/lib/prawn/document/graphics_state.rb +0 -73
  243. data/lib/prawn/font/afm.rb +0 -247
  244. data/lib/prawn/table/cell/image.rb +0 -69
  245. data/lib/prawn/table/cell/in_table.rb +0 -33
  246. data/lib/prawn/table/cell/span_dummy.rb +0 -93
  247. data/lib/prawn/table/cell/subtable.rb +0 -66
  248. data/lib/prawn/table/cell/text.rb +0 -154
  249. data/lib/prawn/table/cell.rb +0 -772
  250. data/lib/prawn/table/cells.rb +0 -255
  251. data/lib/prawn/table/column_width_calculator.rb +0 -182
  252. data/lib/prawn/table.rb +0 -644
  253. data/manual/table/basic_block.rb +0 -53
  254. data/manual/table/before_rendering_page.rb +0 -26
  255. data/manual/table/cell_border_lines.rb +0 -24
  256. data/manual/table/cell_borders_and_bg.rb +0 -31
  257. data/manual/table/cell_dimensions.rb +0 -30
  258. data/manual/table/cell_text.rb +0 -38
  259. data/manual/table/column_widths.rb +0 -30
  260. data/manual/table/content_and_subtables.rb +0 -39
  261. data/manual/table/creation.rb +0 -27
  262. data/manual/table/filtering.rb +0 -36
  263. data/manual/table/flow_and_header.rb +0 -17
  264. data/manual/table/image_cells.rb +0 -33
  265. data/manual/table/position.rb +0 -29
  266. data/manual/table/row_colors.rb +0 -20
  267. data/manual/table/span.rb +0 -30
  268. data/manual/table/style.rb +0 -22
  269. data/manual/table/table.rb +0 -52
  270. data/manual/table/width.rb +0 -27
  271. data/spec/acceptance/png.rb +0 -25
  272. data/spec/annotations_spec.rb +0 -74
  273. data/spec/bounding_box_spec.rb +0 -510
  274. data/spec/cell_spec.rb +0 -629
  275. data/spec/column_box_spec.rb +0 -65
  276. data/spec/destinations_spec.rb +0 -15
  277. data/spec/document_spec.rb +0 -730
  278. data/spec/extensions/mocha.rb +0 -46
  279. data/spec/font_metric_cache_spec.rb +0 -52
  280. data/spec/font_spec.rb +0 -449
  281. data/spec/formatted_text_arranger_spec.rb +0 -421
  282. data/spec/formatted_text_box_spec.rb +0 -639
  283. data/spec/formatted_text_fragment_spec.rb +0 -298
  284. data/spec/graphics_spec.rb +0 -669
  285. data/spec/grid_spec.rb +0 -96
  286. data/spec/image_handler_spec.rb +0 -54
  287. data/spec/images_spec.rb +0 -153
  288. data/spec/inline_formatted_text_parser_spec.rb +0 -564
  289. data/spec/jpg_spec.rb +0 -25
  290. data/spec/line_wrap_spec.rb +0 -344
  291. data/spec/measurement_units_spec.rb +0 -25
  292. data/spec/outline_spec.rb +0 -430
  293. data/spec/png_spec.rb +0 -237
  294. data/spec/reference_spec.rb +0 -25
  295. data/spec/repeater_spec.rb +0 -160
  296. data/spec/security_spec.rb +0 -158
  297. data/spec/soft_mask_spec.rb +0 -79
  298. data/spec/span_spec.rb +0 -44
  299. data/spec/stamp_spec.rb +0 -160
  300. data/spec/stroke_styles_spec.rb +0 -211
  301. data/spec/table/span_dummy_spec.rb +0 -17
  302. data/spec/table_spec.rb +0 -1527
  303. data/spec/text_at_spec.rb +0 -115
  304. data/spec/text_box_spec.rb +0 -1034
  305. data/spec/text_rendering_mode_spec.rb +0 -45
  306. data/spec/text_spacing_spec.rb +0 -93
  307. data/spec/text_spec.rb +0 -437
  308. data/spec/text_with_inline_formatting_spec.rb +0 -35
  309. data/spec/transparency_spec.rb +0 -91
@@ -0,0 +1,229 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'set'
5
+ require 'pathname'
6
+
7
+ describe Prawn::Images do
8
+ let(:pdf) { create_pdf }
9
+ let(:filename) { "#{Prawn::DATADIR}/images/pigs.jpg" }
10
+
11
+ it "onlies embed an image once, even if it's added multiple times" do
12
+ pdf.image filename, at: [100, 100]
13
+ pdf.image filename, at: [300, 300]
14
+
15
+ output = pdf.render
16
+ images = PDF::Inspector::XObject.analyze(output)
17
+ # there should be 2 images in the page resources
18
+ expect(images.page_xobjects.first.size).to eq(2)
19
+ # but only 1 image xobject
20
+ expect(output.scan(%r{/Type /XObject}).size).to eq(1)
21
+ end
22
+
23
+ it 'returns the image info object' do
24
+ info = pdf.image(filename)
25
+
26
+ expect(info).to be_a_kind_of(Prawn::Images::JPG)
27
+
28
+ expect(info.height).to eq(453)
29
+ end
30
+
31
+ it 'accepts IO objects' do
32
+ info =
33
+ File.open(filename, 'rb') do |file|
34
+ pdf.image(file)
35
+ end
36
+
37
+ expect(info.height).to eq(453)
38
+ end
39
+
40
+ it 'rewinds IO objects to be able to embed them multiply' do
41
+ info =
42
+ File.open(filename, 'rb') do |file|
43
+ pdf.image(file)
44
+ pdf.image(file)
45
+ end
46
+
47
+ expect(info.height).to eq(453)
48
+ end
49
+
50
+ it 'does not close passed-in IO objects' do
51
+ File.open(filename, 'rb') do |file|
52
+ pdf.image(file)
53
+
54
+ expect(file).to_not be_closed
55
+ end
56
+ end
57
+
58
+ it 'accepts Pathname objects' do
59
+ info = pdf.image(Pathname.new(filename))
60
+ expect(info.height).to eq(453)
61
+ end
62
+
63
+ describe 'closes opened files again after getting Pathnames', issue: 975 do
64
+ describe 'spec with File message spy' do
65
+ let(:not_filename) { 'non-existent filename' }
66
+ let(:pathname_double) { instance_double('Pathname', file?: true) }
67
+
68
+ before do
69
+ file_content = File.new(filename, 'rb').read
70
+ allow(Pathname).to receive(:new).with(not_filename) { pathname_double }
71
+ allow(pathname_double).to receive(:binread) { file_content }
72
+ end
73
+
74
+ it 'uses only binread, which closes opened files' do
75
+ # this implicitly tests that a file handle is closed again
76
+ # because only stubbed binread can be called on not_filename
77
+ _info = pdf.image(not_filename)
78
+ expect(pathname_double).to have_received(:binread)
79
+ end
80
+ end
81
+
82
+ system_has_lsof = system('lsof -v > /dev/null 2>&1')
83
+ system_has_grep = system('grep --version > /dev/null 2>&1')
84
+ if system_has_lsof && system_has_grep
85
+ it 'closes opened files, spec with lsof' do
86
+ gc_was_disabled = GC.disable # GC of File would close the file
87
+ open_before = `lsof -c ruby | grep "#{filename}"`
88
+ _info = pdf.image(Pathname.new(filename))
89
+ open_after = `lsof -c ruby | grep "#{filename}"`
90
+ GC.enable unless gc_was_disabled
91
+ expect(open_after).to eq(open_before)
92
+ end
93
+ end
94
+
95
+ if RUBY_PLATFORM != 'java'
96
+ it 'closes opened files, spec with ObjectSpace' do
97
+ gc_was_disabled = GC.disable # GC of File would close the file
98
+ open_before = ObjectSpace.each_object(File).count { |f| !f.closed? }
99
+ _info = pdf.image(Pathname.new(filename))
100
+ open_after = ObjectSpace.each_object(File).count { |f| !f.closed? }
101
+ GC.enable unless gc_was_disabled
102
+ expect(open_after).to eq(open_before)
103
+ end
104
+ end
105
+ end
106
+
107
+ describe 'setting the length of the bytestream' do
108
+ it 'correctlies work with images from Pathname objects' do
109
+ pdf.image(Pathname.new(filename))
110
+ expect(pdf).to have_parseable_xobjects
111
+ end
112
+
113
+ it 'correctlies work with images from IO objects' do
114
+ pdf.image(File.open(filename, 'rb'))
115
+ expect(pdf).to have_parseable_xobjects
116
+ end
117
+
118
+ it 'correctlies work with images from IO objects not set to mode rb' do
119
+ pdf.image(File.open(filename, 'r'))
120
+ expect(pdf).to have_parseable_xobjects
121
+ end
122
+ end
123
+
124
+ it 'raise_errors an UnsupportedImageType if passed a BMP' do
125
+ filename = "#{Prawn::DATADIR}/images/tru256.bmp"
126
+ expect { pdf.image filename, at: [100, 100] }
127
+ .to raise_error(Prawn::Errors::UnsupportedImageType)
128
+ end
129
+
130
+ it 'raise_errors an UnsupportedImageType if passed an interlaced PNG' do
131
+ filename = "#{Prawn::DATADIR}/images/dice_interlaced.png"
132
+ expect { pdf.image filename, at: [100, 100] }
133
+ .to raise_error(Prawn::Errors::UnsupportedImageType)
134
+ end
135
+
136
+ it 'bumps PDF version to 1.5 or greater on embedding 16-bit PNGs' do
137
+ pdf.image "#{Prawn::DATADIR}/images/16bit.png"
138
+ expect(pdf.state.version).to be >= 1.5
139
+ end
140
+
141
+ it 'embeds 16-bit alpha channels for 16-bit PNGs' do
142
+ pdf.image "#{Prawn::DATADIR}/images/16bit.png"
143
+
144
+ output = pdf.render
145
+ expect(output).to match(%r{/BitsPerComponent 16})
146
+ expect(output).to_not match(%r{/BitsPerComponent 8})
147
+ end
148
+
149
+ it 'flows an image to a new page if it will not fit on a page' do
150
+ pdf.image filename, fit: [600, 600]
151
+ pdf.image filename, fit: [600, 600]
152
+ output = StringIO.new(pdf.render, 'r+')
153
+ hash = PDF::Reader::ObjectHash.new(output)
154
+ pages = hash.values.find do |obj|
155
+ obj.is_a?(Hash) && obj[:Type] == :Pages
156
+ end[:Kids]
157
+ expect(pages.size).to eq(2)
158
+ expect(hash[pages[0]][:Resources][:XObject].keys).to eq([:I1])
159
+ expect(hash[pages[1]][:Resources][:XObject].keys).to eq([:I2])
160
+ end
161
+
162
+ it 'does not flow an image to a new page if it will fit on one page' do
163
+ pdf.image filename, fit: [400, 400]
164
+ pdf.image filename, fit: [400, 400]
165
+ output = StringIO.new(pdf.render, 'r+')
166
+ hash = PDF::Reader::ObjectHash.new(output)
167
+ pages = hash.values.find do |obj|
168
+ obj.is_a?(Hash) && obj[:Type] == :Pages
169
+ end[:Kids]
170
+ expect(pages.size).to eq(1)
171
+ expect(Set.new(hash[pages[0]][:Resources][:XObject].keys)).to eq(
172
+ Set.new(%i[I1 I2])
173
+ )
174
+ end
175
+
176
+ it 'does not start a new page just for a stretchy bounding box' do
177
+ allow(pdf).to receive(:start_new_page)
178
+ pdf.bounding_box([0, pdf.cursor], width: pdf.bounds.width) do
179
+ pdf.image filename
180
+ end
181
+ expect(pdf).to_not have_received(:start_new_page)
182
+ end
183
+
184
+ describe ':fit option' do
185
+ it 'fits inside the defined constraints' do
186
+ info = pdf.image filename, fit: [100, 400]
187
+ expect(info.scaled_width).to be <= 100
188
+ expect(info.scaled_height).to be <= 400
189
+
190
+ info = pdf.image filename, fit: [400, 100]
191
+ expect(info.scaled_width).to be <= 400
192
+ expect(info.scaled_height).to be <= 100
193
+
194
+ info = pdf.image filename, fit: [604, 453]
195
+ expect(info.scaled_width).to eq(604)
196
+ expect(info.scaled_height).to eq(453)
197
+ end
198
+
199
+ it 'moves text position' do
200
+ y = pdf.y
201
+ pdf.image filename, fit: [100, 400]
202
+ expect(pdf.y).to be < y
203
+ end
204
+ end
205
+
206
+ describe ':at option' do
207
+ it 'does not move text position' do
208
+ y = pdf.y
209
+ pdf.image filename, at: [100, 400]
210
+ expect(pdf.y).to eq(y)
211
+ end
212
+ end
213
+
214
+ describe ':width option without :height option' do
215
+ it 'scales the width and height' do
216
+ info = pdf.image filename, width: 225
217
+ expect(info.scaled_height).to eq(168.75)
218
+ expect(info.scaled_width).to eq(225.0)
219
+ end
220
+ end
221
+
222
+ describe ':height option without :width option' do
223
+ it 'scales the width and height' do
224
+ info = pdf.image filename, height: 225
225
+ expect(info.scaled_height).to eq(225.0)
226
+ expect(info.scaled_width).to eq(300.0)
227
+ end
228
+ end
229
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'prawn/measurement_extensions'
5
+
6
+ describe Prawn::Measurements do
7
+ describe 'Numeric extensions' do
8
+ it 'converts units to PostScriptPoints' do
9
+ expect(1.mm).to be_within(0.000000001).of(2.834645669)
10
+ expect(1.mm).to eq(72 / 25.4)
11
+ expect(2.mm).to eq(2 * 72 / 25.4)
12
+ expect(3.mm).to eq(3 * 72 / 25.4)
13
+ expect(-3.mm).to eq(-3 * 72 / 25.4)
14
+ expect(1.cm).to eq(10 * 72 / 25.4)
15
+ expect(1.dm).to eq(100 * 72 / 25.4)
16
+ expect(1.m).to eq(1000 * 72 / 25.4)
17
+
18
+ expect(1.in).to eq(72)
19
+ expect(1.ft).to eq(72 * 12)
20
+ expect(1.yd).to eq(72 * 12 * 3)
21
+ expect(1.pt).to eq(1)
22
+ end
23
+ end
24
+ end