prawn 2.0.2 → 2.3.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 (277) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/GPLv2 +20 -21
  5. data/Gemfile +3 -9
  6. data/Rakefile +20 -23
  7. data/lib/prawn.rb +37 -49
  8. data/lib/prawn/document.rb +181 -133
  9. data/lib/prawn/document/bounding_box.rb +41 -29
  10. data/lib/prawn/document/column_box.rb +7 -7
  11. data/lib/prawn/document/internals.rb +18 -8
  12. data/lib/prawn/document/span.rb +21 -16
  13. data/lib/prawn/encoding.rb +69 -68
  14. data/lib/prawn/errors.rb +12 -7
  15. data/lib/prawn/font.rb +115 -69
  16. data/lib/prawn/font_metric_cache.rb +14 -8
  17. data/lib/prawn/{font → fonts}/afm.rb +102 -68
  18. data/lib/prawn/{font → fonts}/dfont.rb +5 -11
  19. data/lib/prawn/fonts/otf.rb +11 -0
  20. data/lib/prawn/fonts/ttc.rb +36 -0
  21. data/lib/prawn/{font → fonts}/ttf.rb +87 -68
  22. data/lib/prawn/graphics.rb +120 -80
  23. data/lib/prawn/graphics/blend_mode.rb +65 -0
  24. data/lib/prawn/graphics/cap_style.rb +3 -3
  25. data/lib/prawn/graphics/color.rb +27 -25
  26. data/lib/prawn/graphics/dash.rb +23 -11
  27. data/lib/prawn/graphics/join_style.rb +9 -3
  28. data/lib/prawn/graphics/patterns.rb +197 -67
  29. data/lib/prawn/graphics/transformation.rb +17 -8
  30. data/lib/prawn/graphics/transparency.rb +17 -13
  31. data/lib/prawn/grid.rb +48 -47
  32. data/lib/prawn/image_handler.rb +5 -5
  33. data/lib/prawn/images.rb +39 -30
  34. data/lib/prawn/images/image.rb +2 -1
  35. data/lib/prawn/images/jpg.rb +28 -22
  36. data/lib/prawn/images/png.rb +107 -66
  37. data/lib/prawn/measurement_extensions.rb +10 -9
  38. data/lib/prawn/measurements.rb +19 -15
  39. data/lib/prawn/outline.rb +97 -77
  40. data/lib/prawn/repeater.rb +14 -10
  41. data/lib/prawn/security.rb +81 -61
  42. data/lib/prawn/security/arcfour.rb +2 -2
  43. data/lib/prawn/soft_mask.rb +26 -26
  44. data/lib/prawn/stamp.rb +20 -13
  45. data/lib/prawn/text.rb +68 -52
  46. data/lib/prawn/text/box.rb +11 -8
  47. data/lib/prawn/text/formatted.rb +5 -5
  48. data/lib/prawn/text/formatted/arranger.rb +78 -49
  49. data/lib/prawn/text/formatted/box.rb +134 -100
  50. data/lib/prawn/text/formatted/fragment.rb +11 -14
  51. data/lib/prawn/text/formatted/line_wrap.rb +121 -63
  52. data/lib/prawn/text/formatted/parser.rb +139 -117
  53. data/lib/prawn/text/formatted/wrap.rb +43 -31
  54. data/lib/prawn/transformation_stack.rb +44 -0
  55. data/lib/prawn/utilities.rb +7 -22
  56. data/lib/prawn/version.rb +2 -2
  57. data/lib/prawn/view.rb +17 -7
  58. data/manual/basic_concepts/adding_pages.rb +6 -7
  59. data/manual/basic_concepts/basic_concepts.rb +31 -22
  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 +6 -7
  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 +22 -16
  66. data/manual/bounding_box/bounding_box.rb +29 -24
  67. data/manual/bounding_box/bounds.rb +11 -12
  68. data/manual/bounding_box/canvas.rb +4 -5
  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 +24 -17
  72. data/manual/bounding_box/russian_boxes.rb +14 -13
  73. data/manual/bounding_box/stretchy.rb +12 -13
  74. data/manual/contents.rb +28 -22
  75. data/manual/cover.rb +33 -28
  76. data/manual/document_and_page_options/background.rb +11 -13
  77. data/manual/document_and_page_options/document_and_page_options.rb +25 -20
  78. data/manual/document_and_page_options/metadata.rb +18 -16
  79. data/manual/document_and_page_options/page_margins.rb +18 -20
  80. data/manual/document_and_page_options/page_size.rb +13 -12
  81. data/manual/document_and_page_options/print_scaling.rb +17 -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 +4 -5
  88. data/manual/graphics/fill_rules.rb +9 -10
  89. data/manual/graphics/gradients.rb +27 -21
  90. data/manual/graphics/graphics.rb +48 -39
  91. data/manual/graphics/helper.rb +12 -9
  92. data/manual/graphics/line_width.rb +8 -7
  93. data/manual/graphics/lines_and_curves.rb +7 -8
  94. data/manual/graphics/polygon.rb +6 -8
  95. data/manual/graphics/rectangle.rb +4 -5
  96. data/manual/graphics/rotate.rb +6 -7
  97. data/manual/graphics/scale.rb +14 -15
  98. data/manual/graphics/soft_masks.rb +4 -5
  99. data/manual/graphics/stroke_cap.rb +6 -7
  100. data/manual/graphics/stroke_dash.rb +11 -12
  101. data/manual/graphics/stroke_join.rb +5 -6
  102. data/manual/graphics/translate.rb +9 -10
  103. data/manual/graphics/transparency.rb +7 -8
  104. data/manual/how_to_read_this_manual.rb +6 -6
  105. data/manual/images/absolute_position.rb +6 -7
  106. data/manual/images/fit.rb +7 -8
  107. data/manual/images/horizontal.rb +9 -10
  108. data/manual/images/images.rb +28 -24
  109. data/manual/images/plain_image.rb +5 -6
  110. data/manual/images/scale.rb +9 -10
  111. data/manual/images/vertical.rb +13 -14
  112. data/manual/images/width_and_height.rb +10 -11
  113. data/manual/layout/boxes.rb +5 -6
  114. data/manual/layout/content.rb +7 -8
  115. data/manual/layout/layout.rb +18 -16
  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 +21 -17
  120. data/manual/outline/sections_and_pages.rb +17 -18
  121. data/manual/repeatable_content/alternate_page_numbering.rb +21 -17
  122. data/manual/repeatable_content/page_numbering.rb +17 -16
  123. data/manual/repeatable_content/repeatable_content.rb +25 -19
  124. data/manual/repeatable_content/repeater.rb +14 -15
  125. data/manual/repeatable_content/stamp.rb +14 -15
  126. data/manual/security/encryption.rb +9 -10
  127. data/manual/security/permissions.rb +19 -14
  128. data/manual/security/security.rb +19 -16
  129. data/manual/table.rb +3 -3
  130. data/manual/text/alignment.rb +16 -17
  131. data/manual/text/color.rb +12 -11
  132. data/manual/text/column_box.rb +9 -10
  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 +7 -8
  137. data/manual/text/formatted_callbacks.rb +25 -21
  138. data/manual/text/formatted_text.rb +33 -25
  139. data/manual/text/free_flowing_text.rb +20 -21
  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 +13 -14
  145. data/manual/text/positioned_text.rb +15 -16
  146. data/manual/text/registering_families.rb +20 -21
  147. data/manual/text/rendering_and_color.rb +9 -10
  148. data/manual/text/right_to_left_text.rb +26 -19
  149. data/manual/text/rotation.rb +28 -23
  150. data/manual/text/single_usage.rb +8 -9
  151. data/manual/text/text.rb +57 -52
  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 +18 -19
  155. data/manual/text/utf8.rb +11 -12
  156. data/manual/text/win_ansi_charset.rb +21 -19
  157. data/prawn.gemspec +45 -33
  158. data/spec/extensions/encoding_helpers.rb +3 -3
  159. data/spec/prawn/document/bounding_box_spec.rb +546 -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 +36 -0
  167. data/spec/prawn/document_spec.rb +802 -0
  168. data/spec/prawn/font_metric_cache_spec.rb +54 -0
  169. data/spec/prawn/font_spec.rb +542 -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 +837 -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 +224 -0
  178. data/spec/prawn/measurements_extensions_spec.rb +24 -0
  179. data/spec/prawn/outline_spec.rb +412 -0
  180. data/spec/prawn/repeater_spec.rb +165 -0
  181. data/spec/prawn/soft_mask_spec.rb +74 -0
  182. data/spec/prawn/stamp_spec.rb +172 -0
  183. data/spec/prawn/text/box_spec.rb +1112 -0
  184. data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
  185. data/spec/prawn/text/formatted/box_spec.rb +846 -0
  186. data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
  187. data/spec/prawn/text/formatted/line_wrap_spec.rb +494 -0
  188. data/spec/prawn/text/formatted/parser_spec.rb +697 -0
  189. data/spec/prawn/text_draw_text_spec.rb +149 -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 -23
  198. metadata +145 -185
  199. metadata.gz.sig +4 -0
  200. data/data/images/16bit.alpha +0 -0
  201. data/data/images/16bit.color +0 -0
  202. data/data/images/16bit.png +0 -0
  203. data/data/images/arrow.png +0 -0
  204. data/data/images/arrow2.png +0 -0
  205. data/data/images/dice.alpha +0 -0
  206. data/data/images/dice.color +0 -0
  207. data/data/images/dice.png +0 -0
  208. data/data/images/dice_interlaced.png +0 -0
  209. data/data/images/fractal.jpg +0 -0
  210. data/data/images/indexed_color.dat +0 -0
  211. data/data/images/indexed_color.png +0 -0
  212. data/data/images/letterhead.jpg +0 -0
  213. data/data/images/license.md +0 -8
  214. data/data/images/page_white_text.alpha +0 -0
  215. data/data/images/page_white_text.color +0 -0
  216. data/data/images/page_white_text.png +0 -0
  217. data/data/images/pal_bk.png +0 -0
  218. data/data/images/pigs.jpg +0 -0
  219. data/data/images/prawn.png +0 -0
  220. data/data/images/ruport.png +0 -0
  221. data/data/images/ruport_data.dat +0 -0
  222. data/data/images/ruport_transparent.png +0 -0
  223. data/data/images/ruport_type0.png +0 -0
  224. data/data/images/stef.jpg +0 -0
  225. data/data/images/tru256.bmp +0 -0
  226. data/data/images/web-links.dat +0 -1
  227. data/data/images/web-links.png +0 -0
  228. data/data/pdfs/complex_template.pdf +0 -0
  229. data/data/pdfs/contains_ttf_font.pdf +0 -0
  230. data/data/pdfs/encrypted.pdf +0 -0
  231. data/data/pdfs/form.pdf +1 -819
  232. data/data/pdfs/hexagon.pdf +0 -61
  233. data/data/pdfs/indirect_reference.pdf +0 -86
  234. data/data/pdfs/multipage_template.pdf +0 -127
  235. data/data/pdfs/nested_pages.pdf +0 -118
  236. data/data/pdfs/page_without_mediabox.pdf +0 -193
  237. data/data/pdfs/resources_as_indirect_object.pdf +0 -83
  238. data/data/pdfs/two_hexagons.pdf +0 -90
  239. data/data/pdfs/version_1_6.pdf +0 -61
  240. data/data/shift_jis_text.txt +0 -1
  241. data/spec/acceptance/png.rb +0 -24
  242. data/spec/annotations_spec.rb +0 -67
  243. data/spec/bounding_box_spec.rb +0 -501
  244. data/spec/column_box_spec.rb +0 -59
  245. data/spec/destinations_spec.rb +0 -13
  246. data/spec/document_spec.rb +0 -742
  247. data/spec/extensions/mocha.rb +0 -45
  248. data/spec/font_metric_cache_spec.rb +0 -52
  249. data/spec/font_spec.rb +0 -475
  250. data/spec/formatted_text_arranger_spec.rb +0 -423
  251. data/spec/formatted_text_box_spec.rb +0 -716
  252. data/spec/formatted_text_fragment_spec.rb +0 -299
  253. data/spec/graphics_spec.rb +0 -666
  254. data/spec/grid_spec.rb +0 -95
  255. data/spec/image_handler_spec.rb +0 -53
  256. data/spec/images_spec.rb +0 -167
  257. data/spec/inline_formatted_text_parser_spec.rb +0 -568
  258. data/spec/jpg_spec.rb +0 -23
  259. data/spec/line_wrap_spec.rb +0 -366
  260. data/spec/measurement_units_spec.rb +0 -22
  261. data/spec/outline_spec.rb +0 -409
  262. data/spec/png_spec.rb +0 -235
  263. data/spec/reference_spec.rb +0 -25
  264. data/spec/repeater_spec.rb +0 -154
  265. data/spec/security_spec.rb +0 -151
  266. data/spec/soft_mask_spec.rb +0 -78
  267. data/spec/span_spec.rb +0 -43
  268. data/spec/stamp_spec.rb +0 -179
  269. data/spec/stroke_styles_spec.rb +0 -208
  270. data/spec/text_at_spec.rb +0 -142
  271. data/spec/text_box_spec.rb +0 -1038
  272. data/spec/text_rendering_mode_spec.rb +0 -45
  273. data/spec/text_spacing_spec.rb +0 -93
  274. data/spec/text_spec.rb +0 -549
  275. data/spec/text_with_inline_formatting_spec.rb +0 -35
  276. data/spec/transparency_spec.rb +0 -91
  277. data/spec/view_spec.rb +0 -42
