prawn 0.12.0 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (282) hide show
  1. checksums.yaml +7 -0
  2. data/COPYING +2 -2
  3. data/Gemfile +18 -0
  4. data/LICENSE +1 -1
  5. data/README.md +17 -4
  6. data/Rakefile +18 -22
  7. data/data/images/indexed_color.dat +0 -0
  8. data/data/images/indexed_color.png +0 -0
  9. data/data/pdfs/nested_pages.pdf +13 -13
  10. data/lib/pdf/core.rb +35 -0
  11. data/lib/{prawn → pdf}/core/annotations.rb +6 -7
  12. data/lib/{prawn → pdf}/core/byte_string.rb +1 -1
  13. data/lib/{prawn → pdf}/core/destinations.rb +23 -23
  14. data/lib/{prawn → pdf}/core/document_state.rb +8 -8
  15. data/lib/pdf/core/filter_list.rb +51 -0
  16. data/lib/pdf/core/filters.rb +36 -0
  17. data/lib/pdf/core/graphics_state.rb +68 -0
  18. data/lib/{prawn → pdf}/core/literal_string.rb +1 -1
  19. data/lib/{prawn → pdf}/core/name_tree.rb +14 -2
  20. data/lib/{prawn → pdf}/core/object_store.rb +80 -24
  21. data/lib/pdf/core/outline.rb +315 -0
  22. data/lib/{prawn → pdf}/core/page.rb +23 -26
  23. data/lib/{prawn/document → pdf/core}/page_geometry.rb +11 -21
  24. data/lib/{prawn → pdf}/core/pdf_object.rb +48 -32
  25. data/lib/{prawn → pdf}/core/reference.rb +35 -44
  26. data/lib/pdf/core/stream.rb +98 -0
  27. data/lib/{prawn → pdf}/core/text.rb +24 -17
  28. data/lib/prawn.rb +95 -17
  29. data/lib/prawn/compatibility.rb +66 -26
  30. data/lib/prawn/document.rb +48 -30
  31. data/lib/prawn/document/bounding_box.rb +3 -3
  32. data/lib/prawn/document/column_box.rb +46 -8
  33. data/lib/prawn/document/graphics_state.rb +10 -73
  34. data/lib/prawn/document/internals.rb +24 -23
  35. data/lib/prawn/document/snapshot.rb +6 -7
  36. data/lib/prawn/document/span.rb +10 -10
  37. data/lib/prawn/encoding.rb +7 -7
  38. data/lib/prawn/errors.rb +18 -29
  39. data/lib/prawn/font.rb +64 -28
  40. data/lib/prawn/font/afm.rb +32 -74
  41. data/lib/prawn/font/dfont.rb +2 -2
  42. data/lib/prawn/font/ttf.rb +28 -57
  43. data/lib/prawn/font_metric_cache.rb +45 -0
  44. data/lib/prawn/graphics.rb +307 -41
  45. data/lib/prawn/graphics/cap_style.rb +3 -3
  46. data/lib/prawn/graphics/color.rb +12 -5
  47. data/lib/prawn/graphics/dash.rb +52 -31
  48. data/lib/prawn/graphics/join_style.rb +7 -7
  49. data/lib/prawn/graphics/patterns.rb +137 -0
  50. data/lib/prawn/graphics/transformation.rb +9 -9
  51. data/lib/prawn/graphics/transparency.rb +1 -1
  52. data/lib/prawn/image_handler.rb +30 -0
  53. data/lib/prawn/images.rb +86 -105
  54. data/lib/prawn/images/image.rb +48 -0
  55. data/lib/prawn/images/jpg.rb +14 -10
  56. data/lib/prawn/images/png.rb +50 -37
  57. data/lib/prawn/layout.rb +2 -2
  58. data/lib/prawn/layout/grid.rb +51 -51
  59. data/lib/prawn/measurement_extensions.rb +5 -5
  60. data/lib/prawn/measurements.rb +25 -21
  61. data/lib/prawn/outline.rb +4 -308
  62. data/lib/prawn/repeater.rb +8 -8
  63. data/lib/prawn/security.rb +50 -36
  64. data/lib/prawn/soft_mask.rb +94 -0
  65. data/lib/prawn/stamp.rb +3 -3
  66. data/lib/prawn/table.rb +292 -118
  67. data/lib/prawn/table/cell.rb +272 -45
  68. data/lib/prawn/table/cell/image.rb +70 -0
  69. data/lib/prawn/table/cell/in_table.rb +2 -2
  70. data/lib/prawn/table/cell/span_dummy.rb +92 -0
  71. data/lib/prawn/table/cell/subtable.rb +2 -2
  72. data/lib/prawn/table/cell/text.rb +42 -24
  73. data/lib/prawn/table/cells.rb +137 -48
  74. data/lib/prawn/text.rb +35 -23
  75. data/lib/prawn/text/box.rb +18 -5
  76. data/lib/prawn/text/formatted.rb +5 -4
  77. data/lib/prawn/text/formatted/arranger.rb +292 -0
  78. data/lib/prawn/text/formatted/box.rb +52 -13
  79. data/lib/prawn/text/formatted/fragment.rb +37 -22
  80. data/lib/prawn/text/formatted/line_wrap.rb +286 -0
  81. data/lib/prawn/text/formatted/parser.rb +14 -6
  82. data/lib/prawn/text/formatted/wrap.rb +151 -0
  83. data/lib/prawn/utilities.rb +44 -0
  84. data/manual/basic_concepts/adding_pages.rb +27 -0
  85. data/manual/basic_concepts/basic_concepts.rb +34 -0
  86. data/manual/basic_concepts/creation.rb +39 -0
  87. data/manual/basic_concepts/cursor.rb +33 -0
  88. data/manual/basic_concepts/measurement.rb +25 -0
  89. data/manual/basic_concepts/origin.rb +38 -0
  90. data/manual/basic_concepts/other_cursor_helpers.rb +40 -0
  91. data/manual/bounding_box/bounding_box.rb +39 -0
  92. data/manual/bounding_box/bounds.rb +49 -0
  93. data/manual/bounding_box/canvas.rb +24 -0
  94. data/manual/bounding_box/creation.rb +23 -0
  95. data/manual/bounding_box/indentation.rb +46 -0
  96. data/manual/bounding_box/nesting.rb +45 -0
  97. data/manual/bounding_box/russian_boxes.rb +40 -0
  98. data/manual/bounding_box/stretchy.rb +31 -0
  99. data/manual/document_and_page_options/background.rb +27 -0
  100. data/manual/document_and_page_options/document_and_page_options.rb +31 -0
  101. data/manual/document_and_page_options/metadata.rb +23 -0
  102. data/manual/document_and_page_options/page_margins.rb +38 -0
  103. data/manual/document_and_page_options/page_size.rb +34 -0
  104. data/manual/example_file.rb +116 -0
  105. data/manual/example_helper.rb +411 -0
  106. data/manual/example_package.rb +53 -0
  107. data/manual/example_section.rb +46 -0
  108. data/manual/graphics/circle_and_ellipse.rb +22 -0
  109. data/manual/graphics/color.rb +24 -0
  110. data/manual/graphics/common_lines.rb +28 -0
  111. data/manual/graphics/fill_and_stroke.rb +42 -0
  112. data/manual/graphics/fill_rules.rb +37 -0
  113. data/manual/graphics/gradients.rb +37 -0
  114. data/manual/graphics/graphics.rb +58 -0
  115. data/manual/graphics/helper.rb +24 -0
  116. data/manual/graphics/line_width.rb +35 -0
  117. data/manual/graphics/lines_and_curves.rb +41 -0
  118. data/manual/graphics/polygon.rb +29 -0
  119. data/manual/graphics/rectangle.rb +21 -0
  120. data/manual/graphics/rotate.rb +28 -0
  121. data/manual/graphics/scale.rb +41 -0
  122. data/manual/graphics/soft_masks.rb +46 -0
  123. data/manual/graphics/stroke_cap.rb +31 -0
  124. data/manual/graphics/stroke_dash.rb +48 -0
  125. data/manual/graphics/stroke_join.rb +30 -0
  126. data/manual/graphics/translate.rb +29 -0
  127. data/manual/graphics/transparency.rb +35 -0
  128. data/manual/images/absolute_position.rb +23 -0
  129. data/manual/images/fit.rb +21 -0
  130. data/manual/images/horizontal.rb +25 -0
  131. data/manual/images/images.rb +40 -0
  132. data/manual/images/plain_image.rb +18 -0
  133. data/manual/images/scale.rb +22 -0
  134. data/manual/images/vertical.rb +28 -0
  135. data/manual/images/width_and_height.rb +25 -0
  136. data/manual/layout/boxes.rb +27 -0
  137. data/manual/layout/content.rb +25 -0
  138. data/manual/layout/layout.rb +28 -0
  139. data/manual/layout/simple_grid.rb +23 -0
  140. data/manual/manual/cover.rb +35 -0
  141. data/manual/manual/foreword.rb +85 -0
  142. data/manual/manual/how_to_read_this_manual.rb +41 -0
  143. data/manual/manual/manual.rb +35 -0
  144. data/manual/outline/add_subsection_to.rb +61 -0
  145. data/manual/outline/insert_section_after.rb +47 -0
  146. data/manual/outline/outline.rb +32 -0
  147. data/manual/outline/sections_and_pages.rb +67 -0
  148. data/manual/repeatable_content/page_numbering.rb +54 -0
  149. data/manual/repeatable_content/repeatable_content.rb +31 -0
  150. data/manual/repeatable_content/repeater.rb +55 -0
  151. data/manual/repeatable_content/stamp.rb +41 -0
  152. data/manual/security/encryption.rb +31 -0
  153. data/manual/security/permissions.rb +38 -0
  154. data/manual/security/security.rb +28 -0
  155. data/manual/syntax_highlight.rb +52 -0
  156. data/manual/table/basic_block.rb +53 -0
  157. data/manual/table/before_rendering_page.rb +26 -0
  158. data/manual/table/cell_border_lines.rb +24 -0
  159. data/manual/table/cell_borders_and_bg.rb +31 -0
  160. data/manual/table/cell_dimensions.rb +30 -0
  161. data/manual/table/cell_text.rb +38 -0
  162. data/manual/table/column_widths.rb +30 -0
  163. data/manual/table/content_and_subtables.rb +39 -0
  164. data/manual/table/creation.rb +27 -0
  165. data/manual/table/filtering.rb +36 -0
  166. data/manual/table/flow_and_header.rb +17 -0
  167. data/manual/table/image_cells.rb +33 -0
  168. data/manual/table/position.rb +29 -0
  169. data/manual/table/row_colors.rb +20 -0
  170. data/manual/table/span.rb +30 -0
  171. data/manual/table/style.rb +22 -0
  172. data/manual/table/table.rb +52 -0
  173. data/manual/table/width.rb +27 -0
  174. data/manual/templates/full_template.rb +25 -0
  175. data/manual/templates/page_template.rb +48 -0
  176. data/manual/templates/templates.rb +27 -0
  177. data/manual/text/alignment.rb +44 -0
  178. data/manual/text/color.rb +24 -0
  179. data/manual/text/column_box.rb +32 -0
  180. data/manual/text/fallback_fonts.rb +37 -0
  181. data/manual/text/font.rb +41 -0
  182. data/manual/text/font_size.rb +45 -0
  183. data/manual/text/font_style.rb +23 -0
  184. data/manual/text/formatted_callbacks.rb +60 -0
  185. data/manual/text/formatted_text.rb +54 -0
  186. data/manual/text/free_flowing_text.rb +51 -0
  187. data/manual/text/group.rb +29 -0
  188. data/manual/text/inline.rb +43 -0
  189. data/manual/text/kerning_and_character_spacing.rb +39 -0
  190. data/manual/text/leading.rb +25 -0
  191. data/manual/text/line_wrapping.rb +41 -0
  192. data/manual/text/paragraph_indentation.rb +26 -0
  193. data/manual/text/positioned_text.rb +38 -0
  194. data/manual/text/registering_families.rb +48 -0
  195. data/manual/text/rendering_and_color.rb +37 -0
  196. data/manual/text/right_to_left_text.rb +43 -0
  197. data/manual/text/rotation.rb +43 -0
  198. data/manual/text/single_usage.rb +37 -0
  199. data/manual/text/text.rb +75 -0
  200. data/manual/text/text_box_excess.rb +32 -0
  201. data/manual/text/text_box_extensions.rb +45 -0
  202. data/manual/text/text_box_overflow.rb +44 -0
  203. data/manual/text/utf8.rb +28 -0
  204. data/{examples/m17n → manual/text}/win_ansi_charset.rb +14 -10
  205. data/prawn.gemspec +18 -12
  206. data/spec/acceptance/png.rb +23 -0
  207. data/spec/annotations_spec.rb +16 -32
  208. data/spec/bounding_box_spec.rb +128 -15
  209. data/spec/cell_spec.rb +169 -38
  210. data/spec/column_box_spec.rb +33 -0
  211. data/spec/destinations_spec.rb +5 -5
  212. data/spec/document_spec.rb +150 -104
  213. data/spec/extensions/encoding_helpers.rb +10 -0
  214. data/spec/extensions/mocha.rb +1 -0
  215. data/spec/filters_spec.rb +34 -0
  216. data/spec/font_metric_cache_spec.rb +52 -0
  217. data/spec/font_spec.rb +183 -97
  218. data/spec/formatted_text_arranger_spec.rb +43 -43
  219. data/spec/formatted_text_box_spec.rb +30 -20
  220. data/spec/formatted_text_fragment_spec.rb +8 -8
  221. data/spec/graphics_spec.rb +158 -69
  222. data/spec/grid_spec.rb +15 -15
  223. data/spec/image_handler_spec.rb +42 -0
  224. data/spec/images_spec.rb +49 -24
  225. data/spec/inline_formatted_text_parser_spec.rb +73 -19
  226. data/spec/jpg_spec.rb +4 -4
  227. data/spec/line_wrap_spec.rb +26 -26
  228. data/spec/measurement_units_spec.rb +6 -6
  229. data/spec/name_tree_spec.rb +21 -21
  230. data/spec/object_store_spec.rb +39 -39
  231. data/spec/outline_spec.rb +93 -53
  232. data/spec/pdf_object_spec.rb +88 -86
  233. data/spec/png_spec.rb +31 -28
  234. data/spec/reference_spec.rb +32 -32
  235. data/spec/repeater_spec.rb +25 -11
  236. data/spec/security_spec.rb +44 -12
  237. data/spec/snapshot_spec.rb +8 -9
  238. data/spec/soft_mask_spec.rb +117 -0
  239. data/spec/span_spec.rb +10 -15
  240. data/spec/spec_helper.rb +25 -8
  241. data/spec/stamp_spec.rb +29 -30
  242. data/spec/stream_spec.rb +58 -0
  243. data/spec/stroke_styles_spec.rb +36 -18
  244. data/spec/table/span_dummy_spec.rb +17 -0
  245. data/spec/table_spec.rb +697 -105
  246. data/spec/template_spec.rb +108 -54
  247. data/spec/text_at_spec.rb +18 -17
  248. data/spec/text_box_spec.rb +111 -62
  249. data/spec/text_rendering_mode_spec.rb +5 -5
  250. data/spec/text_spacing_spec.rb +4 -4
  251. data/spec/text_spec.rb +57 -49
  252. data/spec/transparency_spec.rb +5 -5
  253. metadata +421 -213
  254. data/data/fonts/Action Man.dfont +0 -0
  255. data/data/fonts/Activa.ttf +0 -0
  256. data/data/fonts/Chalkboard.ttf +0 -0
  257. data/data/fonts/DejaVuSans.ttf +0 -0
  258. data/data/fonts/Dustismo_Roman.ttf +0 -0
  259. data/data/fonts/comicsans.ttf +0 -0
  260. data/data/fonts/gkai00mp.ttf +0 -0
  261. data/data/images/rails.dat +0 -0
  262. data/data/images/rails.png +0 -0
  263. data/examples/bounding_box/russian_boxes.rb +0 -37
  264. data/examples/example_helper.rb +0 -11
  265. data/examples/general/context_sensitive_headers.rb +0 -38
  266. data/examples/graphics/cmyk.rb +0 -13
  267. data/examples/graphics/gradient.rb +0 -23
  268. data/examples/graphics/png_types.rb +0 -23
  269. data/examples/graphics/remote_images.rb +0 -13
  270. data/examples/m17n/full_win_ansi_character_list.rb +0 -20
  271. data/examples/m17n/sjis.rb +0 -29
  272. data/examples/table/bill.rb +0 -54
  273. data/examples/table/header.rb +0 -15
  274. data/examples/text/font_calculations.rb +0 -92
  275. data/examples/text/hyphenation.rb +0 -45
  276. data/examples/text/indent_paragraphs.rb +0 -24
  277. data/lib/prawn/core.rb +0 -85
  278. data/lib/prawn/core/text/formatted/arranger.rb +0 -294
  279. data/lib/prawn/core/text/formatted/line_wrap.rb +0 -273
  280. data/lib/prawn/core/text/formatted/wrap.rb +0 -153
  281. data/lib/prawn/graphics/gradient.rb +0 -84
  282. data/lib/prawn/security/arcfour.rb +0 -51
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Another group of helpers for changing the cursor position are the pad methods.
4
+ # They accept a numeric value and a block. <code>pad</code> will use the numeric
5
+ # value to move the cursor down both before and after the block content.
6
+ # <code>pad_top</code> will only move the cursor before the block while
7
+ # <code>pad_bottom</code> will only move after.
8
+ #
9
+ # <code>float</code> is a method for not changing the cursor. Pass it a block
10
+ # and the cursor will remain on the same place when the block returns.
11
+ #
12
+ require File.expand_path(File.join(File.dirname(__FILE__),
13
+ %w[.. example_helper]))
14
+
15
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
16
+ Prawn::Example.generate(filename) do
17
+ stroke_horizontal_rule
18
+ pad(20) { text "Text padded both before and after." }
19
+
20
+ stroke_horizontal_rule
21
+ pad_top(20) { text "Text padded on the top." }
22
+
23
+ stroke_horizontal_rule
24
+ pad_bottom(20) { text "Text padded on the bottom." }
25
+
26
+ stroke_horizontal_rule
27
+ move_down 30
28
+
29
+ text "Text written before the float block."
30
+
31
+ float do
32
+ move_down 30
33
+ bounding_box([0, cursor], :width => 200) do
34
+ text "Text written inside the float block."
35
+ stroke_bounds
36
+ end
37
+ end
38
+
39
+ text "Text written after the float block."
40
+ end
@@ -0,0 +1,39 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Examples for bounding boxes.
4
+ #
5
+ require File.expand_path(File.join(File.dirname(__FILE__),
6
+ %w[.. example_helper]))
7
+
8
+ Prawn::Example.generate("bounding_box.pdf", :page_size => "FOLIO") do
9
+
10
+ package "bounding_box" do |p|
11
+
12
+ p.section "Basics" do |s|
13
+ s.example "creation"
14
+ s.example "bounds"
15
+ end
16
+
17
+ p.section "Advanced" do |s|
18
+ s.example "stretchy"
19
+ s.example "nesting"
20
+ s.example "indentation"
21
+ s.example "canvas"
22
+ s.example "russian_boxes"
23
+ end
24
+
25
+ p.intro do
26
+ prose("Bounding boxes are the basic containers for structuring the content flow. Even being low level building blocks sometimes their simplicity is very welcome.
27
+
28
+ The examples show:")
29
+
30
+ list( "How to create bounding boxes with specific dimensions",
31
+ "How to inspect the current bounding box for its coordinates",
32
+ "Stretchy bounding boxes",
33
+ "Nested bounding boxes",
34
+ "Indent blocks"
35
+ )
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,49 @@
1
+ # encoding: utf-8
2
+ #
3
+ # The <code>bounds</code> method returns the current bounding box. This is
4
+ # useful because the <code>Prawn::BoundinBox</code> exposes some nice boundary
5
+ # helpers.
6
+ #
7
+ # <code>top</code>, <code>bottom</code>, <code>left</code> and
8
+ # <code>right</code> methods return the bounding box boundaries relative to its
9
+ # translated origin. <code>top_left</code>, <code>top_right</code>,
10
+ # <code>bottom_left</code> and <code>bottom_right</code> return those boundaries
11
+ # pairs inside arrays.
12
+ #
13
+ # All these methods have an "absolute" version like <code>absolute_right</code>.
14
+ # The absolute version returns the same boundary relative to the page absolute
15
+ # coordinates.
16
+ #
17
+ # The following snippet shows the boundaries for the margin box side by side
18
+ # with the boundaries for a custom bounding box.
19
+ #
20
+ require File.expand_path(File.join(File.dirname(__FILE__),
21
+ %w[.. example_helper]))
22
+
23
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
24
+ Prawn::Example.generate(filename) do
25
+ def print_coordinates
26
+ text "top: #{bounds.top}"
27
+ text "bottom: #{bounds.bottom}"
28
+ text "left: #{bounds.left}"
29
+ text "right: #{bounds.right}"
30
+
31
+ move_down 10
32
+
33
+ text "absolute top: #{sprintf "%.2f", bounds.absolute_top}"
34
+ text "absolute bottom: #{sprintf "%.2f", bounds.absolute_bottom}"
35
+ text "absolute left: #{sprintf "%.2f", bounds.absolute_left}"
36
+ text "absolute right: #{sprintf "%.2f", bounds.absolute_right}"
37
+ end
38
+
39
+ text "Margin box bounds:"
40
+ move_down 5
41
+ print_coordinates
42
+
43
+ bounding_box([250, cursor + 140], :width => 200, :height => 150) do
44
+ text "This bounding box bounds:"
45
+ move_down 5
46
+ print_coordinates
47
+ transparent(0.5) { stroke_bounds }
48
+ end
49
+ end
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+ #
3
+ # The origin example already mentions that a new document already comes with
4
+ # a margin box whose bottom left corner is used as the origin for calculating
5
+ # coordinates.
6
+ #
7
+ # What has not been told is that there is one helper for "bypassing" the margin
8
+ # box: <code>canvas</code>. This method is a shortcut for creating a bounding
9
+ # box mapped to the absolute coordinates and evaluating the code inside it.
10
+ #
11
+ # The following snippet draws a circle on each of the four absolute corners.
12
+ #
13
+ require File.expand_path(File.join(File.dirname(__FILE__),
14
+ %w[.. example_helper]))
15
+
16
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
17
+ Prawn::Example.generate(filename) do
18
+ canvas do
19
+ fill_circle [bounds.left, bounds.top], 30
20
+ fill_circle [bounds.right, bounds.top], 30
21
+ fill_circle [bounds.right, bounds.bottom], 30
22
+ fill_circle [0, 0], 30
23
+ end
24
+ end
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+ #
3
+ # If you've read the basic concepts examples you probably know that the origin
4
+ # of a page is on the bottom left corner and that the content flows from top to
5
+ # bottom.
6
+ #
7
+ # You also know that a Bounding Box is a structure for helping the content flow.
8
+ #
9
+ # A bounding box can be created with the <code>bounding_box</code> method. Just
10
+ # provide the top left corner, a required <code>:width</code> option and an
11
+ # optional <code>:height</code>.
12
+ #
13
+ require File.expand_path(File.join(File.dirname(__FILE__),
14
+ %w[.. example_helper]))
15
+
16
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
17
+ Prawn::Example.generate(filename) do
18
+ bounding_box([200, cursor - 100], :width => 200, :height => 100) do
19
+ text "Just your regular bounding box"
20
+
21
+ transparent(0.5) { stroke_bounds }
22
+ end
23
+ end
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Sometimes you just need to indent a portion of the contents of a bounding box,
4
+ # and using a nested bounding box is pure overkill. The <code>indent</code>
5
+ # method is what you might need.
6
+ #
7
+ # Just provide a number for it to indent all content generated inside the
8
+ # block.
9
+ #
10
+ require File.expand_path(File.join(File.dirname(__FILE__),
11
+ %w[.. example_helper]))
12
+
13
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
14
+ Prawn::Example.generate(filename) do
15
+ text "No indentation on the margin box."
16
+ indent(20) do
17
+ text "Some indentation inside an indent block."
18
+ end
19
+ move_down 20
20
+
21
+ bounding_box([50, cursor], :width => 400, :height => cursor) do
22
+ transparent(0.5) { stroke_bounds }
23
+
24
+ move_down 10
25
+ text "No indentation inside this bounding box."
26
+ indent(40) do
27
+ text "Inside an indent block. And so is this horizontal line:"
28
+
29
+ stroke_horizontal_rule
30
+ end
31
+ move_down 10
32
+ text "No indentation"
33
+
34
+ move_down 20
35
+ indent(60) do
36
+ text "Another indent block."
37
+
38
+ bounding_box([0, cursor], :width => 200) do
39
+ text "Note that this bounding box coordinates are relative to the " +
40
+ "indent block"
41
+
42
+ transparent(0.5) { stroke_bounds }
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,45 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Normally when we provide the top left corner of a bounding box we
4
+ # express the coordinates relative to the margin box. This is not the
5
+ # case when we have nested bounding boxes. Once nested the inner bounding box
6
+ # coordinates are relative to the outter bounding box.
7
+ #
8
+ # This example shows some nested bounding boxes with fixed and stretchy heights.
9
+ # Note how the <code>cursor</code> method returns coordinates relative to
10
+ # the current bounding box.
11
+ #
12
+ require File.expand_path(File.join(File.dirname(__FILE__),
13
+ %w[.. example_helper]))
14
+
15
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
16
+ Prawn::Example.generate(filename) do
17
+ def box_content(string)
18
+ text string
19
+ transparent(0.5) { stroke_bounds }
20
+ end
21
+
22
+ gap = 20
23
+ bounding_box([50, cursor], :width => 400, :height => 200) do
24
+ box_content("Fixed height")
25
+
26
+ bounding_box([gap, cursor - gap], :width => 300) do
27
+ text "Stretchy height"
28
+
29
+ bounding_box([gap, bounds.top - gap], :width => 100) do
30
+ text "Stretchy height"
31
+ transparent(0.5) { dash(1); stroke_bounds; undash }
32
+ end
33
+
34
+ bounding_box([gap * 7, bounds.top - gap], :width => 100, :height => 50) do
35
+ box_content("Fixed height")
36
+ end
37
+
38
+ transparent(0.5) { dash(1); stroke_bounds; undash }
39
+ end
40
+
41
+ bounding_box([gap, cursor - gap], :width => 300, :height => 50) do
42
+ box_content("Fixed height")
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+ #
3
+ # This example is mostly just for fun, and shows how nested bounding boxes
4
+ # can simplify calculations. See the "Bounding Box" section of the manual
5
+ # for more basic uses.
6
+ #
7
+ require File.expand_path(File.join(File.dirname(__FILE__),
8
+ %w[.. example_helper]))
9
+
10
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
11
+ Prawn::Example.generate(filename) do
12
+ def combine(a1, a2)
13
+ output = []
14
+ a1.each do |i1|
15
+ a2.each do |i2|
16
+ output += [[i1,i2]]
17
+ end
18
+ end
19
+ output
20
+ end
21
+
22
+ def recurse_bounding_box(max_depth=4, depth=1)
23
+ width = (bounds.width-15)/2
24
+ height = (bounds.height-15)/2
25
+ left_top_corners = combine([5, bounds.right-width-5],
26
+ [bounds.top-5, height+5])
27
+ left_top_corners.each do |lt|
28
+ bounding_box(lt, :width => width, :height => height) do
29
+ stroke_bounds
30
+ recurse_bounding_box(max_depth, depth+1) if depth < max_depth
31
+ end
32
+ end
33
+ end
34
+
35
+ # Set up a bbox from the dashed line to the bottom of the page
36
+ bounding_box([0, cursor], :width => bounds.width, :height => cursor) do
37
+ recurse_bounding_box
38
+ end
39
+ end
40
+
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Bounding Boxes accept an optional <code>:height</code> parameter. Unless it
4
+ # is provided the bounding box will be stretchy. It will expand the height to
5
+ # fit all content generated inside it.
6
+ #
7
+ require File.expand_path(File.join(File.dirname(__FILE__),
8
+ %w[.. example_helper]))
9
+
10
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
11
+ Prawn::Example.generate(filename) do
12
+ y_position = cursor
13
+ bounding_box([0, y_position], :width => 200, :height => 100) do
14
+ text "This bounding box has a height of 100. If this text gets too large " +
15
+ "it will flow to the next page."
16
+
17
+ transparent(0.5) { stroke_bounds }
18
+ end
19
+
20
+ bounding_box([300, y_position], :width => 200) do
21
+ text "This bounding box has variable height. No matter how much text is " +
22
+ "written here, the height will expand to fit."
23
+
24
+ text " _" * 100
25
+
26
+ text " *" * 100
27
+
28
+ transparent(0.5) { stroke_bounds }
29
+ end
30
+
31
+ end
@@ -0,0 +1,27 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Pass an image path to the <code>:background</code> option and it will be used
4
+ # as the background for all pages.
5
+ # This option can only be used on document creation.
6
+ #
7
+ require File.expand_path(File.join(File.dirname(__FILE__),
8
+ %w[.. example_helper]))
9
+
10
+ img = "#{Prawn::DATADIR}/images/letterhead.jpg"
11
+
12
+ Prawn::Document.generate("background.pdf",
13
+ :background => img,
14
+ :margin => 100
15
+ ) do
16
+ text "My report caption", :size => 18, :align => :right
17
+
18
+ move_down font.height * 2
19
+
20
+ text "Here is my text explaning this report. " * 20,
21
+ :size => 12, :align => :left, :leading => 2
22
+
23
+ move_down font.height
24
+
25
+ text "I'm using a soft background. " * 40,
26
+ :size => 12, :align => :left, :leading => 2
27
+ end
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Examples for stamps and repeaters.
4
+ #
5
+ require File.expand_path(File.join(File.dirname(__FILE__),
6
+ %w[.. example_helper]))
7
+
8
+ Prawn::Example.generate("document_and_page_options.pdf",
9
+ :page_size => "FOLIO") do
10
+
11
+ package "document_and_page_options" do |p|
12
+
13
+ p.example "page_size", :eval_source => false, :full_source => true
14
+ p.example "page_margins", :eval_source => false, :full_source => true
15
+ p.example "background", :eval_source => false, :full_source => true
16
+ p.example "metadata", :eval_source => false, :full_source => true
17
+
18
+ p.intro do
19
+ prose("So far we've already seen how to create new documents and start new pages. This chapter expands on the previous examples by showing other options avialable. Some of the options are only available when creating new documents.
20
+
21
+ The examples show:")
22
+
23
+ list( "How to configure page size",
24
+ "How to configure page margins",
25
+ "How to use a background image",
26
+ "How to add metadata to the generated PDF"
27
+ )
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+ #
3
+ # To set the document metadata just pass a hash to the <code>:info</code>
4
+ # option when creating new documents.
5
+ #
6
+ require File.expand_path(File.join(File.dirname(__FILE__),
7
+ %w[.. example_helper]))
8
+
9
+ Prawn::Document.generate("metadata.pdf",
10
+ :info => {
11
+ :Title => "My title",
12
+ :Author => "John Doe",
13
+ :Subject => "My Subject",
14
+ :Keywords => "test metadata ruby pdf dry",
15
+ :Creator => "ACME Soft App",
16
+ :Producer => "Prawn",
17
+ :CreationDate => Time.now,
18
+ :Grok => "Test Property"
19
+ }) do
20
+
21
+ text "This is a test of setting metadata properties via the info option."
22
+ text "It allows one to specify non standard properties like 'Grok'."
23
+ end
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+ #
3
+ # The default margin for pages is 0.5 inch but you can change that with the
4
+ # <code>:margin</code> option or if you'd like to have different margins you
5
+ # can use the <code>:left_margin</code>, <code>:right_margin</code>,
6
+ # <code>:top_margin</code>, <code>:bottom_margin</code> options.
7
+ #
8
+ # These options are available both for starting new pages and creating new
9
+ # documents.
10
+ #
11
+ require File.expand_path(File.join(File.dirname(__FILE__),
12
+ %w[.. example_helper]))
13
+
14
+ Prawn::Document.generate("page_margins.pdf",
15
+ :margin => 100
16
+ ) do
17
+ text "100 pts margins."
18
+ stroke_bounds
19
+
20
+ start_new_page(:left_margin => 300)
21
+ text "300 pts margin on the left."
22
+ stroke_bounds
23
+
24
+ start_new_page(:top_margin => 300)
25
+ text "300 pts margin both on the top and on the left. Notice that whenever " +
26
+ "you set an option for a new page it will remain the default for the " +
27
+ "following pages."
28
+ stroke_bounds
29
+
30
+ start_new_page(:margin => 50)
31
+ text "50 pts margins. Using the margin option will reset previous specific " +
32
+ "calls to left, right, top and bottom margins."
33
+ stroke_bounds
34
+
35
+ start_new_page(:margin => [50, 100, 150, 200])
36
+ text "There is also the shorthand CSS like syntax used here."
37
+ stroke_bounds
38
+ end