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
@@ -1,186 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
-
5
- describe "Prawn::Document#transaction" do
6
-
7
- it "should properly commit if no error is raised" do
8
- pdf = Prawn::Document.new do
9
- transaction do
10
- text "This is shown"
11
- end
12
- end
13
- text = PDF::Inspector::Text.analyze(pdf.render)
14
- text.strings.should == ["This is shown"]
15
- end
16
-
17
- it "should not display text if transaction is rolled back" do
18
- pdf = Prawn::Document.new do
19
- transaction do
20
- text "This is not shown"
21
- rollback
22
- end
23
- end
24
- text = PDF::Inspector::Text.analyze(pdf.render)
25
- text.strings.should == []
26
- end
27
-
28
- it "should return true/false value indicating success of the transaction" do
29
- Prawn::Document.new do
30
- success = transaction { }
31
- success.should == true
32
-
33
- success = transaction { rollback }
34
- success.should == false
35
- end
36
- end
37
-
38
- it "should support nested transactions" do
39
- pdf = Prawn::Document.new do
40
- transaction do
41
- text "This is shown"
42
- transaction do
43
- text "and this is not"
44
- rollback
45
- end
46
- text "and this is"
47
- end
48
- end
49
- text = PDF::Inspector::Text.analyze(pdf.render)
50
- text.strings.should == ["This is shown", "and this is"]
51
- end
52
-
53
- it "should allow rollback of multiple pages" do
54
- pdf = Prawn::Document.new do
55
- transaction do
56
- 5.times { start_new_page }
57
- text "way out there and will never be shown"
58
- rollback
59
- end
60
- text "This is the real text, only one page"
61
- end
62
-
63
- pages = PDF::Inspector::Page.analyze(pdf.render).pages
64
- pages.size.should == 1
65
- end
66
-
67
- it "should not propagate a RollbackTransaction outside its bounds" do
68
- def add_lines(pdf)
69
- 100.times { |i| pdf.text "Line #{i}" }
70
- end
71
-
72
- Prawn::Document.new do |pdf|
73
- lambda do
74
- begin
75
- pdf.group { add_lines(pdf) }
76
- rescue Prawn::Errors::CannotGroup
77
- add_lines(pdf)
78
- end
79
- end.should_not raise_error#(Prawn::Document::Snapshot::RollbackTransaction)
80
- end
81
- end
82
-
83
- # Because the Pages object, when restored, points to the snapshotted pages
84
- # by identifier, we have to restore the snapshot into the same page objects,
85
- # or else old pages will appear in the post-rollback document.
86
- it "should restore the pages into the same objects" do
87
- Prawn::Document.new do
88
- old_page_object_id = state.page.dictionary.identifier
89
- old_page_content_id = state.page.content.identifier
90
-
91
- transaction do
92
- start_new_page
93
- rollback
94
- end
95
-
96
- state.page.dictionary.identifier.should == old_page_object_id
97
- state.page.content.identifier.should == old_page_content_id
98
- end
99
-
100
- end
101
-
102
- it "page object should refer to the page_content object after restore" do
103
-
104
- Prawn::Document.new do
105
- transaction do
106
- start_new_page
107
- rollback
108
- end
109
-
110
- # should be the exact same object, not a clone
111
- state.page.dictionary.data[:Contents].should == state.page.content
112
- end
113
-
114
- end
115
-
116
- it "should restore bounds on rollback" do
117
- Prawn::Document.new(:page_layout => :landscape) do
118
- size = [bounds.width, bounds.height]
119
- transaction do
120
- start_new_page :layout => :portrait
121
- rollback
122
- end
123
- [bounds.width, bounds.height].should == size
124
- end
125
- end
126
-
127
- it "should set new bounding box on start_new_page with different layout" do
128
- Prawn::Document.new(:page_layout => :landscape) do
129
- size = [bounds.width, bounds.height]
130
- transaction do
131
- start_new_page
132
- rollback
133
- end
134
-
135
- start_new_page :layout => :portrait
136
- [bounds.width, bounds.height].should == size.reverse
137
- end
138
- end
139
-
140
- it "should work with dests" do
141
- Prawn::Document.new do |pdf|
142
- pdf.add_dest("dest", pdf.dest_fit_horizontally(pdf.cursor, pdf.page))
143
- pdf.text("Hello world")
144
- lambda { pdf.transaction{} }.should_not raise_error
145
- end
146
- end
147
-
148
- describe "with a stamp dictionary present" do
149
-
150
- it "should properly commit if no error is raised" do
151
- pdf = Prawn::Document.new do
152
- create_stamp("test_stamp") { draw_text "This is shown", :at => [0,0] }
153
- transaction do
154
- stamp("test_stamp")
155
- end
156
- end
157
- pdf.render.should =~ /\/Stamp1 Do/
158
- end
159
-
160
- it "should properly rollback when #rollback is called" do
161
- pdf = Prawn::Document.new do
162
- create_stamp("test_stamp") { draw_text "This is not shown", :at => [0,0] }
163
-
164
- transaction do
165
- stamp("test_stamp")
166
- rollback
167
- end
168
- end
169
- pdf.render.should_not =~ /\/Stamp1 Do/
170
- end
171
-
172
- end
173
-
174
- it "should restore page_number on rollback" do
175
- Prawn::Document.new do
176
- transaction do
177
- 5.times { start_new_page }
178
- rollback
179
- end
180
-
181
- page_number.should == 1
182
- end
183
- end
184
-
185
- end
186
-
@@ -1,117 +0,0 @@
1
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
2
-
3
- module SoftMaskHelper
4
- def make_soft_mask
5
- @pdf.save_graphics_state do
6
- @pdf.soft_mask do
7
- if block_given?
8
- yield
9
- else
10
- @pdf.fill_color '808080'
11
- @pdf.fill_rectangle [100, 100], 200, 200
12
- end
13
- end
14
-
15
- @pdf.fill_color '000000'
16
- @pdf.fill_rectangle [0, 0], 200, 200
17
- end
18
- end
19
- end
20
-
21
- describe "Document with soft masks" do
22
-
23
- include SoftMaskHelper
24
-
25
- it "should have PDF version at least 1.4" do
26
- create_pdf
27
- make_soft_mask
28
- str = @pdf.render
29
- str[0,8].should == "%PDF-1.4"
30
- end
31
-
32
- it "should create a new extended graphics state for each unique soft mask" do
33
- create_pdf
34
-
35
- make_soft_mask do
36
- @pdf.fill_color '808080'
37
- @pdf.fill_rectangle [100, 100], 200, 200
38
- end
39
-
40
- make_soft_mask do
41
- @pdf.fill_color '808080'
42
- @pdf.fill_rectangle [10, 10], 200, 200
43
- end
44
-
45
- extgstates = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates
46
- extgstates.length.should == 2
47
- end
48
-
49
- it "a new extended graphics state should contain soft mask with drawing instructions" do
50
- create_pdf
51
-
52
- make_soft_mask do
53
- @pdf.fill_color '808080'
54
- @pdf.fill_rectangle [100, 100], 200, 200
55
- end
56
-
57
- extgstate = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates.first
58
- extgstate[:soft_mask][:G].data.should == "q\n/DeviceRGB cs\n0.000 0.000 0.000 scn\n/DeviceRGB CS\n0.000 0.000 0.000 SCN\n1 w\n0 J\n0 j\n[ ] 0 d\n/DeviceRGB cs\n0.502 0.502 0.502 scn\n100.000 -100.000 200.000 200.000 re\nf\nQ\n"
59
- end
60
-
61
- it "should not create duplicate extended graphics states" do
62
- create_pdf
63
-
64
- make_soft_mask do
65
- @pdf.fill_color '808080'
66
- @pdf.fill_rectangle [100, 100], 200, 200
67
- end
68
-
69
- make_soft_mask do
70
- @pdf.fill_color '808080'
71
- @pdf.fill_rectangle [100, 100], 200, 200
72
- end
73
-
74
- extgstates = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates
75
- extgstates.length.should == 1
76
- end
77
-
78
- it "should not have objects that are not used for extended graphic state" do
79
- @pdf = Prawn::Document.new(:margin => 0, :optimize_objects => true)
80
-
81
- make_soft_mask do
82
- @pdf.fill_color '808080'
83
- @pdf.fill_rectangle [100, 100], 200, 200
84
- end
85
-
86
- make_soft_mask do
87
- @pdf.fill_color '808080'
88
- @pdf.fill_rectangle [100, 100], 200, 200
89
- end
90
-
91
- reader = PDF::Reader.new(StringIO.open(@pdf.render))
92
-
93
- groups = reader.objects.select { |obj|
94
- o = obj[1]
95
- o.is_a?(Hash) && o[:Type] == :Group
96
- }
97
- groups.length.should == 1
98
-
99
- forms = reader.objects.select { |obj|
100
- o = obj[1]
101
- o.is_a?(PDF::Reader::Stream) && o.hash[:Type] == :XObject && o.hash[:Subtype] == :Form
102
- }
103
- forms.length.should == 1
104
-
105
- masks = reader.objects.select { |obj|
106
- o = obj[1]
107
- o.is_a?(Hash) && o[:Type] == :Mask
108
- }
109
- masks.length.should == 1
110
-
111
- ext_g_states = reader.objects.select { |obj|
112
- o = obj[1]
113
- o.is_a?(Hash) && o[:Type] == :ExtGState
114
- }
115
- ext_g_states.length.should == 1
116
- end
117
- end
data/spec/span_spec.rb DELETED
@@ -1,44 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
-
5
- describe "drawing span" do
6
-
7
- before do
8
- Prawn.debug = false
9
- create_pdf
10
- end
11
-
12
- after do
13
- Prawn.debug = true
14
- end
15
-
16
- it "should only accept :position as option in debug mode" do
17
- Prawn.debug = true
18
- lambda { @pdf.span(350, {:x => 3}) {} }.should raise_error(Prawn::Errors::UnknownOption)
19
- end
20
-
21
- it "should have raise an error if :position is invalid" do
22
- lambda { @pdf.span(350, :position => :x) {} }.should raise_error(ArgumentError)
23
- end
24
-
25
- it "should restore the margin box when bounding box exits" do
26
- margin_box = @pdf.bounds
27
-
28
- @pdf.span(350, :position => :center) do
29
- @pdf.text "Here's some centered text in a 350 point column. " * 100
30
- end
31
-
32
- @pdf.bounds.should == margin_box
33
- end
34
-
35
- it "should do create a margin box" do
36
- y = @pdf.y
37
- margin_box = @pdf.span(350, :position => :center) do
38
- @pdf.text "Here's some centered text in a 350 point column. " * 100
39
- end
40
-
41
- margin_box.top.should == 792.0
42
- margin_box.bottom.should == 0
43
- end
44
- end
data/spec/stamp_spec.rb DELETED
@@ -1,158 +0,0 @@
1
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
2
-
3
- describe "create_stamp before any page is added" do
4
- it "should work with the font class" do
5
- @pdf = Prawn::Document.new(:skip_page_creation => true)
6
-
7
- # If anything goes wrong, Prawn::Errors::NotOnPage will be raised
8
- @pdf.create_stamp("my_stamp") do
9
- @pdf.font.height
10
- end
11
- end
12
-
13
- it "should work with setting color" do
14
- @pdf = Prawn::Document.new(:skip_page_creation => true)
15
-
16
- # If anything goes wrong, Prawn::Errors::NotOnPage will be raised
17
- @pdf.create_stamp("my_stamp") do
18
- @pdf.fill_color = 'ff0000'
19
- end
20
- end
21
- end
22
-
23
- describe "#stamp_at" do
24
- it "should work" do
25
- create_pdf
26
- @pdf.create_stamp("MyStamp")
27
- @pdf.stamp_at("MyStamp", [100, 200])
28
- # I had modified PDF::Inspector::XObject to receive the
29
- # invoke_xobject message and count the number of times it was
30
- # called, but it was only called once, so I reverted checking the
31
- # output with a regular expression
32
- @pdf.render.should =~ /\/Stamp1 Do.*?/m
33
- end
34
- end
35
-
36
- describe "Document with a stamp" do
37
- it "should raise_error NameTaken error when attempt to create stamp "+
38
- "with same name as an existing stamp" do
39
- create_pdf
40
- @pdf.create_stamp("MyStamp")
41
- lambda {
42
- @pdf.create_stamp("MyStamp")
43
- }.should raise_error(Prawn::Errors::NameTaken)
44
- end
45
-
46
- it "should raise_error InvalidName error when attempt to create "+
47
- "stamp with a blank name" do
48
- create_pdf
49
- lambda {
50
- @pdf.create_stamp("")
51
- }.should raise_error(Prawn::Errors::InvalidName)
52
- end
53
-
54
- it "a new XObject should be defined for each stamp created" do
55
- create_pdf
56
- @pdf.create_stamp("MyStamp")
57
- @pdf.create_stamp("AnotherStamp")
58
- @pdf.stamp("MyStamp")
59
- @pdf.stamp("AnotherStamp")
60
-
61
- inspector = PDF::Inspector::XObject.analyze(@pdf.render)
62
- xobjects = inspector.page_xobjects.last
63
- xobjects.length.should == 2
64
- end
65
-
66
- it "calling stamp with a name that does not match an existing stamp "+
67
- "should raise_error UndefinedObjectName" do
68
- create_pdf
69
- @pdf.create_stamp("MyStamp")
70
- lambda {
71
- @pdf.stamp("OtherStamp")
72
- }.should raise_error(Prawn::Errors::UndefinedObjectName)
73
- end
74
-
75
- it "stamp should be drawn into the document each time stamp is called" do
76
- create_pdf
77
- @pdf.create_stamp("MyStamp")
78
- @pdf.stamp("MyStamp")
79
- @pdf.stamp("MyStamp")
80
- @pdf.stamp("MyStamp")
81
- # I had modified PDF::Inspector::XObject to receive the
82
- # invoke_xobject message and count the number of times it was
83
- # called, but it was only called once, so I reverted checking the
84
- # output with a regular expression
85
- @pdf.render.should =~ /(\/Stamp1 Do.*?){3}/m
86
- end
87
-
88
- it "resources added during stamp creation should be added to the "+
89
- "stamp XObject, not the page" do
90
- create_pdf
91
- @pdf.create_stamp("MyStamp") do
92
- @pdf.transparent(0.5) { @pdf.circle([100, 100], 10)}
93
- end
94
- @pdf.stamp("MyStamp")
95
-
96
- # Inspector::XObject does not give information about resources, so
97
- # resorting to string matching
98
-
99
- output = @pdf.render
100
- objects = output.split("endobj")
101
- objects.each do |object|
102
- if object =~ /\/Type \/Page$/
103
- object.should_not =~ /\/ExtGState/
104
- elsif object =~ /\/Type \/XObject$/
105
- object.should =~ /\/ExtGState/
106
- end
107
- end
108
- end
109
-
110
- it "stamp stream should be wrapped in a graphic state" do
111
- create_pdf
112
- @pdf.create_stamp("MyStamp") do
113
- @pdf.text "This should have a 'q' before it and a 'Q' after it"
114
- end
115
- @pdf.stamp("MyStamp")
116
- stamps = PDF::Inspector::XObject.analyze(@pdf.render)
117
- stamps.xobject_streams[:Stamp1].data.chomp.should =~ /q(.|\s)*Q\Z/
118
- end
119
-
120
- it "should not add to the page graphic state stack " do
121
- create_pdf
122
- @pdf.state.page.stack.stack.size.should == 1
123
-
124
- @pdf.create_stamp("MyStamp") do
125
- @pdf.save_graphics_state
126
- @pdf.save_graphics_state
127
- @pdf.save_graphics_state
128
- @pdf.text "This should have a 'q' before it and a 'Q' after it"
129
- @pdf.restore_graphics_state
130
- end
131
- @pdf.state.page.stack.stack.size.should == 1
132
- end
133
-
134
- it "should be able to change fill and stroke colors within the stamp stream" do
135
- create_pdf
136
- @pdf.create_stamp("MyStamp") do
137
- @pdf.fill_color(100, 100, 20, 0)
138
- @pdf.stroke_color(100, 100, 20, 0)
139
- end
140
- @pdf.stamp("MyStamp")
141
- stamps = PDF::Inspector::XObject.analyze(@pdf.render)
142
- stamp_stream = stamps.xobject_streams[:Stamp1].data
143
- stamp_stream.should include("/DeviceCMYK cs\n1.000 1.000 0.200 0.000 scn")
144
- stamp_stream.should include("/DeviceCMYK CS\n1.000 1.000 0.200 0.000 SCN")
145
- end
146
-
147
- it "should save the color space even when same as current page color space" do
148
- create_pdf
149
- @pdf.stroke_color(100, 100, 20, 0)
150
- @pdf.create_stamp("MyStamp") do
151
- @pdf.stroke_color(100, 100, 20, 0)
152
- end
153
- @pdf.stamp("MyStamp")
154
- stamps = PDF::Inspector::XObject.analyze(@pdf.render)
155
- stamp_stream = stamps.xobject_streams[:Stamp1].data
156
- stamp_stream.should include("/DeviceCMYK CS\n1.000 1.000 0.200 0.000 SCN")
157
- end
158
- end
data/spec/stream_spec.rb DELETED
@@ -1,58 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
-
5
- describe "Stream object" do
6
- it "should compress a stream upon request" do
7
- stream = PDF::Core::Stream.new
8
- stream << "Hi There " * 20
9
-
10
- cstream = PDF::Core::Stream.new
11
- cstream << "Hi There " * 20
12
- cstream.compress!
13
-
14
- cstream.filtered_stream.length.should be < stream.length,
15
- "compressed stream expected to be smaller than source but wasn't"
16
- cstream.data[:Filter].should == [:FlateDecode]
17
- end
18
-
19
- it "should expose sompression state" do
20
- stream = PDF::Core::Stream.new
21
- stream << "Hello"
22
- stream.compress!
23
-
24
- stream.should be_compressed
25
- end
26
-
27
- it "should detect from filters if stream is compressed" do
28
- stream = PDF::Core::Stream.new
29
- stream << "Hello"
30
- stream.filters << :FlateDecode
31
-
32
- stream.should be_compressed
33
- end
34
-
35
- it "should have Length if in data" do
36
- stream = PDF::Core::Stream.new
37
- stream << "hello"
38
-
39
- stream.data[:Length].should == 5
40
- end
41
-
42
- it "should update Length when updated" do
43
- stream = PDF::Core::Stream.new
44
- stream << "hello"
45
- stream.data[:Length].should == 5
46
-
47
- stream << " world"
48
- stream.data[:Length].should == 11
49
- end
50
-
51
- it "should corecly handle decode params" do
52
- stream = PDF::Core::Stream.new
53
- stream << "Hello"
54
- stream.filters << { :FlateDecode => { :Predictor => 15 } }
55
-
56
- stream.data[:DecodeParms].should == [{ :Predictor => 15 }]
57
- end
58
- end