@@ -1,235 +0,0 @@
1
- # encoding: ASCII-8BIT
2
-
3
- # Spec'ing the PNG class. Not complete yet - still needs to check the
4
- # contents of palette and transparency to ensure they're correct.
5
- # Need to find files that have these sections first.
6
- #
7
- # see http://www.w3.org/TR/PNG/ for a detailed description of the PNG spec,
8
- # particuarly Table 11.1 for the different color types
9
-
10
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
11
-
12
- describe "When reading a greyscale PNG file (color type 0)" do
13
- before(:each) do
14
- @filename = "#{Prawn::DATADIR}/images/web-links.png"
15
- @data_filename = "#{Prawn::DATADIR}/images/web-links.dat"
16
- @img_data = File.binread(@filename)
17
- end
18
-
19
- it "should read the attributes from the header chunk correctly" do
20
- png = Prawn::Images::PNG.new(@img_data)
21
-
22
- expect(png.width).to eq(21)
23
- expect(png.height).to eq(14)
24
- expect(png.bits).to eq(8)
25
- expect(png.color_type).to eq(0)
26
- expect(png.compression_method).to eq(0)
27
- expect(png.filter_method).to eq(0)
28
- expect(png.interlace_method).to eq(0)
29
- end
30
-
31
- it "should read the image data chunk correctly" do
32
- png = Prawn::Images::PNG.new(@img_data)
33
- data = Zlib::Inflate.inflate(File.binread(@data_filename))
34
- expect(png.img_data).to eq(data)
35
- end
36
- end
37
-
38
- describe "When reading a greyscale PNG file with transparency (color type 0)" do
39
- before(:each) do
40
- @filename = "#{Prawn::DATADIR}/images/ruport_type0.png"
41
- @img_data = File.binread(@filename)
42
- end
43
-
44
- # In a greyscale type 0 PNG image, the tRNS chunk should contain a single value
45
- # that indicates the color that should be interpreted as transparent.
46
- #
47
- # http://www.w3.org/TR/PNG/#11tRNS
48
- it "should read the tRNS chunk correctly" do
49
- png = Prawn::Images::PNG.new(@img_data)
50
- expect(png.transparency[:grayscale]).to eq(255)
51
- end
52
- end
53
-
54
- describe "When reading an RGB PNG file (color type 2)" do
55
- before(:each) do
56
- @filename = "#{Prawn::DATADIR}/images/ruport.png"
57
- @data_filename = "#{Prawn::DATADIR}/images/ruport_data.dat"
58
- @img_data = File.binread(@filename)
59
- end
60
-
61
- it "should read the attributes from the header chunk correctly" do
62
- png = Prawn::Images::PNG.new(@img_data)
63
-
64
- expect(png.width).to eq(258)
65
- expect(png.height).to eq(105)
66
- expect(png.bits).to eq(8)
67
- expect(png.color_type).to eq(2)
68
- expect(png.compression_method).to eq(0)
69
- expect(png.filter_method).to eq(0)
70
- expect(png.interlace_method).to eq(0)
71
- end
72
-
73
- it "should read the image data chunk correctly" do
74
- png = Prawn::Images::PNG.new(@img_data)
75
- data = Zlib::Inflate.inflate(File.binread(@data_filename))
76
- expect(png.img_data).to eq(data)
77
- end
78
- end
79
-
80
- describe "When reading an RGB PNG file with transparency (color type 2)" do
81
- before(:each) do
82
- @filename = "#{Prawn::DATADIR}/images/arrow2.png"
83
- @img_data = File.binread(@filename)
84
- end
85
-
86
- # In a RGB type 2 PNG image, the tRNS chunk should contain a single RGB value
87
- # that indicates the color that should be interpreted as transparent. In this
88
- # case it's green.
89
- #
90
- # http://www.w3.org/TR/PNG/#11tRNS
91
- it "should read the tRNS chunk correctly" do
92
- png = Prawn::Images::PNG.new(@img_data)
93
- expect(png.transparency[:rgb]).to eq([0, 255, 0])
94
- end
95
- end
96
-
97
- describe "When reading an indexed color PNG file with transparency (color type 3)" do
98
- it "raises a not supported error" do
99
- bin = File.binread("#{Prawn::DATADIR}/images/pal_bk.png")
100
- expect { Prawn::Images::PNG.new(bin) }.to(
101
- raise_error(Prawn::Errors::UnsupportedImageType))
102
- end
103
- end
104
-
105
- describe "When reading an indexed color PNG file (color type 3)" do
106
- before(:each) do
107
- @filename = "#{Prawn::DATADIR}/images/indexed_color.png"
108
- @data_filename = "#{Prawn::DATADIR}/images/indexed_color.dat"
109
- @img_data = File.binread(@filename)
110
- end
111
-
112
- it "should read the attributes from the header chunk correctly" do
113
- png = Prawn::Images::PNG.new(@img_data)
114
-
115
- expect(png.width).to eq(150)
116
- expect(png.height).to eq(200)
117
- expect(png.bits).to eq(8)
118
- expect(png.color_type).to eq(3)
119
- expect(png.compression_method).to eq(0)
120
- expect(png.filter_method).to eq(0)
121
- expect(png.interlace_method).to eq(0)
122
- end
123
-
124
- it "should read the image data chunk correctly" do
125
- png = Prawn::Images::PNG.new(@img_data)
126
- data = Zlib::Inflate.inflate(File.binread(@data_filename))
127
- expect(png.img_data).to eq(data)
128
- end
129
- end
130
-
131
- describe "When reading a greyscale+alpha PNG file (color type 4)" do
132
- before(:each) do
133
- @filename = "#{Prawn::DATADIR}/images/page_white_text.png"
134
- @color_data_filename = "#{Prawn::DATADIR}/images/page_white_text.color"
135
- @alpha_data_filename = "#{Prawn::DATADIR}/images/page_white_text.alpha"
136
- @img_data = File.binread(@filename)
137
- end
138
-
139
- it "should read the attributes from the header chunk correctly" do
140
- png = Prawn::Images::PNG.new(@img_data)
141
-
142
- expect(png.width).to eq(16)
143
- expect(png.height).to eq(16)
144
- expect(png.bits).to eq(8)
145
- expect(png.color_type).to eq(4)
146
- expect(png.compression_method).to eq(0)
147
- expect(png.filter_method).to eq(0)
148
- expect(png.interlace_method).to eq(0)
149
- end
150
-
151
- it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do
152
- png = Prawn::Images::PNG.new(@img_data)
153
- png.split_alpha_channel!
154
- data = File.binread(@color_data_filename)
155
- expect(png.img_data).to eq(data)
156
- end
157
-
158
- it "should correctly extract the alpha channel data from the image data chunk" do
159
- png = Prawn::Images::PNG.new(@img_data)
160
- png.split_alpha_channel!
161
- data = File.binread(@alpha_data_filename)
162
- expect(png.alpha_channel).to eq(data)
163
- end
164
- end
165
-
166
- describe "When reading an RGB+alpha PNG file (color type 6)" do
167
- before(:each) do
168
- @filename = "#{Prawn::DATADIR}/images/dice.png"
169
- @color_data_filename = "#{Prawn::DATADIR}/images/dice.color"
170
- @alpha_data_filename = "#{Prawn::DATADIR}/images/dice.alpha"
171
- @img_data = File.binread(@filename)
172
- end
173
-
174
- it "should read the attributes from the header chunk correctly" do
175
- png = Prawn::Images::PNG.new(@img_data)
176
-
177
- expect(png.width).to eq(320)
178
- expect(png.height).to eq(240)
179
- expect(png.bits).to eq(8)
180
- expect(png.color_type).to eq(6)
181
- expect(png.compression_method).to eq(0)
182
- expect(png.filter_method).to eq(0)
183
- expect(png.interlace_method).to eq(0)
184
- end
185
-
186
- it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do
187
- png = Prawn::Images::PNG.new(@img_data)
188
- png.split_alpha_channel!
189
- data = File.binread(@color_data_filename)
190
- expect(png.img_data).to eq(data)
191
- end
192
-
193
- it "should correctly extract the alpha channel data from the image data chunk" do
194
- png = Prawn::Images::PNG.new(@img_data)
195
- png.split_alpha_channel!
196
- data = File.binread(@alpha_data_filename)
197
- expect(png.alpha_channel).to eq(data)
198
- end
199
- end
200
-
201
- describe "When reading a 16bit RGB+alpha PNG file (color type 6)" do
202
- before(:each) do
203
- @filename = "#{Prawn::DATADIR}/images/16bit.png"
204
- @color_data_filename = "#{Prawn::DATADIR}/images/16bit.color"
205
- # alpha channel truncated to 8-bit
206
- @alpha_data_filename = "#{Prawn::DATADIR}/images/16bit.alpha"
207
- @img_data = File.binread(@filename)
208
- end
209
-
210
- it "should read the attributes from the header chunk correctly" do
211
- png = Prawn::Images::PNG.new(@img_data)
212
-
213
- expect(png.width).to eq(32)
214
- expect(png.height).to eq(32)
215
- expect(png.bits).to eq(16)
216
- expect(png.color_type).to eq(6)
217
- expect(png.compression_method).to eq(0)
218
- expect(png.filter_method).to eq(0)
219
- expect(png.interlace_method).to eq(0)
220
- end
221
-
222
- it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do
223
- png = Prawn::Images::PNG.new(@img_data)
224
- png.split_alpha_channel!
225
- data = File.binread(@color_data_filename)
226
- expect(png.img_data).to eq(data)
227
- end
228
-
229
- it "should correctly extract the alpha channel data from the image data chunk" do
230
- png = Prawn::Images::PNG.new(@img_data)
231
- png.split_alpha_channel!
232
- data = File.binread(@alpha_data_filename)
233
- expect(png.alpha_channel).to eq(data)
234
- end
235
- end
@@ -1,25 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
-
5
- describe "A Reference object" do
6
- describe "generated via Prawn::Document" do
7
- it "should return a proper reference on ref!" do
8
- pdf = Prawn::Document.new
9
- expect(pdf.ref!({}).is_a?(PDF::Core::Reference)).to eq(true)
10
- end
11
-
12
- it "should return an identifier on ref" do
13
- pdf = Prawn::Document.new
14
- r = pdf.ref({})
15
- expect(r.is_a?(Integer)).to eq(true)
16
- end
17
-
18
- it "should have :Length of stream if it has one when compression disabled" do
19
- pdf = Prawn::Document.new :compress => false
20
- ref = pdf.ref!({})
21
- ref << 'Hello'
22
- expect(ref.stream.data[:Length]).to eq(5)
23
- end
24
- end
25
- end
@@ -1,154 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
-
5
- describe "Repeaters" do
6
- it "creates a stamp and increments Prawn::Repeater.count on initialize" do
7
- orig_count = Prawn::Repeater.count
8
-
9
- doc = sample_document
10
- doc.expects(:create_stamp).with("prawn_repeater(#{orig_count})")
11
-
12
- r = repeater(doc, :all) { :do_nothing }
13
-
14
- expect(Prawn::Repeater.count).to eq(orig_count + 1)
15
- end
16
-
17
- it "must provide an :all filter" do
18
- doc = sample_document
19
- r = repeater(doc, :all) { :do_nothing }
20
-
21
- expect((1..doc.page_count).all? { |i| r.match?(i) }).to be_true
22
- end
23
-
24
- it "must provide an :odd filter" do
25
- doc = sample_document
26
- r = repeater(doc, :odd) { :do_nothing }
27
-
28
- odd, even = (1..doc.page_count).partition(&:odd?)
29
-
30
- expect(odd.all? { |i| r.match?(i) }).to be_true
31
- expect(even.any? { |i| r.match?(i) }).to be_false
32
- end
33
-
34
- it "must be able to filter by an array of page numbers" do
35
- doc = sample_document
36
- r = repeater(doc, [1, 2, 7]) { :do_nothing }
37
-
38
- expect((1..10).select { |i| r.match?(i) }).to eq([1, 2, 7])
39
- end
40
-
41
- it "must be able to filter by a range of page numbers" do
42
- doc = sample_document
43
- r = repeater(doc, 2..4) { :do_nothing }
44
-
45
- expect((1..10).select { |i| r.match?(i) }).to eq([2, 3, 4])
46
- end
47
-
48
- it "must be able to filter by an arbitrary proc" do
49
- doc = sample_document
50
- r = repeater(doc, lambda { |x| x == 1 or x % 3 == 0 })
51
-
52
- expect((1..10).select { |i| r.match?(i) }).to eq([1, 3, 6, 9])
53
- end
54
-
55
- it "must try to run a stamp if the page number matches" do
56
- doc = sample_document
57
- doc.expects(:stamp)
58
-
59
- repeater(doc, :odd).run(3)
60
- end
61
-
62
- it "must not try to run a stamp unless the page number matches" do
63
- doc = sample_document
64
-
65
- doc.expects(:stamp).never
66
- repeater(doc, :odd).run(2)
67
- end
68
-
69
- it "must not try to run a stamp if dynamic is selected" do
70
- doc = sample_document
71
-
72
- doc.expects(:stamp).never
73
- (1..10).each { |p| repeater(doc, :all, true){ :do_nothing }.run(p) }
74
- end
75
-
76
- it "must try to run a block if the page number matches" do
77
- doc = sample_document
78
-
79
- doc.expects(:draw_text).twice
80
- (1..10).each { |p| repeater(doc, [1, 2], true){ doc.draw_text "foo" }.run(p) }
81
- end
82
-
83
- it "must not try to run a block unless the page number matches" do
84
- doc = sample_document
85
-
86
- doc.expects(:draw_text).never
87
- repeater(doc, :odd, true){ doc.draw_text "foo" }.run(2)
88
- end
89
-
90
- it "must treat any block as a closure" do
91
- doc = sample_document
92
-
93
- @page = "Page" # ensure access to ivars
94
- doc.repeat(:all, :dynamic => true) do
95
- doc.draw_text "#@page #{doc.page_number}", :at => [500, 0]
96
- end
97
-
98
- text = PDF::Inspector::Text.analyze(doc.render)
99
- expect(text.strings).to eq((1..10).to_a.map{ |p| "Page #{p}" })
100
- end
101
-
102
- it "must treat any block as a closure (Document.new instance_eval form)" do
103
- doc = Prawn::Document.new(:skip_page_creation => true) do
104
- 10.times { start_new_page }
105
-
106
- @page = "Page"
107
- repeat(:all, :dynamic => true) do
108
- # ensure self is accessible here
109
- draw_text "#@page #{page_number}", :at => [500, 0]
110
- end
111
- end
112
-
113
- text = PDF::Inspector::Text.analyze(doc.render)
114
- expect(text.strings).to eq((1..10).to_a.map{ |p| "Page #{p}" })
115
- end
116
-
117
- def sample_document
118
- doc = Prawn::Document.new(:skip_page_creation => true)
119
- 10.times { |e| doc.start_new_page }
120
- doc
121
- end
122
-
123
- def repeater(*args, &b)
124
- Prawn::Repeater.new(*args, &b)
125
- end
126
-
127
- context "graphic state" do
128
- it "should not alter the graphic state stack color space" do
129
- create_pdf
130
- starting_color_space = @pdf.state.page.graphic_state.color_space.dup
131
- @pdf.repeat :all do
132
- @pdf.text "Testing", :size => 24, :style => :bold
133
- end
134
- expect(@pdf.state.page.graphic_state.color_space).to eq(starting_color_space)
135
- end
136
-
137
- context "dynamic repeaters" do
138
- it "should preserve the graphic state at creation time" do
139
- create_pdf
140
- @pdf.repeat :all, :dynamic => true do
141
- @pdf.text "fill_color: #{@pdf.graphic_state.fill_color}"
142
- @pdf.text "cap_style: #{@pdf.graphic_state.cap_style}"
143
- end
144
- @pdf.fill_color "666666"
145
- @pdf.cap_style :round
146
- text = PDF::Inspector::Text.analyze(@pdf.render)
147
- expect(text.strings.include?("fill_color: 666666")).to eq(false)
148
- expect(text.strings.include?("fill_color: 000000")).to eq(true)
149
- expect(text.strings.include?("cap_style: round")).to eq(false)
150
- expect(text.strings.include?("cap_style: butt")).to eq(true)
151
- end
152
- end
153
- end
154
- end
@@ -1,151 +0,0 @@
1
- # encoding: utf-8
2
- require "tempfile"
3
-
4
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
5
-
6
- describe "Document encryption" do
7
- describe "Password padding" do
8
- include Prawn::Document::Security
9
-
10
- it "should truncate long passwords" do
11
- pw = "Long long string" * 30
12
- padded = pad_password(pw)
13
- expect(padded.length).to eq(32)
14
- expect(padded).to eq(pw[0, 32])
15
- end
16
-
17
- it "should pad short passwords" do
18
- pw = "abcd"
19
- padded = pad_password(pw)
20
- expect(padded.length).to eq(32)
21
- expect(padded).to eq(pw + Prawn::Document::Security::PasswordPadding[0, 28])
22
- end
23
-
24
- it "should fully pad null passwords" do
25
- pw = ""
26
- padded = pad_password(pw)
27
- expect(padded.length).to eq(32)
28
- expect(padded).to eq(Prawn::Document::Security::PasswordPadding)
29
- end
30
- end
31
-
32
- describe "Setting permissions" do
33
- def doc_with_permissions(permissions)
34
- pdf = Prawn::Document.new
35
-
36
- class << pdf
37
- # Make things easier to test
38
- public :permissions_value
39
- end
40
-
41
- pdf.encrypt_document(:permissions => permissions)
42
- pdf
43
- end
44
-
45
- it "should default to full permissions" do
46
- expect(doc_with_permissions({}).permissions_value).to eq(0xFFFFFFFF)
47
- expect(doc_with_permissions(:print_document => true,
48
- :modify_contents => true,
49
- :copy_contents => true,
50
- :modify_annotations => true).permissions_value).
51
- to eq(0xFFFFFFFF)
52
- end
53
-
54
- it "should clear the appropriate bits for each permission flag" do
55
- expect(doc_with_permissions(:print_document => false).permissions_value).
56
- to eq(0b1111_1111_1111_1111_1111_1111_1111_1011)
57
- expect(doc_with_permissions(:modify_contents => false).permissions_value).
58
- to eq(0b1111_1111_1111_1111_1111_1111_1111_0111)
59
- expect(doc_with_permissions(:copy_contents => false).permissions_value).
60
- to eq(0b1111_1111_1111_1111_1111_1111_1110_1111)
61
- expect(doc_with_permissions(:modify_annotations => false).permissions_value).
62
- to eq(0b1111_1111_1111_1111_1111_1111_1101_1111)
63
- end
64
-
65
- it "should raise_error ArgumentError if invalid option is provided" do
66
- expect {
67
- doc_with_permissions(:modify_document => false)
68
- }.to raise_error(ArgumentError)
69
- end
70
- end
71
-
72
- describe "Encryption keys" do
73
- # Since PDF::Reader doesn't read encrypted PDF files, we just take the
74
- # roundabout method of verifying each step of the encryption. This works
75
- # fine because the encryption method is deterministic.
76
-
77
- before(:each) do
78
- @pdf = Prawn::Document.new
79
- class << @pdf
80
- public :owner_password_hash, :user_password_hash, :user_encryption_key
81
- end
82
- @pdf.encrypt_document :user_password => 'foo',
83
- :owner_password => 'bar',
84
- :permissions => { :print_document => false }
85
- end
86
-
87
- it "should calculate the correct owner hash" do
88
- expect(@pdf.owner_password_hash.unpack("H*").first).to match(/^61CA855012/i)
89
- end
90
-
91
- it "should calculate the correct user hash" do
92
- expect(@pdf.user_password_hash.unpack("H*").first).to match(/^6BC8C51031/i)
93
- end
94
-
95
- it "should calculate the correct user_encryption_key" do
96
- expect(@pdf.user_encryption_key.unpack("H*").first.upcase).to eq("B100AB6429")
97
- end
98
- end
99
-
100
- describe "EncryptedPdfObject" do
101
- it "should delegate to PdfObject for simple types" do
102
- expect(PDF::Core::EncryptedPdfObject(true, nil, nil, nil)).to eq("true")
103
- expect(PDF::Core::EncryptedPdfObject(42, nil, nil, nil)).to eq("42")
104
- end
105
-
106
- it "should encrypt strings properly" do
107
- expect(PDF::Core::EncryptedPdfObject("foo", "12345", 123, 0)).to eq("<4ad6e3>")
108
- end
109
-
110
- it "should encrypt literal strings properly" do
111
- expect(PDF::Core::EncryptedPdfObject(PDF::Core::LiteralString.new("foo"), "12345", 123, 0)).to eq(bin_string("(J\xD6\xE3)"))
112
- expect(PDF::Core::EncryptedPdfObject(PDF::Core::LiteralString.new("lhfbqg3do5u0satu3fjf"), nil, 123, 0)).to eq(bin_string("(\xF1\x8B\\(\b\xBB\xE18S\x130~4*#\\(%\x87\xE7\x8E\\\n)"))
113
- end
114
-
115
- it "should encrypt time properly" do
116
- expect(PDF::Core::EncryptedPdfObject(Time.utc(2050, 04, 26, 10, 17, 10), "12345", 123, 0)).to eq(bin_string("(h\x83\xBE\xDC\xEC\x99\x0F\xD7\\)%\x13\xD4$\xB8\xF0\x16\xB8\x80\xC5\xE91+\xCF)"))
117
- end
118
-
119
- it "should properly handle compound types" do
120
- expect(PDF::Core::EncryptedPdfObject({ :Bar => "foo" }, "12345", 123, 0)).to eq(
121
- "<< /Bar <4ad6e3>\n>>"
122
- )
123
- expect(PDF::Core::EncryptedPdfObject(["foo", "bar"], "12345", 123, 0)).to eq(
124
- "[<4ad6e3> <4ed8fe>]"
125
- )
126
- end
127
- end
128
-
129
- describe "Reference#encrypted_object" do
130
- it "should encrypt references properly" do
131
- ref = PDF::Core::Reference(1, ["foo"])
132
- expect(ref.encrypted_object(nil)).to eq("1 0 obj\n[<4fca3f>]\nendobj\n")
133
- end
134
-
135
- it "should encrypt references with streams properly" do
136
- ref = PDF::Core::Reference(1, {})
137
- ref << 'foo'
138
- result = bin_string("1 0 obj\n<< /Length 3\n>>\nstream\nO\xCA?\nendstream\nendobj\n")
139
- expect(ref.encrypted_object(nil)).to eq(result)
140
- end
141
- end
142
-
143
- describe "String#encrypted_object" do
144
- it "should encrypt stream properly" do
145
- stream = PDF::Core::Stream.new
146
- stream << "foo"
147
- result = bin_string("stream\nO\xCA?\nendstream\n")
148
- expect(stream.encrypted_object(nil, 1, 0)).to eq(result)
149
- end
150
- end
151
- end