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
data/spec/png_spec.rb DELETED
@@ -1,240 +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
-
14
- before(:each) do
15
- @filename = "#{Prawn::DATADIR}/images/web-links.png"
16
- @data_filename = "#{Prawn::DATADIR}/images/web-links.dat"
17
- @img_data = File.binread(@filename)
18
- end
19
-
20
- it "should read the attributes from the header chunk correctly" do
21
- png = Prawn::Images::PNG.new(@img_data)
22
-
23
- png.width.should == 21
24
- png.height.should == 14
25
- png.bits.should == 8
26
- png.color_type.should == 0
27
- png.compression_method.should == 0
28
- png.filter_method.should == 0
29
- png.interlace_method.should == 0
30
- end
31
-
32
- it "should read the image data chunk correctly" do
33
- png = Prawn::Images::PNG.new(@img_data)
34
- data = Zlib::Inflate.inflate(File.binread(@data_filename))
35
- png.img_data.should == data
36
- end
37
- end
38
-
39
- describe "When reading a greyscale PNG file with transparency (color type 0)" do
40
-
41
- before(:each) do
42
- @filename = "#{Prawn::DATADIR}/images/ruport_type0.png"
43
- @img_data = File.binread(@filename)
44
- end
45
-
46
- # In a greyscale type 0 PNG image, the tRNS chunk should contain a single value
47
- # that indicates the color that should be interpreted as transparent.
48
- #
49
- # http://www.w3.org/TR/PNG/#11tRNS
50
- it "should read the tRNS chunk correctly" do
51
- png = Prawn::Images::PNG.new(@img_data)
52
- png.transparency[:grayscale].should == 255
53
- end
54
- end
55
-
56
- describe "When reading an RGB PNG file (color type 2)" do
57
-
58
- before(:each) do
59
- @filename = "#{Prawn::DATADIR}/images/ruport.png"
60
- @data_filename = "#{Prawn::DATADIR}/images/ruport_data.dat"
61
- @img_data = File.binread(@filename)
62
- end
63
-
64
- it "should read the attributes from the header chunk correctly" do
65
- png = Prawn::Images::PNG.new(@img_data)
66
-
67
- png.width.should == 258
68
- png.height.should == 105
69
- png.bits.should == 8
70
- png.color_type.should == 2
71
- png.compression_method.should == 0
72
- png.filter_method.should == 0
73
- png.interlace_method.should == 0
74
- end
75
-
76
- it "should read the image data chunk correctly" do
77
- png = Prawn::Images::PNG.new(@img_data)
78
- data = Zlib::Inflate.inflate(File.binread(@data_filename))
79
- png.img_data.should == data
80
- end
81
- end
82
-
83
- describe "When reading an RGB PNG file with transparency (color type 2)" do
84
-
85
- before(:each) do
86
- @filename = "#{Prawn::DATADIR}/images/arrow2.png"
87
- @img_data = File.binread(@filename)
88
- end
89
-
90
- # In a RGB type 2 PNG image, the tRNS chunk should contain a single RGB value
91
- # that indicates the color that should be interpreted as transparent. In this
92
- # case it's green.
93
- #
94
- # http://www.w3.org/TR/PNG/#11tRNS
95
- it "should read the tRNS chunk correctly" do
96
- png = Prawn::Images::PNG.new(@img_data)
97
- png.transparency[:rgb].should == [0, 255, 0]
98
- end
99
- end
100
-
101
- # TODO: describe "When reading an indexed color PNG file wiih transparency (color type 3)"
102
-
103
- describe "When reading an indexed color PNG file (color type 3)" do
104
-
105
- before(:each) do
106
- @filename = "#{Prawn::DATADIR}/images/indexed_color.png"
107
- @data_filename = "#{Prawn::DATADIR}/images/indexed_color.dat"
108
- @img_data = File.binread(@filename)
109
- end
110
-
111
- it "should read the attributes from the header chunk correctly" do
112
- png = Prawn::Images::PNG.new(@img_data)
113
-
114
- png.width.should == 150
115
- png.height.should == 200
116
- png.bits.should == 8
117
- png.color_type.should == 3
118
- png.compression_method.should == 0
119
- png.filter_method.should == 0
120
- png.interlace_method.should == 0
121
- end
122
-
123
- it "should read the image data chunk correctly" do
124
- png = Prawn::Images::PNG.new(@img_data)
125
- data = Zlib::Inflate.inflate(File.binread(@data_filename))
126
- png.img_data.should == data
127
- end
128
- end
129
-
130
- describe "When reading a greyscale+alpha PNG file (color type 4)" do
131
-
132
- before(:each) do
133
- @filename = "#{Prawn::DATADIR}/images/page_white_text.png"
134
- @data_filename = "#{Prawn::DATADIR}/images/page_white_text.dat"
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
- png.width.should == 16
143
- png.height.should == 16
144
- png.bits.should == 8
145
- png.color_type.should == 4
146
- png.compression_method.should == 0
147
- png.filter_method.should == 0
148
- png.interlace_method.should == 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 = Zlib::Inflate.inflate(File.binread(@data_filename))
155
- png.img_data.should == 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 = Zlib::Inflate.inflate(File.binread(@alpha_data_filename))
162
- png.alpha_channel.should == data
163
- end
164
- end
165
-
166
- describe "When reading an RGB+alpha PNG file (color type 6)" do
167
-
168
- before(:each) do
169
- @filename = "#{Prawn::DATADIR}/images/dice.png"
170
- @data_filename = "#{Prawn::DATADIR}/images/dice.dat"
171
- @alpha_data_filename = "#{Prawn::DATADIR}/images/dice.alpha"
172
- @img_data = File.binread(@filename)
173
- end
174
-
175
- it "should read the attributes from the header chunk correctly" do
176
- png = Prawn::Images::PNG.new(@img_data)
177
-
178
- png.width.should == 320
179
- png.height.should == 240
180
- png.bits.should == 8
181
- png.color_type.should == 6
182
- png.compression_method.should == 0
183
- png.filter_method.should == 0
184
- png.interlace_method.should == 0
185
- end
186
-
187
- it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do
188
- png = Prawn::Images::PNG.new(@img_data)
189
- png.split_alpha_channel!
190
- data = Zlib::Inflate.inflate(File.binread(@data_filename))
191
- # compare decompressed rather than compressed image data
192
- # because JRuby's implementation of Zlib is different from MRI --
193
- # both generate valid gzipped data, but not bit-identical to each other
194
- png.img_data.should == data
195
- end
196
-
197
- it "should correctly extract the alpha channel data from the image data chunk" do
198
- png = Prawn::Images::PNG.new(@img_data)
199
- png.split_alpha_channel!
200
- data = Zlib::Inflate.inflate(File.binread(@alpha_data_filename))
201
- png.alpha_channel.should == data
202
- end
203
- end
204
-
205
- describe "When reading a 16bit RGB+alpha PNG file (color type 6)" do
206
-
207
- before(:each) do
208
- @filename = "#{Prawn::DATADIR}/images/16bit.png"
209
- @data_filename = "#{Prawn::DATADIR}/images/16bit.dat"
210
- # alpha channel truncated to 8-bit
211
- @alpha_data_filename = "#{Prawn::DATADIR}/images/16bit.alpha"
212
- @img_data = File.binread(@filename)
213
- end
214
-
215
- it "should read the attributes from the header chunk correctly" do
216
- png = Prawn::Images::PNG.new(@img_data)
217
-
218
- png.width.should == 32
219
- png.height.should == 32
220
- png.bits.should == 16
221
- png.color_type.should == 6
222
- png.compression_method.should == 0
223
- png.filter_method.should == 0
224
- png.interlace_method.should == 0
225
- end
226
-
227
- it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do
228
- png = Prawn::Images::PNG.new(@img_data)
229
- png.split_alpha_channel!
230
- data = Zlib::Inflate.inflate(File.binread(@data_filename))
231
- png.img_data.should == data
232
- end
233
-
234
- it "should correctly extract the alpha channel data from the image data chunk" do
235
- png = Prawn::Images::PNG.new(@img_data)
236
- png.split_alpha_channel!
237
- data = Zlib::Inflate.inflate(File.binread(@alpha_data_filename))
238
- png.alpha_channel.should == data
239
- end
240
- end
@@ -1,82 +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
- it "should produce a PDF reference on #to_s call" do
7
- ref = PDF::Core::Reference(1,true)
8
- ref.to_s.should == "1 0 R"
9
- end
10
-
11
- it "should allow changing generation number" do
12
- ref = PDF::Core::Reference(1,true)
13
- ref.gen = 1
14
- ref.to_s.should == "1 1 R"
15
- end
16
-
17
- it "should generate a valid PDF object for the referenced data" do
18
- ref = PDF::Core::Reference(2,[1,"foo"])
19
- ref.object.should == "2 0 obj\n#{PDF::Core::PdfObject([1,"foo"])}\nendobj\n"
20
- end
21
-
22
- it "should include stream fileds in dictionary when serializing" do
23
- ref = PDF::Core::Reference(1, {})
24
- ref.stream << 'Hello'
25
- ref.object.should == "1 0 obj\n<< /Length 5\n>>\nstream\nHello\nendstream\nendobj\n"
26
- end
27
-
28
- it "should append data to stream when #<< is used" do
29
- ref = PDF::Core::Reference(1, {})
30
- ref << "BT\n/F1 12 Tf\n72 712 Td\n( A stream ) Tj\nET"
31
- ref.object.should == "1 0 obj\n<< /Length 41\n>>\nstream"+
32
- "\nBT\n/F1 12 Tf\n72 712 Td\n( A stream ) Tj\nET" +
33
- "\nendstream\nendobj\n"
34
- end
35
-
36
- it "should copy the data and stream from another ref on #replace" do
37
- from = PDF::Core::Reference(3, {:foo => 'bar'})
38
- from << "has a stream too"
39
-
40
- to = PDF::Core::Reference(4, {:foo => 'baz'})
41
- to.replace from
42
-
43
- # should preserve identifier but copy data and stream
44
- to.identifier.should == 4
45
- to.data.should == from.data
46
- to.stream.should == from.stream
47
- end
48
-
49
- it "should copy a compressed stream from a compressed ref on #replace" do
50
- from = PDF::Core::Reference(5, {:foo => 'bar'})
51
- from << "has a stream too " * 20
52
- from.stream.compress!
53
-
54
- to = PDF::Core::Reference(6, {:foo => 'baz'})
55
- to.replace from
56
-
57
- to.identifier.should == 6
58
- to.data.should == from.data
59
- to.stream.should == from.stream
60
- to.stream.compressed?.should == true
61
- end
62
-
63
- describe "generated via Prawn::Document" do
64
- it "should return a proper reference on ref!" do
65
- pdf = Prawn::Document.new
66
- pdf.ref!({}).is_a?(PDF::Core::Reference).should == true
67
- end
68
-
69
- it "should return an identifier on ref" do
70
- pdf = Prawn::Document.new
71
- r = pdf.ref({})
72
- r.is_a?(Integer).should == true
73
- end
74
-
75
- it "should have :Length of stream if it has one when compression disabled" do
76
- pdf = Prawn::Document.new :compress => false
77
- ref = pdf.ref!({})
78
- ref << 'Hello'
79
- ref.stream.data[:Length].should == 5
80
- end
81
- end
82
- end
@@ -1,158 +0,0 @@
1
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
2
-
3
- describe "Repeaters" do
4
-
5
- it "creates a stamp and increments Prawn::Repeater.count on initialize" do
6
- orig_count = Prawn::Repeater.count
7
-
8
- doc = sample_document
9
- doc.expects(:create_stamp).with("prawn_repeater(#{orig_count})")
10
-
11
- r = repeater(doc, :all) { :do_nothing }
12
-
13
- Prawn::Repeater.count.should == orig_count + 1
14
- end
15
-
16
- it "must provide an :all filter" do
17
- doc = sample_document
18
- r = repeater(doc, :all) { :do_nothing }
19
-
20
- (1..doc.page_count).all? { |i| r.match?(i) }.should be_true
21
- end
22
-
23
- it "must provide an :odd filter" do
24
- doc = sample_document
25
- r = repeater(doc, :odd) { :do_nothing }
26
-
27
- odd, even = (1..doc.page_count).partition { |e| e % 2 == 1 }
28
-
29
- odd.all? { |i| r.match?(i) }.should be_true
30
- even.any? { |i| r.match?(i) }.should be_false
31
- end
32
-
33
- it "must be able to filter by an array of page numbers" do
34
- doc = sample_document
35
- r = repeater(doc, [1,2,7]) { :do_nothing }
36
-
37
- (1..10).select { |i| r.match?(i) }.should == [1,2,7]
38
- end
39
-
40
- it "must be able to filter by a range of page numbers" do
41
- doc = sample_document
42
- r = repeater(doc, 2..4) { :do_nothing }
43
-
44
- (1..10).select { |i| r.match?(i) }.should == [2,3,4]
45
- end
46
-
47
- it "must be able to filter by an arbitrary proc" do
48
- doc = sample_document
49
- r = repeater(doc, lambda { |x| x == 1 or x % 3 == 0 })
50
-
51
- (1..10).select { |i| r.match?(i) }.should == [1,3,6,9]
52
- end
53
-
54
- it "must try to run a stamp if the page number matches" do
55
- doc = sample_document
56
- doc.expects(:stamp)
57
-
58
- repeater(doc, :odd).run(3)
59
- end
60
-
61
- it "must not try to run a stamp unless the page number matches" do
62
- doc = sample_document
63
-
64
- doc.expects(:stamp).never
65
- repeater(doc, :odd).run(2)
66
- end
67
-
68
- it "must not try to run a stamp if dynamic is selected" do
69
- doc = sample_document
70
-
71
- doc.expects(:stamp).never
72
- (1..10).each { |p| repeater(doc, :all, true){:do_nothing}.run(p) }
73
- end
74
-
75
- it "must try to run a block if the page number matches" do
76
- doc = sample_document
77
-
78
- doc.expects(:draw_text).twice
79
- (1..10).each { |p| repeater(doc, [1,2], true){doc.draw_text "foo"}.run(p) }
80
- end
81
-
82
- it "must not try to run a block unless the page number matches" do
83
- doc = sample_document
84
-
85
- doc.expects(:draw_text).never
86
- repeater(doc, :odd, true){doc.draw_text "foo"}.run(2)
87
- end
88
-
89
- it "must treat any block as a closure" do
90
- doc = sample_document
91
-
92
- @page = "Page" # ensure access to ivars
93
- doc.repeat(:all, :dynamic => true) do
94
- doc.draw_text "#@page #{doc.page_number}", :at => [500, 0]
95
- end
96
-
97
- text = PDF::Inspector::Text.analyze(doc.render)
98
- text.strings.should == (1..10).to_a.map{|p| "Page #{p}"}
99
- end
100
-
101
- it "must treat any block as a closure (Document.new instance_eval form)" do
102
- doc = Prawn::Document.new(:skip_page_creation => true) do
103
- 10.times { start_new_page }
104
-
105
- @page = "Page"
106
- repeat(:all, :dynamic => true) do
107
- # ensure self is accessible here
108
- draw_text "#@page #{page_number}", :at => [500, 0]
109
- end
110
- end
111
-
112
- text = PDF::Inspector::Text.analyze(doc.render)
113
- text.strings.should == (1..10).to_a.map{|p| "Page #{p}"}
114
- end
115
-
116
- def sample_document
117
- doc = Prawn::Document.new(:skip_page_creation => true)
118
- 10.times { |e| doc.start_new_page }
119
- doc
120
- end
121
-
122
- def repeater(*args, &b)
123
- Prawn::Repeater.new(*args,&b)
124
- end
125
-
126
- context "graphic state" do
127
-
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
- @pdf.state.page.graphic_state.color_space.should == starting_color_space
135
- end
136
-
137
- context "dynamic repeaters" do
138
-
139
- it "should preserve the graphic state at creation time" do
140
- create_pdf
141
- @pdf.repeat :all, :dynamic => true do
142
- @pdf.text "fill_color: #{@pdf.graphic_state.fill_color}"
143
- @pdf.text "cap_style: #{@pdf.graphic_state.cap_style}"
144
- end
145
- @pdf.fill_color "666666"
146
- @pdf.cap_style :round
147
- text = PDF::Inspector::Text.analyze(@pdf.render)
148
- text.strings.include?("fill_color: 666666").should == false
149
- text.strings.include?("fill_color: 000000").should == true
150
- text.strings.include?("cap_style: round").should == false
151
- text.strings.include?("cap_style: butt").should == true
152
- end
153
-
154
- end
155
-
156
- end
157
-
158
- end
@@ -1,158 +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
-
8
- describe "Password padding" do
9
-
10
- include Prawn::Document::Security
11
-
12
- it "should truncate long passwords" do
13
- pw = "Long long string" * 30
14
- padded = pad_password(pw)
15
- padded.length.should == 32
16
- padded.should == pw[0, 32]
17
- end
18
-
19
- it "should pad short passwords" do
20
- pw = "abcd"
21
- padded = pad_password(pw)
22
- padded.length.should == 32
23
- padded.should == pw + Prawn::Document::Security::PasswordPadding[0, 28]
24
- end
25
-
26
- it "should fully pad null passwords" do
27
- pw = ""
28
- padded = pad_password(pw)
29
- padded.length.should == 32
30
- padded.should == Prawn::Document::Security::PasswordPadding
31
- end
32
-
33
- end
34
-
35
- describe "Setting permissions" do
36
-
37
- def doc_with_permissions(permissions)
38
- pdf = Prawn::Document.new
39
-
40
- class << pdf
41
- # Make things easier to test
42
- public :permissions_value
43
- end
44
-
45
- pdf.encrypt_document(:permissions => permissions)
46
- pdf
47
- end
48
-
49
- it "should default to full permissions" do
50
- doc_with_permissions({}).permissions_value.should == 0xFFFFFFFF
51
- doc_with_permissions(:print_document => true,
52
- :modify_contents => true,
53
- :copy_contents => true,
54
- :modify_annotations => true).permissions_value.
55
- should == 0xFFFFFFFF
56
- end
57
-
58
- it "should clear the appropriate bits for each permission flag" do
59
- doc_with_permissions(:print_document => false).permissions_value.
60
- should == 0b1111_1111_1111_1111_1111_1111_1111_1011
61
- doc_with_permissions(:modify_contents => false).permissions_value.
62
- should == 0b1111_1111_1111_1111_1111_1111_1111_0111
63
- doc_with_permissions(:copy_contents => false).permissions_value.
64
- should == 0b1111_1111_1111_1111_1111_1111_1110_1111
65
- doc_with_permissions(:modify_annotations => false).permissions_value.
66
- should == 0b1111_1111_1111_1111_1111_1111_1101_1111
67
- end
68
-
69
- it "should raise_error ArgumentError if invalid option is provided" do
70
- lambda {
71
- doc_with_permissions(:modify_document => false)
72
- }.should raise_error(ArgumentError)
73
- end
74
-
75
- end
76
-
77
- describe "Encryption keys" do
78
- # Since PDF::Reader doesn't read encrypted PDF files, we just take the
79
- # roundabout method of verifying each step of the encryption. This works
80
- # fine because the encryption method is deterministic.
81
-
82
- before(:each) do
83
- @pdf = Prawn::Document.new
84
- class << @pdf
85
- public :owner_password_hash, :user_password_hash, :user_encryption_key
86
- end
87
- @pdf.encrypt_document :user_password => 'foo', :owner_password => 'bar',
88
- :permissions => { :print_document => false }
89
- end
90
-
91
- it "should calculate the correct owner hash" do
92
- @pdf.owner_password_hash.unpack("H*").first.should match(/^61CA855012/i)
93
- end
94
-
95
- it "should calculate the correct user hash" do
96
- @pdf.user_password_hash.unpack("H*").first.should =~ /^6BC8C51031/i
97
- end
98
-
99
- it "should calculate the correct user_encryption_key" do
100
- @pdf.user_encryption_key.unpack("H*").first.upcase.should == "B100AB6429"
101
- end
102
-
103
-
104
- end
105
-
106
- describe "EncryptedPdfObject" do
107
-
108
- it "should delegate to PdfObject for simple types" do
109
- PDF::Core::EncryptedPdfObject(true, nil, nil, nil).should == "true"
110
- PDF::Core::EncryptedPdfObject(42, nil, nil, nil).should == "42"
111
- end
112
-
113
- it "should encrypt strings properly" do
114
- PDF::Core::EncryptedPdfObject("foo", "12345", 123, 0).should == "<4ad6e3>"
115
- end
116
-
117
- it "should encrypt literal strings properly" do
118
- PDF::Core::EncryptedPdfObject(PDF::Core::LiteralString.new("foo"), "12345", 123, 0).should == bin_string("(J\xD6\xE3)")
119
- PDF::Core::EncryptedPdfObject(PDF::Core::LiteralString.new("lhfbqg3do5u0satu3fjf"), nil, 123, 0).should == bin_string("(\xF1\x8B\\(\b\xBB\xE18S\x130~4*#\\(%\x87\xE7\x8E\\\n)")
120
- end
121
-
122
- it "should encrypt time properly" do
123
- PDF::Core::EncryptedPdfObject(Time.utc(2050, 04, 26, 10, 17, 10), "12345", 123, 0).should == bin_string("(h\x83\xBE\xDC\xEC\x99\x0F\xD7\\)%\x13\xD4$\xB8\xF0\x16\xB8\x80\xC5\xE91+\xCF)")
124
- end
125
-
126
- it "should properly handle compound types" do
127
- PDF::Core::EncryptedPdfObject({:Bar => "foo"}, "12345", 123, 0).should ==
128
- "<< /Bar <4ad6e3>\n>>"
129
- PDF::Core::EncryptedPdfObject(["foo", "bar"], "12345", 123, 0).should ==
130
- "[<4ad6e3> <4ed8fe>]"
131
- end
132
-
133
- end
134
-
135
- describe "Reference#encrypted_object" do
136
- it "should encrypt references properly" do
137
- ref = PDF::Core::Reference(1,["foo"])
138
- ref.encrypted_object(nil).should == "1 0 obj\n[<4fca3f>]\nendobj\n"
139
- end
140
-
141
- it "should encrypt references with streams properly" do
142
- ref = PDF::Core::Reference(1, {})
143
- ref << 'foo'
144
- result = bin_string("1 0 obj\n<< /Length 3\n>>\nstream\nO\xCA?\nendstream\nendobj\n")
145
- ref.encrypted_object(nil).should == result
146
- end
147
- end
148
-
149
- describe "String#encrypted_object" do
150
- it "should encrypt stream properly" do
151
- stream = PDF::Core::Stream.new
152
- stream << "foo"
153
- result = bin_string("stream\nO\xCA?\nendstream\n")
154
- stream.encrypted_object(nil, 1, 0).should == result
155
- end
156
- end
157
-
158
- end