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/outline_spec.rb DELETED
@@ -1,448 +0,0 @@
1
- # encoding: utf-8
2
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
3
-
4
- describe "Outline" do
5
- before(:each) do
6
- @pdf = Prawn::Document.new() do
7
- text "Page 1. This is the first Chapter. "
8
- start_new_page
9
- text "Page 2. More in the first Chapter. "
10
- start_new_page
11
- outline.define do
12
- section 'Chapter 1', :destination => 1, :closed => true do
13
- page :destination => 1, :title => 'Page 1'
14
- page :destination => 2, :title => 'Page 2'
15
- end
16
- end
17
- end
18
- end
19
- if RUBY_VERSION >= "1.9"
20
- describe "outline encoding" do
21
- it "should store all outline titles as UTF-16" do
22
- render_and_find_objects
23
- @hash.values.each do |obj|
24
- if obj.is_a?(Hash) && obj[:Title]
25
- title = obj[:Title].dup
26
- title.force_encoding("UTF-16LE")
27
- title.valid_encoding?.should == true
28
- end
29
- end
30
- end
31
- end
32
- end
33
- describe "#generate_outline" do
34
- before(:each) do
35
- render_and_find_objects
36
- end
37
-
38
- it "should create a root outline dictionary item" do
39
- @outline_root.should_not be_nil
40
- end
41
-
42
- it "should set the first and last top items of the root outline dictionary item" do
43
- referenced_object(@outline_root[:First]).should == @section_1
44
- referenced_object(@outline_root[:Last]).should == @section_1
45
- end
46
-
47
- describe "#create_outline_item" do
48
- it "should create outline items for each section and page" do
49
- [@section_1, @page_1, @page_2].each {|item| item.should_not be_nil}
50
- end
51
- end
52
-
53
- describe "#set_relations, #set_variables_for_block, and #reset_parent" do
54
- it "should link sibling items" do
55
- referenced_object(@page_1[:Next]).should == @page_2
56
- referenced_object(@page_2[:Prev]).should == @page_1
57
- end
58
-
59
- it "should link child items to parent item" do
60
- [@page_1, @page_2].each {|page| referenced_object(page[:Parent]).should == @section_1 }
61
- end
62
-
63
- it "should set the first and last child items for parent item" do
64
- referenced_object(@section_1[:First]).should == @page_1
65
- referenced_object(@section_1[:Last]).should == @page_2
66
- end
67
- end
68
-
69
- describe "#increase_count" do
70
-
71
- it "should add the count of all descendant items" do
72
- @outline_root[:Count].should == 3
73
- @section_1[:Count].abs.should == 2
74
- @page_1[:Count].should == 0
75
- @page_2[:Count].should == 0
76
- end
77
-
78
- end
79
-
80
- describe "closed option" do
81
-
82
- it "should set the item's integer count to negative" do
83
- @section_1[:Count].should == -2
84
- end
85
-
86
- end
87
-
88
- end
89
-
90
- describe "adding a custom destination" do
91
- before(:each) do
92
- @pdf.start_new_page
93
- @pdf.text "Page 3 with a destination"
94
- @pdf.add_dest('customdest', @pdf.dest_xyz(200, 200))
95
- pdf = @pdf
96
- @pdf.outline.update do
97
- page :destination => pdf.dest_xyz(200, 200), :title => 'Custom Destination'
98
- end
99
- render_and_find_objects
100
- end
101
-
102
- it "should create an outline item" do
103
- @custom_dest.should_not be_nil
104
- end
105
-
106
- it "should reference the custom destination" do
107
- referenced_object(@custom_dest[:Dest].first).should == referenced_object(@pages.last)
108
- end
109
-
110
- end
111
-
112
- describe "addding a section later with outline#section" do
113
- before(:each) do
114
- @pdf.start_new_page
115
- @pdf.text "Page 3. An added section "
116
- @pdf.outline.update do
117
- section 'Added Section', :destination => 3 do
118
- page :destination => 3, :title => 'Page 3'
119
- end
120
- end
121
- render_and_find_objects
122
- end
123
-
124
- it "should add new outline items to document" do
125
- [@section_2, @page_3].each { |item| item.should_not be_nil}
126
- end
127
-
128
- it "should reset the last items for root outline dictionary" do
129
- referenced_object(@outline_root[:First]).should == @section_1
130
- referenced_object(@outline_root[:Last]).should == @section_2
131
- end
132
-
133
- it "should reset the next relation for the previous last top level item" do
134
- referenced_object(@section_1[:Next]).should == @section_2
135
- end
136
-
137
- it "should set the previous relation of the addded to section" do
138
- referenced_object(@section_2[:Prev]).should == @section_1
139
- end
140
-
141
- it "should increase the count of root outline dictionary" do
142
- @outline_root[:Count].should == 5
143
- end
144
-
145
- end
146
-
147
- describe "#outline.add_subsection_to" do
148
- context "positioned last" do
149
-
150
- before(:each) do
151
- @pdf.start_new_page
152
- @pdf.text "Page 3. An added subsection "
153
- @pdf.outline.update do
154
- add_subsection_to 'Chapter 1' do
155
- section 'Added SubSection', :destination => 3 do
156
- page :destination => 3, :title => 'Added Page 3'
157
- end
158
- end
159
- end
160
- render_and_find_objects
161
- end
162
-
163
- it "should add new outline items to document" do
164
- [@subsection, @added_page_3].each { |item| item.should_not be_nil}
165
- end
166
-
167
- it "should reset the last item for parent item dictionary" do
168
- referenced_object(@section_1[:First]).should == @page_1
169
- referenced_object(@section_1[:Last]).should == @subsection
170
- end
171
-
172
- it "should set the prev relation for the new subsection to its parent's old last item" do
173
- referenced_object(@subsection[:Prev]).should == @page_2
174
- end
175
-
176
-
177
- it "the subsection should become the next relation for its parent's old last item" do
178
- referenced_object(@page_2[:Next]).should == @subsection
179
- end
180
-
181
- it "should set the first relation for the new subsection" do
182
- referenced_object(@subsection[:First]).should == @added_page_3
183
- end
184
-
185
- it "should set the correct last relation of the added to section" do
186
- referenced_object(@subsection[:Last]).should == @added_page_3
187
- end
188
-
189
- it "should increase the count of root outline dictionary" do
190
- @outline_root[:Count].should == 5
191
- end
192
-
193
- end
194
-
195
- context "positioned first" do
196
-
197
- before(:each) do
198
- @pdf.start_new_page
199
- @pdf.text "Page 3. An added subsection "
200
- @pdf.outline.update do
201
- add_subsection_to 'Chapter 1', :first do
202
- section 'Added SubSection', :destination => 3 do
203
- page :destination => 3, :title => 'Added Page 3'
204
- end
205
- end
206
- end
207
- render_and_find_objects
208
- end
209
-
210
- it "should add new outline items to document" do
211
- [@subsection, @added_page_3].each { |item| item.should_not be_nil}
212
- end
213
-
214
- it "should reset the first item for parent item dictionary" do
215
- referenced_object(@section_1[:First]).should == @subsection
216
- referenced_object(@section_1[:Last]).should == @page_2
217
- end
218
-
219
- it "should set the next relation for the new subsection to its parent's old first item" do
220
- referenced_object(@subsection[:Next]).should == @page_1
221
- end
222
-
223
- it "the subsection should become the prev relation for its parent's old first item" do
224
- referenced_object(@page_1[:Prev]).should == @subsection
225
- end
226
-
227
- it "should set the first relation for the new subsection" do
228
- referenced_object(@subsection[:First]).should == @added_page_3
229
- end
230
-
231
- it "should set the correct last relation of the added to section" do
232
- referenced_object(@subsection[:Last]).should == @added_page_3
233
- end
234
-
235
- it "should increase the count of root outline dictionary" do
236
- @outline_root[:Count].should == 5
237
- end
238
-
239
- end
240
-
241
- it "should require an existing title" do
242
- lambda do
243
- @pdf.go_to_page 1
244
- @pdf.start_new_page
245
- @pdf.text "Inserted Page"
246
- @pdf.outline.update do
247
- add_subsection_to 'Wrong page' do
248
- page page_number, :title => "Inserted Page"
249
- end
250
- end
251
- render_and_find_objects
252
- end.should raise_error(Prawn::Errors::UnknownOutlineTitle)
253
- end
254
- end
255
-
256
- describe "#outline.insert_section_after" do
257
- describe "inserting in the middle of another section" do
258
- before(:each) do
259
- @pdf.go_to_page 1
260
- @pdf.start_new_page
261
- @pdf.text "Inserted Page"
262
- @pdf.outline.update do
263
- insert_section_after 'Page 1' do
264
- page :destination => page_number, :title => "Inserted Page"
265
- end
266
- end
267
- end
268
-
269
- it "should insert new outline items to document" do
270
- render_and_find_objects
271
- @inserted_page.should_not be_nil
272
- end
273
-
274
- it "should adjust the count of all ancestors" do
275
- render_and_find_objects
276
- @outline_root[:Count].should == 4
277
- @section_1[:Count].abs.should == 3
278
- end
279
-
280
- describe "#adjust_relations" do
281
-
282
- it "should reset the sibling relations of adjoining items to inserted item" do
283
- render_and_find_objects
284
- referenced_object(@page_1[:Next]).should == @inserted_page
285
- referenced_object(@page_2[:Prev]).should == @inserted_page
286
- end
287
-
288
- it "should set the sibling relation of added item to adjoining items" do
289
- render_and_find_objects
290
- referenced_object(@inserted_page[:Next]).should == @page_2
291
- referenced_object(@inserted_page[:Prev]).should == @page_1
292
- end
293
-
294
- it "should not affect the first and last relations of parent item" do
295
- render_and_find_objects
296
- referenced_object(@section_1[:First]).should == @page_1
297
- referenced_object(@section_1[:Last]).should == @page_2
298
- end
299
-
300
- end
301
-
302
-
303
- context "when adding another section afterwards" do
304
- it "should have reset the root position so that a new section is added at the end of root sections" do
305
- @pdf.start_new_page
306
- @pdf.text "Another Inserted Page"
307
- @pdf.outline.update do
308
- section 'Added Section' do
309
- page :destination => page_number, :title => "Inserted Page"
310
- end
311
- end
312
- render_and_find_objects
313
- referenced_object(@outline_root[:Last]).should == @section_2
314
- referenced_object(@section_1[:Next]).should == @section_2
315
- end
316
- end
317
-
318
- end
319
-
320
-
321
- describe "inserting at the end of another section" do
322
-
323
- before(:each) do
324
- @pdf.go_to_page 2
325
- @pdf.start_new_page
326
- @pdf.text "Inserted Page"
327
- @pdf.outline.update do
328
- insert_section_after 'Page 2' do
329
- page :destination => page_number, :title => "Inserted Page"
330
- end
331
- end
332
- render_and_find_objects
333
- end
334
-
335
- describe "#adjust_relations" do
336
-
337
- it "should reset the sibling relations of adjoining item to inserted item" do
338
- referenced_object(@page_2[:Next]).should == @inserted_page
339
- end
340
-
341
- it "should set the sibling relation of added item to adjoining items" do
342
- referenced_object(@inserted_page[:Next]).should be_nil
343
- referenced_object(@inserted_page[:Prev]).should == @page_2
344
- end
345
-
346
- it "should adjust the last relation of parent item" do
347
- referenced_object(@section_1[:Last]).should == @inserted_page
348
- end
349
-
350
- end
351
- end
352
-
353
- it "should require an existing title" do
354
- lambda do
355
- @pdf.go_to_page 1
356
- @pdf.start_new_page
357
- @pdf.text "Inserted Page"
358
- @pdf.outline.update do
359
- insert_section_after 'Wrong page' do
360
- page :destination => page_number, :title => "Inserted Page"
361
- end
362
- end
363
- render_and_find_objects
364
- end.should raise_error(Prawn::Errors::UnknownOutlineTitle)
365
- end
366
-
367
- end
368
-
369
- describe "#page" do
370
- it "should require a title option to be set" do
371
- lambda do
372
- @pdf = Prawn::Document.new() do
373
- text "Page 1. This is the first Chapter. "
374
- outline.define do
375
- page :destination => 1, :title => nil
376
- end
377
- end
378
- end.should raise_error(Prawn::Errors::RequiredOption)
379
- end
380
- end
381
- end
382
-
383
- describe "foreign character encoding" do
384
- before(:each) do
385
- pdf = Prawn::Document.new() do
386
- outline.define do
387
- section 'La pomme croquée', :destination => 1, :closed => true
388
- end
389
- end
390
- @hash = PDF::Reader::ObjectHash.new(StringIO.new(pdf.render, 'r+'))
391
- end
392
-
393
- it "should handle other encodings for the title" do
394
- object = find_by_title('La pomme croquée')
395
- object.should_not == nil
396
- end
397
- end
398
-
399
- describe "with optimize_objects option" do
400
- before(:each) do
401
- @pdf = Prawn::Document.new(:optimize_objects => true) do
402
- outline.define do
403
- section 'Chapter 1', :destination => 1, :closed => true do
404
- page :destination => 1, :title => 'Page 1'
405
- end
406
- end
407
- end
408
- render_and_find_objects
409
- end
410
-
411
- it "should generate an outline" do
412
- @section_1.should_not be_nil
413
- @page_1.should_not be_nil
414
- end
415
- end
416
-
417
- def render_and_find_objects
418
- output = StringIO.new(@pdf.render, 'r+')
419
- @hash = PDF::Reader::ObjectHash.new(output)
420
- @outline_root = @hash.values.find {|obj| obj.is_a?(Hash) && obj[:Type] == :Outlines}
421
- @pages = @hash.values.find {|obj| obj.is_a?(Hash) && obj[:Type] == :Pages}[:Kids]
422
- @section_1 = find_by_title('Chapter 1')
423
- @page_1 = find_by_title('Page 1')
424
- @page_2 = find_by_title('Page 2')
425
- @section_2 = find_by_title('Added Section')
426
- @page_3 = find_by_title('Page 3')
427
- @inserted_page = find_by_title('Inserted Page')
428
- @subsection = find_by_title('Added SubSection')
429
- @added_page_3 = find_by_title('Added Page 3')
430
- @custom_dest = find_by_title('Custom Destination')
431
- end
432
-
433
- # Outline titles are stored as UTF-16. This method accepts a UTF-8 outline title
434
- # and returns the PDF Object that contains an outline with that name
435
- def find_by_title(title)
436
- @hash.values.find {|obj|
437
- if obj.is_a?(Hash) && obj[:Title]
438
- title_codepoints = obj[:Title].unpack("n*")
439
- title_codepoints.shift
440
- utf8_title = title_codepoints.pack("U*")
441
- utf8_title == title ? obj : nil
442
- end
443
- }
444
- end
445
-
446
- def referenced_object(reference)
447
- @hash[reference]
448
- end
@@ -1,172 +0,0 @@
1
- # encoding: ASCII-8BIT
2
-
3
- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
-
5
- # See PDF Reference, Sixth Edition (1.7) pp51-60 for details
6
- describe "PDF Object Serialization" do
7
-
8
- it "should convert Ruby's nil to PDF null" do
9
- PDF::Core::PdfObject(nil).should == "null"
10
- end
11
-
12
- it "should convert Ruby booleans to PDF booleans" do
13
- PDF::Core::PdfObject(true).should == "true"
14
- PDF::Core::PdfObject(false).should == "false"
15
- end
16
-
17
- it "should convert a Ruby number to PDF number" do
18
- PDF::Core::PdfObject(1).should == "1"
19
- PDF::Core::PdfObject(1.214112421).should == "1.214112421"
20
- # scientific notation is not valid in PDF
21
- PDF::Core::PdfObject(0.000005).should == "0.000005"
22
- end
23
-
24
- it "should convert a Ruby time object to a PDF timestamp" do
25
- t = Time.now
26
- PDF::Core::PdfObject(t).should == t.strftime("(D:%Y%m%d%H%M%S%z").chop.chop + "'00')"
27
- end
28
-
29
- it "should convert a Ruby string to PDF string when inside a content stream" do
30
- s = "I can has a string"
31
- PDF::Inspector.parse(PDF::Core::PdfObject(s, true)).should == s
32
- end
33
-
34
- it "should convert a Ruby string to a UTF-16 PDF string when outside a content stream" do
35
- s = "I can has a string"
36
- s_utf16 = "\xFE\xFF" + s.unpack("U*").pack("n*")
37
- PDF::Inspector.parse(PDF::Core::PdfObject(s, false)).should == s_utf16
38
- end
39
-
40
- it "should convert a Ruby string with characters outside the BMP to its " +
41
- "UTF-16 representation with a BOM" do
42
- # U+10192 ROMAN SEMUNCIA SIGN
43
- semuncia = [65938].pack("U")
44
- PDF::Core::PdfObject(semuncia, false).upcase.should == "<FEFFD800DD92>"
45
- end
46
-
47
- it "should pass through bytes regardless of content stream status for ByteString" do
48
- PDF::Core::PdfObject(PDF::Core::ByteString.new("\xDE\xAD\xBE\xEF")).upcase.
49
- should == "<DEADBEEF>"
50
- end
51
-
52
- it "should escape parens when converting from Ruby string to PDF" do
53
- s = 'I )(can has a string'
54
- PDF::Inspector.parse(PDF::Core::PdfObject(s, true)).should == s
55
- end
56
-
57
- it "should handle ruby escaped parens when converting to PDF string" do
58
- s = 'I can \\)( has string'
59
- PDF::Inspector.parse(PDF::Core::PdfObject(s, true)).should == s
60
- end
61
-
62
- it "should escape various strings correctly when converting a LiteralString" do
63
- ls = PDF::Core::LiteralString.new("abc")
64
- PDF::Core::PdfObject(ls).should == "(abc)"
65
-
66
- ls = PDF::Core::LiteralString.new("abc\x0Ade") # should escape \n
67
- PDF::Core::PdfObject(ls).should == "(abc\x5C\x0Ade)"
68
-
69
- ls = PDF::Core::LiteralString.new("abc\x0Dde") # should escape \r
70
- PDF::Core::PdfObject(ls).should == "(abc\x5C\x0Dde)"
71
-
72
- ls = PDF::Core::LiteralString.new("abc\x09de") # should escape \t
73
- PDF::Core::PdfObject(ls).should == "(abc\x5C\x09de)"
74
-
75
- ls = PDF::Core::LiteralString.new("abc\x08de") # should escape \b
76
- PDF::Core::PdfObject(ls).should == "(abc\x5C\x08de)"
77
-
78
- ls = PDF::Core::LiteralString.new("abc\x0Cde") # should escape \f
79
- PDF::Core::PdfObject(ls).should == "(abc\x5C\x0Cde)"
80
-
81
- ls = PDF::Core::LiteralString.new("abc(de") # should escape \(
82
- PDF::Core::PdfObject(ls).should == "(abc\x5C(de)"
83
-
84
- ls = PDF::Core::LiteralString.new("abc)de") # should escape \)
85
- PDF::Core::PdfObject(ls).should == "(abc\x5C)de)"
86
-
87
- ls = PDF::Core::LiteralString.new("abc\x5Cde") # should escape \\
88
- PDF::Core::PdfObject(ls).should == "(abc\x5C\x5Cde)"
89
- PDF::Core::PdfObject(ls).size.should == 9
90
- end
91
-
92
- it "should escape strings correctly when converting a LiteralString that is not utf-8" do
93
- data = "\x43\xaf\xc9\x7f\xef\xf\xe6\xa8\xcb\x5c\xaf\xd0"
94
- ls = PDF::Core::LiteralString.new(data)
95
- PDF::Core::PdfObject(ls).should == "(\x43\xaf\xc9\x7f\xef\xf\xe6\xa8\xcb\x5c\x5c\xaf\xd0)"
96
- end
97
-
98
- it "should convert a Ruby symbol to PDF name" do
99
- PDF::Core::PdfObject(:my_symbol).should == "/my_symbol"
100
- PDF::Core::PdfObject(:"A;Name_With-Various***Characters?").should ==
101
- "/A;Name_With-Various***Characters?"
102
- end
103
-
104
- it "should convert a whitespace or delimiter containing Ruby symbol to a PDF name" do
105
- PDF::Core::PdfObject(:"my symbol").should == "/my#20symbol"
106
- PDF::Core::PdfObject(:"my#symbol").should == "/my#23symbol"
107
- PDF::Core::PdfObject(:"my/symbol").should == "/my#2Fsymbol"
108
- PDF::Core::PdfObject(:"my(symbol").should == "/my#28symbol"
109
- PDF::Core::PdfObject(:"my)symbol").should == "/my#29symbol"
110
- PDF::Core::PdfObject(:"my<symbol").should == "/my#3Csymbol"
111
- PDF::Core::PdfObject(:"my>symbol").should == "/my#3Esymbol"
112
- end
113
-
114
- it "should convert a Ruby array to PDF Array when inside a content stream" do
115
- PDF::Core::PdfObject([1,2,3]).should == "[1 2 3]"
116
- PDF::Inspector.parse(PDF::Core::PdfObject([[1,2],:foo,"Bar"], true)).should ==
117
- [[1,2],:foo, "Bar"]
118
- end
119
-
120
- it "should convert a Ruby array to PDF Array when outside a content stream" do
121
- bar = "\xFE\xFF" + "Bar".unpack("U*").pack("n*")
122
- PDF::Core::PdfObject([1,2,3]).should == "[1 2 3]"
123
- PDF::Inspector.parse(PDF::Core::PdfObject([[1,2],:foo,"Bar"], false)).should ==
124
- [[1,2],:foo, bar]
125
- end
126
-
127
- it "should convert a Ruby hash to a PDF Dictionary when inside a content stream" do
128
- dict = PDF::Core::PdfObject( {:foo => :bar,
129
- "baz" => [1,2,3],
130
- :bang => {:a => "what", :b => [:you, :say] }}, true )
131
-
132
- res = PDF::Inspector.parse(dict)
133
-
134
- res[:foo].should == :bar
135
- res[:baz].should == [1,2,3]
136
- res[:bang].should == { :a => "what", :b => [:you, :say] }
137
-
138
- end
139
-
140
- it "should convert a Ruby hash to a PDF Dictionary when outside a content stream" do
141
- what = "\xFE\xFF" + "what".unpack("U*").pack("n*")
142
- dict = PDF::Core::PdfObject( {:foo => :bar,
143
- "baz" => [1,2,3],
144
- :bang => {:a => "what", :b => [:you, :say] }}, false )
145
-
146
- res = PDF::Inspector.parse(dict)
147
-
148
- res[:foo].should == :bar
149
- res[:baz].should == [1,2,3]
150
- res[:bang].should == { :a => what, :b => [:you, :say] }
151
-
152
- end
153
-
154
- it "should not allow keys other than strings or symbols for PDF dicts" do
155
- lambda { PDF::Core::PdfObject(:foo => :bar, :baz => :bang, 1 => 4) }.
156
- should raise_error(PDF::Core::Errors::FailedObjectConversion)
157
- end
158
-
159
- it "should convert a Prawn::Reference to a PDF indirect object reference" do
160
- ref = PDF::Core::Reference(1,true)
161
- PDF::Core::PdfObject(ref).should == ref.to_s
162
- end
163
-
164
- it "should convert a NameTree::Node to a PDF hash" do
165
- node = PDF::Core::NameTree::Node.new(Prawn::Document.new, 10)
166
- node.add "hello", 1.0
167
- node.add "world", 2.0
168
- data = PDF::Core::PdfObject(node)
169
- res = PDF::Inspector.parse(data)
170
- res.should == {:Names => ["hello", 1.0, "world", 2.0]}
171
- end
172
- end