prawn 0.13.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 (348) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data/.yardopts +10 -0
  4. data/GPLv2 +20 -21
  5. data/Gemfile +3 -16
  6. data/Rakefile +17 -39
  7. data/lib/prawn/document/bounding_box.rb +85 -42
  8. data/lib/prawn/document/column_box.rb +21 -11
  9. data/lib/prawn/document/internals.rb +40 -147
  10. data/lib/prawn/document/span.rb +25 -17
  11. data/lib/prawn/document.rb +286 -245
  12. data/lib/prawn/encoding.rb +68 -101
  13. data/lib/prawn/errors.rb +47 -43
  14. data/lib/prawn/font.rb +204 -155
  15. data/lib/prawn/font_metric_cache.rb +25 -21
  16. data/lib/prawn/fonts/afm.rb +292 -0
  17. data/lib/prawn/{font → fonts}/dfont.rb +7 -13
  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 +142 -80
  21. data/lib/prawn/graphics/blend_mode.rb +65 -0
  22. data/lib/prawn/graphics/cap_style.rb +6 -5
  23. data/lib/prawn/graphics/color.rb +47 -44
  24. data/lib/prawn/graphics/dash.rb +30 -13
  25. data/lib/prawn/graphics/join_style.rb +13 -6
  26. data/lib/prawn/graphics/patterns.rb +221 -90
  27. data/lib/prawn/graphics/transformation.rb +21 -12
  28. data/lib/prawn/graphics/transparency.rb +21 -17
  29. data/lib/prawn/graphics.rb +155 -128
  30. data/lib/prawn/{layout/grid.rb → grid.rb} +110 -47
  31. data/lib/prawn/image_handler.rb +16 -2
  32. data/lib/prawn/images/image.rb +4 -2
  33. data/lib/prawn/images/jpg.rb +39 -30
  34. data/lib/prawn/images/png.rb +132 -169
  35. data/lib/prawn/images.rb +70 -62
  36. data/lib/prawn/measurement_extensions.rb +15 -10
  37. data/lib/prawn/measurements.rb +22 -23
  38. data/lib/prawn/outline.rb +301 -13
  39. data/lib/prawn/repeater.rb +19 -17
  40. data/lib/prawn/security/arcfour.rb +54 -0
  41. data/lib/prawn/security.rb +108 -86
  42. data/lib/prawn/soft_mask.rb +40 -41
  43. data/lib/prawn/stamp.rb +29 -12
  44. data/lib/prawn/text/box.rb +27 -29
  45. data/lib/prawn/text/formatted/arranger.rb +110 -67
  46. data/lib/prawn/text/formatted/box.rb +233 -165
  47. data/lib/prawn/text/formatted/fragment.rb +27 -27
  48. data/lib/prawn/text/formatted/line_wrap.rb +137 -97
  49. data/lib/prawn/text/formatted/parser.rb +149 -127
  50. data/lib/prawn/text/formatted/wrap.rb +57 -37
  51. data/lib/prawn/text/formatted.rb +6 -4
  52. data/lib/prawn/text.rb +105 -73
  53. data/lib/prawn/transformation_stack.rb +44 -0
  54. data/lib/prawn/utilities.rb +11 -21
  55. data/lib/prawn/version.rb +5 -0
  56. data/lib/prawn/view.rb +101 -0
  57. data/lib/prawn.rb +42 -68
  58. data/{data/images/fractal.jpg → manual/absolute_position.pdf} +0 -0
  59. data/manual/basic_concepts/adding_pages.rb +9 -10
  60. data/manual/basic_concepts/basic_concepts.rb +33 -24
  61. data/manual/basic_concepts/creation.rb +10 -11
  62. data/manual/basic_concepts/cursor.rb +9 -10
  63. data/manual/basic_concepts/measurement.rb +10 -11
  64. data/manual/basic_concepts/origin.rb +8 -9
  65. data/manual/basic_concepts/other_cursor_helpers.rb +17 -18
  66. data/manual/basic_concepts/view.rb +48 -0
  67. data/manual/bounding_box/bounding_box.rb +31 -29
  68. data/manual/bounding_box/bounds.rb +17 -18
  69. data/manual/bounding_box/canvas.rb +8 -9
  70. data/manual/bounding_box/creation.rb +8 -9
  71. data/manual/bounding_box/indentation.rb +22 -23
  72. data/manual/bounding_box/nesting.rb +32 -25
  73. data/manual/bounding_box/russian_boxes.rb +19 -19
  74. data/manual/bounding_box/stretchy.rb +18 -20
  75. data/manual/contents.rb +35 -0
  76. data/manual/cover.rb +43 -0
  77. data/manual/document_and_page_options/background.rb +16 -14
  78. data/manual/document_and_page_options/document_and_page_options.rb +26 -23
  79. data/manual/document_and_page_options/metadata.rb +21 -19
  80. data/manual/document_and_page_options/page_margins.rb +20 -22
  81. data/manual/document_and_page_options/page_size.rb +15 -15
  82. data/manual/document_and_page_options/print_scaling.rb +23 -0
  83. data/manual/example_helper.rb +5 -408
  84. data/manual/graphics/blend_mode.rb +52 -0
  85. data/manual/graphics/circle_and_ellipse.rb +8 -9
  86. data/manual/graphics/color.rb +11 -13
  87. data/manual/graphics/common_lines.rb +13 -12
  88. data/manual/graphics/fill_and_stroke.rb +10 -11
  89. data/manual/graphics/fill_rules.rb +13 -12
  90. data/manual/graphics/gradients.rb +28 -22
  91. data/manual/graphics/graphics.rb +52 -46
  92. data/manual/graphics/helper.rb +20 -10
  93. data/manual/graphics/line_width.rb +13 -12
  94. data/manual/graphics/lines_and_curves.rb +13 -14
  95. data/manual/graphics/polygon.rb +10 -12
  96. data/manual/graphics/rectangle.rb +7 -8
  97. data/manual/graphics/rotate.rb +9 -12
  98. data/manual/graphics/scale.rb +19 -18
  99. data/manual/graphics/soft_masks.rb +5 -7
  100. data/manual/graphics/stroke_cap.rb +10 -11
  101. data/manual/graphics/stroke_dash.rb +16 -17
  102. data/manual/graphics/stroke_join.rb +10 -11
  103. data/manual/graphics/translate.rb +13 -13
  104. data/manual/graphics/transparency.rb +11 -13
  105. data/manual/{manual/how_to_read_this_manual.rb → how_to_read_this_manual.rb} +23 -25
  106. data/manual/images/absolute_position.rb +9 -10
  107. data/manual/images/fit.rb +9 -10
  108. data/manual/images/horizontal.rb +13 -14
  109. data/manual/images/images.rb +31 -30
  110. data/manual/images/plain_image.rb +6 -7
  111. data/manual/images/scale.rb +12 -13
  112. data/manual/images/vertical.rb +19 -17
  113. data/manual/images/width_and_height.rb +13 -14
  114. data/manual/layout/boxes.rb +14 -15
  115. data/manual/layout/content.rb +12 -13
  116. data/manual/layout/layout.rb +19 -20
  117. data/manual/layout/simple_grid.rb +8 -9
  118. data/manual/outline/add_subsection_to.rb +26 -27
  119. data/manual/outline/insert_section_after.rb +19 -20
  120. data/manual/outline/outline.rb +23 -22
  121. data/manual/outline/sections_and_pages.rb +24 -25
  122. data/manual/repeatable_content/alternate_page_numbering.rb +36 -0
  123. data/manual/repeatable_content/page_numbering.rb +20 -19
  124. data/manual/repeatable_content/repeatable_content.rb +26 -22
  125. data/manual/repeatable_content/repeater.rb +18 -19
  126. data/manual/repeatable_content/stamp.rb +18 -19
  127. data/manual/security/encryption.rb +8 -11
  128. data/manual/security/permissions.rb +20 -15
  129. data/manual/security/security.rb +20 -20
  130. data/manual/table.rb +16 -0
  131. data/manual/text/alignment.rb +17 -18
  132. data/manual/text/color.rb +13 -13
  133. data/manual/text/column_box.rb +10 -12
  134. data/manual/text/fallback_fonts.rb +29 -25
  135. data/manual/text/font.rb +17 -18
  136. data/manual/text/font_size.rb +21 -22
  137. data/manual/text/font_style.rb +12 -10
  138. data/manual/text/formatted_callbacks.rb +36 -26
  139. data/manual/text/formatted_text.rb +41 -34
  140. data/manual/text/free_flowing_text.rb +28 -29
  141. data/manual/text/inline.rb +23 -26
  142. data/manual/text/kerning_and_character_spacing.rb +20 -21
  143. data/manual/text/leading.rb +10 -11
  144. data/manual/text/line_wrapping.rb +40 -21
  145. data/manual/text/paragraph_indentation.rb +17 -12
  146. data/manual/text/positioned_text.rb +19 -20
  147. data/manual/text/registering_families.rb +33 -30
  148. data/manual/text/rendering_and_color.rb +11 -12
  149. data/manual/text/right_to_left_text.rb +31 -20
  150. data/manual/text/rotation.rb +36 -27
  151. data/manual/text/single_usage.rb +13 -14
  152. data/manual/text/text.rb +62 -62
  153. data/manual/text/text_box_excess.rb +22 -19
  154. data/manual/text/text_box_extensions.rb +21 -18
  155. data/manual/text/text_box_overflow.rb +28 -21
  156. data/manual/text/utf8.rb +16 -17
  157. data/manual/text/win_ansi_charset.rb +29 -26
  158. data/prawn.gemspec +45 -43
  159. data/spec/extensions/encoding_helpers.rb +4 -3
  160. data/spec/prawn/document/bounding_box_spec.rb +550 -0
  161. data/spec/prawn/document/column_box_spec.rb +75 -0
  162. data/spec/prawn/document/security_spec.rb +176 -0
  163. data/spec/prawn/document_annotations_spec.rb +76 -0
  164. data/spec/prawn/document_destinations_spec.rb +15 -0
  165. data/spec/prawn/document_grid_spec.rb +99 -0
  166. data/spec/prawn/document_reference_spec.rb +27 -0
  167. data/spec/prawn/document_span_spec.rb +44 -0
  168. data/spec/prawn/document_spec.rb +805 -0
  169. data/spec/prawn/font_metric_cache_spec.rb +54 -0
  170. data/spec/prawn/font_spec.rb +544 -0
  171. data/spec/prawn/graphics/blend_mode_spec.rb +63 -0
  172. data/spec/prawn/graphics/transparency_spec.rb +81 -0
  173. data/spec/prawn/graphics_spec.rb +872 -0
  174. data/spec/prawn/graphics_stroke_styles_spec.rb +229 -0
  175. data/spec/prawn/image_handler_spec.rb +53 -0
  176. data/spec/prawn/images/jpg_spec.rb +20 -0
  177. data/spec/prawn/images/png_spec.rb +283 -0
  178. data/spec/prawn/images_spec.rb +229 -0
  179. data/spec/prawn/measurements_extensions_spec.rb +24 -0
  180. data/spec/prawn/outline_spec.rb +512 -0
  181. data/spec/prawn/repeater_spec.rb +166 -0
  182. data/spec/prawn/soft_mask_spec.rb +74 -0
  183. data/spec/prawn/stamp_spec.rb +173 -0
  184. data/spec/prawn/text/box_spec.rb +1110 -0
  185. data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
  186. data/spec/prawn/text/formatted/box_spec.rb +849 -0
  187. data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
  188. data/spec/prawn/text/formatted/line_wrap_spec.rb +495 -0
  189. data/spec/prawn/text/formatted/parser_spec.rb +697 -0
  190. data/spec/prawn/text_draw_text_spec.rb +150 -0
  191. data/spec/prawn/text_rendering_mode_spec.rb +48 -0
  192. data/spec/prawn/text_spacing_spec.rb +95 -0
  193. data/spec/prawn/text_spec.rb +603 -0
  194. data/spec/prawn/text_with_inline_formatting_spec.rb +35 -0
  195. data/spec/prawn/transformation_stack_spec.rb +66 -0
  196. data/spec/prawn/view_spec.rb +63 -0
  197. data/spec/prawn_manual_spec.rb +35 -0
  198. data/spec/spec_helper.rb +22 -21
  199. data.tar.gz.sig +0 -0
  200. metadata +168 -307
  201. metadata.gz.sig +0 -0
  202. data/README.md +0 -109
  203. data/data/encodings/win_ansi.txt +0 -29
  204. data/data/images/16bit.alpha +0 -0
  205. data/data/images/16bit.dat +0 -0
  206. data/data/images/16bit.png +0 -0
  207. data/data/images/arrow.png +0 -0
  208. data/data/images/arrow2.png +0 -0
  209. data/data/images/barcode_issue.png +0 -0
  210. data/data/images/dice.alpha +0 -0
  211. data/data/images/dice.dat +0 -0
  212. data/data/images/dice.png +0 -0
  213. data/data/images/dice_interlaced.png +0 -0
  214. data/data/images/indexed_color.dat +0 -0
  215. data/data/images/indexed_color.png +0 -0
  216. data/data/images/letterhead.jpg +0 -0
  217. data/data/images/page_white_text.alpha +0 -0
  218. data/data/images/page_white_text.dat +0 -0
  219. data/data/images/page_white_text.png +0 -0
  220. data/data/images/pigs.jpg +0 -0
  221. data/data/images/prawn.png +0 -0
  222. data/data/images/ruport.png +0 -0
  223. data/data/images/ruport_data.dat +0 -0
  224. data/data/images/ruport_transparent.png +0 -0
  225. data/data/images/ruport_type0.png +0 -0
  226. data/data/images/stef.jpg +0 -0
  227. data/data/images/tru256.bmp +0 -0
  228. data/data/images/web-links.dat +0 -1
  229. data/data/images/web-links.png +0 -0
  230. data/data/pdfs/complex_template.pdf +0 -0
  231. data/data/pdfs/contains_ttf_font.pdf +0 -0
  232. data/data/pdfs/encrypted.pdf +0 -0
  233. data/data/pdfs/form.pdf +1 -819
  234. data/data/pdfs/hexagon.pdf +0 -61
  235. data/data/pdfs/indirect_reference.pdf +0 -86
  236. data/data/pdfs/multipage_template.pdf +0 -127
  237. data/data/pdfs/nested_pages.pdf +0 -118
  238. data/data/pdfs/page_without_mediabox.pdf +0 -193
  239. data/data/pdfs/resources_as_indirect_object.pdf +0 -83
  240. data/data/pdfs/two_hexagons.pdf +0 -90
  241. data/data/pdfs/version_1_6.pdf +0 -61
  242. data/data/shift_jis_text.txt +0 -1
  243. data/lib/pdf/core/annotations.rb +0 -60
  244. data/lib/pdf/core/byte_string.rb +0 -9
  245. data/lib/pdf/core/destinations.rb +0 -90
  246. data/lib/pdf/core/document_state.rb +0 -78
  247. data/lib/pdf/core/filter_list.rb +0 -51
  248. data/lib/pdf/core/filters.rb +0 -36
  249. data/lib/pdf/core/graphics_state.rb +0 -68
  250. data/lib/pdf/core/literal_string.rb +0 -16
  251. data/lib/pdf/core/name_tree.rb +0 -177
  252. data/lib/pdf/core/object_store.rb +0 -320
  253. data/lib/pdf/core/outline.rb +0 -315
  254. data/lib/pdf/core/page.rb +0 -212
  255. data/lib/pdf/core/page_geometry.rb +0 -126
  256. data/lib/pdf/core/pdf_object.rb +0 -124
  257. data/lib/pdf/core/reference.rb +0 -103
  258. data/lib/pdf/core/stream.rb +0 -98
  259. data/lib/pdf/core/text.rb +0 -275
  260. data/lib/pdf/core.rb +0 -35
  261. data/lib/prawn/compatibility.rb +0 -91
  262. data/lib/prawn/document/graphics_state.rb +0 -73
  263. data/lib/prawn/document/snapshot.rb +0 -89
  264. data/lib/prawn/font/afm.rb +0 -203
  265. data/lib/prawn/layout.rb +0 -20
  266. data/lib/prawn/table/cell/image.rb +0 -70
  267. data/lib/prawn/table/cell/in_table.rb +0 -27
  268. data/lib/prawn/table/cell/span_dummy.rb +0 -92
  269. data/lib/prawn/table/cell/subtable.rb +0 -65
  270. data/lib/prawn/table/cell/text.rb +0 -153
  271. data/lib/prawn/table/cell.rb +0 -770
  272. data/lib/prawn/table/cells.rb +0 -295
  273. data/lib/prawn/table.rb +0 -643
  274. data/manual/example_file.rb +0 -116
  275. data/manual/example_package.rb +0 -53
  276. data/manual/example_section.rb +0 -46
  277. data/manual/manual/cover.rb +0 -35
  278. data/manual/manual/foreword.rb +0 -85
  279. data/manual/manual/manual.rb +0 -35
  280. data/manual/syntax_highlight.rb +0 -52
  281. data/manual/table/basic_block.rb +0 -53
  282. data/manual/table/before_rendering_page.rb +0 -26
  283. data/manual/table/cell_border_lines.rb +0 -24
  284. data/manual/table/cell_borders_and_bg.rb +0 -31
  285. data/manual/table/cell_dimensions.rb +0 -30
  286. data/manual/table/cell_text.rb +0 -38
  287. data/manual/table/column_widths.rb +0 -30
  288. data/manual/table/content_and_subtables.rb +0 -39
  289. data/manual/table/creation.rb +0 -27
  290. data/manual/table/filtering.rb +0 -36
  291. data/manual/table/flow_and_header.rb +0 -17
  292. data/manual/table/image_cells.rb +0 -33
  293. data/manual/table/position.rb +0 -29
  294. data/manual/table/row_colors.rb +0 -20
  295. data/manual/table/span.rb +0 -30
  296. data/manual/table/style.rb +0 -22
  297. data/manual/table/table.rb +0 -52
  298. data/manual/table/width.rb +0 -27
  299. data/manual/templates/full_template.rb +0 -25
  300. data/manual/templates/page_template.rb +0 -48
  301. data/manual/templates/templates.rb +0 -27
  302. data/manual/text/group.rb +0 -29
  303. data/spec/acceptance/png.rb +0 -23
  304. data/spec/annotations_spec.rb +0 -74
  305. data/spec/bounding_box_spec.rb +0 -493
  306. data/spec/cell_spec.rb +0 -628
  307. data/spec/column_box_spec.rb +0 -33
  308. data/spec/destinations_spec.rb +0 -15
  309. data/spec/document_spec.rb +0 -761
  310. data/spec/extensions/mocha.rb +0 -44
  311. data/spec/filters_spec.rb +0 -34
  312. data/spec/font_metric_cache_spec.rb +0 -52
  313. data/spec/font_spec.rb +0 -464
  314. data/spec/formatted_text_arranger_spec.rb +0 -421
  315. data/spec/formatted_text_box_spec.rb +0 -650
  316. data/spec/formatted_text_fragment_spec.rb +0 -298
  317. data/spec/graphics_spec.rb +0 -651
  318. data/spec/grid_spec.rb +0 -85
  319. data/spec/image_handler_spec.rb +0 -42
  320. data/spec/images_spec.rb +0 -157
  321. data/spec/inline_formatted_text_parser_spec.rb +0 -564
  322. data/spec/jpg_spec.rb +0 -25
  323. data/spec/line_wrap_spec.rb +0 -333
  324. data/spec/measurement_units_spec.rb +0 -23
  325. data/spec/name_tree_spec.rb +0 -112
  326. data/spec/object_store_spec.rb +0 -170
  327. data/spec/outline_spec.rb +0 -448
  328. data/spec/pdf_object_spec.rb +0 -172
  329. data/spec/png_spec.rb +0 -240
  330. data/spec/reference_spec.rb +0 -82
  331. data/spec/repeater_spec.rb +0 -158
  332. data/spec/security_spec.rb +0 -158
  333. data/spec/snapshot_spec.rb +0 -186
  334. data/spec/soft_mask_spec.rb +0 -117
  335. data/spec/span_spec.rb +0 -44
  336. data/spec/stamp_spec.rb +0 -158
  337. data/spec/stream_spec.rb +0 -58
  338. data/spec/stroke_styles_spec.rb +0 -211
  339. data/spec/table/span_dummy_spec.rb +0 -17
  340. data/spec/table_spec.rb +0 -1355
  341. data/spec/template_spec.rb +0 -351
  342. data/spec/text_at_spec.rb +0 -130
  343. data/spec/text_box_spec.rb +0 -1030
  344. data/spec/text_rendering_mode_spec.rb +0 -45
  345. data/spec/text_spacing_spec.rb +0 -93
  346. data/spec/text_spec.rb +0 -425
  347. data/spec/text_with_inline_formatting_spec.rb +0 -35
  348. data/spec/transparency_spec.rb +0 -89
@@ -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