prawn-git 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (252) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +10 -0
  3. data/COPYING +2 -0
  4. data/GPLv2 +340 -0
  5. data/GPLv3 +674 -0
  6. data/Gemfile +11 -0
  7. data/LICENSE +56 -0
  8. data/Rakefile +55 -0
  9. data/data/fonts/Courier-Bold.afm +342 -0
  10. data/data/fonts/Courier-BoldOblique.afm +342 -0
  11. data/data/fonts/Courier-Oblique.afm +342 -0
  12. data/data/fonts/Courier.afm +342 -0
  13. data/data/fonts/Helvetica-Bold.afm +2827 -0
  14. data/data/fonts/Helvetica-BoldOblique.afm +2827 -0
  15. data/data/fonts/Helvetica-Oblique.afm +3051 -0
  16. data/data/fonts/Helvetica.afm +3051 -0
  17. data/data/fonts/MustRead.html +19 -0
  18. data/data/fonts/Symbol.afm +213 -0
  19. data/data/fonts/Times-Bold.afm +2588 -0
  20. data/data/fonts/Times-BoldItalic.afm +2384 -0
  21. data/data/fonts/Times-Italic.afm +2667 -0
  22. data/data/fonts/Times-Roman.afm +2419 -0
  23. data/data/fonts/ZapfDingbats.afm +225 -0
  24. data/data/images/16bit.alpha +0 -0
  25. data/data/images/16bit.color +0 -0
  26. data/data/images/16bit.png +0 -0
  27. data/data/images/arrow.png +0 -0
  28. data/data/images/arrow2.png +0 -0
  29. data/data/images/dice.alpha +0 -0
  30. data/data/images/dice.color +0 -0
  31. data/data/images/dice.png +0 -0
  32. data/data/images/dice_interlaced.png +0 -0
  33. data/data/images/fractal.jpg +0 -0
  34. data/data/images/indexed_color.dat +0 -0
  35. data/data/images/indexed_color.png +0 -0
  36. data/data/images/letterhead.jpg +0 -0
  37. data/data/images/license.md +8 -0
  38. data/data/images/page_white_text.alpha +0 -0
  39. data/data/images/page_white_text.color +0 -0
  40. data/data/images/page_white_text.png +0 -0
  41. data/data/images/pal_bk.png +0 -0
  42. data/data/images/pigs.jpg +0 -0
  43. data/data/images/prawn.png +0 -0
  44. data/data/images/ruport.png +0 -0
  45. data/data/images/ruport_data.dat +0 -0
  46. data/data/images/ruport_transparent.png +0 -0
  47. data/data/images/ruport_type0.png +0 -0
  48. data/data/images/stef.jpg +0 -0
  49. data/data/images/tru256.bmp +0 -0
  50. data/data/images/web-links.dat +1 -0
  51. data/data/images/web-links.png +0 -0
  52. data/data/pdfs/complex_template.pdf +0 -0
  53. data/data/pdfs/contains_ttf_font.pdf +0 -0
  54. data/data/pdfs/encrypted.pdf +0 -0
  55. data/data/pdfs/form.pdf +820 -0
  56. data/data/pdfs/hexagon.pdf +61 -0
  57. data/data/pdfs/indirect_reference.pdf +86 -0
  58. data/data/pdfs/multipage_template.pdf +127 -0
  59. data/data/pdfs/nested_pages.pdf +118 -0
  60. data/data/pdfs/page_without_mediabox.pdf +193 -0
  61. data/data/pdfs/resources_as_indirect_object.pdf +83 -0
  62. data/data/pdfs/two_hexagons.pdf +90 -0
  63. data/data/pdfs/version_1_6.pdf +61 -0
  64. data/data/shift_jis_text.txt +1 -0
  65. data/lib/prawn.rb +89 -0
  66. data/lib/prawn/document.rb +706 -0
  67. data/lib/prawn/document/bounding_box.rb +539 -0
  68. data/lib/prawn/document/column_box.rb +144 -0
  69. data/lib/prawn/document/internals.rb +58 -0
  70. data/lib/prawn/document/span.rb +57 -0
  71. data/lib/prawn/encoding.rb +87 -0
  72. data/lib/prawn/errors.rb +80 -0
  73. data/lib/prawn/font.rb +413 -0
  74. data/lib/prawn/font/afm.rb +256 -0
  75. data/lib/prawn/font/dfont.rb +43 -0
  76. data/lib/prawn/font/ttf.rb +355 -0
  77. data/lib/prawn/font_metric_cache.rb +46 -0
  78. data/lib/prawn/graphics.rb +646 -0
  79. data/lib/prawn/graphics/cap_style.rb +47 -0
  80. data/lib/prawn/graphics/color.rb +232 -0
  81. data/lib/prawn/graphics/dash.rb +109 -0
  82. data/lib/prawn/graphics/join_style.rb +49 -0
  83. data/lib/prawn/graphics/patterns.rb +126 -0
  84. data/lib/prawn/graphics/transformation.rb +157 -0
  85. data/lib/prawn/graphics/transparency.rb +101 -0
  86. data/lib/prawn/grid.rb +279 -0
  87. data/lib/prawn/image_handler.rb +44 -0
  88. data/lib/prawn/images.rb +199 -0
  89. data/lib/prawn/images/image.rb +49 -0
  90. data/lib/prawn/images/jpg.rb +91 -0
  91. data/lib/prawn/images/png.rb +290 -0
  92. data/lib/prawn/measurement_extensions.rb +50 -0
  93. data/lib/prawn/measurements.rb +77 -0
  94. data/lib/prawn/outline.rb +289 -0
  95. data/lib/prawn/repeater.rb +124 -0
  96. data/lib/prawn/security.rb +288 -0
  97. data/lib/prawn/security/arcfour.rb +54 -0
  98. data/lib/prawn/soft_mask.rb +94 -0
  99. data/lib/prawn/stamp.rb +136 -0
  100. data/lib/prawn/text.rb +437 -0
  101. data/lib/prawn/text/box.rb +141 -0
  102. data/lib/prawn/text/formatted.rb +7 -0
  103. data/lib/prawn/text/formatted/arranger.rb +290 -0
  104. data/lib/prawn/text/formatted/box.rb +614 -0
  105. data/lib/prawn/text/formatted/fragment.rb +264 -0
  106. data/lib/prawn/text/formatted/line_wrap.rb +277 -0
  107. data/lib/prawn/text/formatted/parser.rb +224 -0
  108. data/lib/prawn/text/formatted/wrap.rb +160 -0
  109. data/lib/prawn/utilities.rb +46 -0
  110. data/lib/prawn/version.rb +5 -0
  111. data/lib/prawn/view.rb +91 -0
  112. data/manual/absolute_position.pdf +0 -0
  113. data/manual/basic_concepts/adding_pages.rb +27 -0
  114. data/manual/basic_concepts/basic_concepts.rb +36 -0
  115. data/manual/basic_concepts/creation.rb +39 -0
  116. data/manual/basic_concepts/cursor.rb +33 -0
  117. data/manual/basic_concepts/measurement.rb +25 -0
  118. data/manual/basic_concepts/origin.rb +38 -0
  119. data/manual/basic_concepts/other_cursor_helpers.rb +40 -0
  120. data/manual/basic_concepts/view.rb +42 -0
  121. data/manual/bounding_box/bounding_box.rb +39 -0
  122. data/manual/bounding_box/bounds.rb +49 -0
  123. data/manual/bounding_box/canvas.rb +24 -0
  124. data/manual/bounding_box/creation.rb +23 -0
  125. data/manual/bounding_box/indentation.rb +46 -0
  126. data/manual/bounding_box/nesting.rb +45 -0
  127. data/manual/bounding_box/russian_boxes.rb +40 -0
  128. data/manual/bounding_box/stretchy.rb +31 -0
  129. data/manual/contents.rb +29 -0
  130. data/manual/cover.rb +39 -0
  131. data/manual/document_and_page_options/background.rb +27 -0
  132. data/manual/document_and_page_options/document_and_page_options.rb +32 -0
  133. data/manual/document_and_page_options/metadata.rb +23 -0
  134. data/manual/document_and_page_options/page_margins.rb +38 -0
  135. data/manual/document_and_page_options/page_size.rb +34 -0
  136. data/manual/document_and_page_options/print_scaling.rb +20 -0
  137. data/manual/example_helper.rb +7 -0
  138. data/manual/graphics/circle_and_ellipse.rb +22 -0
  139. data/manual/graphics/color.rb +24 -0
  140. data/manual/graphics/common_lines.rb +30 -0
  141. data/manual/graphics/fill_and_stroke.rb +42 -0
  142. data/manual/graphics/fill_rules.rb +37 -0
  143. data/manual/graphics/gradients.rb +37 -0
  144. data/manual/graphics/graphics.rb +58 -0
  145. data/manual/graphics/helper.rb +24 -0
  146. data/manual/graphics/line_width.rb +35 -0
  147. data/manual/graphics/lines_and_curves.rb +41 -0
  148. data/manual/graphics/polygon.rb +29 -0
  149. data/manual/graphics/rectangle.rb +21 -0
  150. data/manual/graphics/rotate.rb +28 -0
  151. data/manual/graphics/scale.rb +41 -0
  152. data/manual/graphics/soft_masks.rb +46 -0
  153. data/manual/graphics/stroke_cap.rb +31 -0
  154. data/manual/graphics/stroke_dash.rb +48 -0
  155. data/manual/graphics/stroke_join.rb +30 -0
  156. data/manual/graphics/translate.rb +29 -0
  157. data/manual/graphics/transparency.rb +35 -0
  158. data/manual/how_to_read_this_manual.rb +40 -0
  159. data/manual/images/absolute_position.rb +23 -0
  160. data/manual/images/fit.rb +21 -0
  161. data/manual/images/horizontal.rb +25 -0
  162. data/manual/images/images.rb +40 -0
  163. data/manual/images/plain_image.rb +18 -0
  164. data/manual/images/scale.rb +22 -0
  165. data/manual/images/vertical.rb +28 -0
  166. data/manual/images/width_and_height.rb +25 -0
  167. data/manual/layout/boxes.rb +27 -0
  168. data/manual/layout/content.rb +25 -0
  169. data/manual/layout/layout.rb +28 -0
  170. data/manual/layout/simple_grid.rb +23 -0
  171. data/manual/outline/add_subsection_to.rb +61 -0
  172. data/manual/outline/insert_section_after.rb +47 -0
  173. data/manual/outline/outline.rb +32 -0
  174. data/manual/outline/sections_and_pages.rb +67 -0
  175. data/manual/repeatable_content/alternate_page_numbering.rb +32 -0
  176. data/manual/repeatable_content/page_numbering.rb +54 -0
  177. data/manual/repeatable_content/repeatable_content.rb +32 -0
  178. data/manual/repeatable_content/repeater.rb +55 -0
  179. data/manual/repeatable_content/stamp.rb +41 -0
  180. data/manual/security/encryption.rb +31 -0
  181. data/manual/security/permissions.rb +38 -0
  182. data/manual/security/security.rb +28 -0
  183. data/manual/table.rb +16 -0
  184. data/manual/text/alignment.rb +44 -0
  185. data/manual/text/color.rb +24 -0
  186. data/manual/text/column_box.rb +32 -0
  187. data/manual/text/fallback_fonts.rb +37 -0
  188. data/manual/text/font.rb +41 -0
  189. data/manual/text/font_size.rb +45 -0
  190. data/manual/text/font_style.rb +23 -0
  191. data/manual/text/formatted_callbacks.rb +60 -0
  192. data/manual/text/formatted_text.rb +50 -0
  193. data/manual/text/free_flowing_text.rb +51 -0
  194. data/manual/text/inline.rb +41 -0
  195. data/manual/text/kerning_and_character_spacing.rb +39 -0
  196. data/manual/text/leading.rb +25 -0
  197. data/manual/text/line_wrapping.rb +41 -0
  198. data/manual/text/paragraph_indentation.rb +34 -0
  199. data/manual/text/positioned_text.rb +38 -0
  200. data/manual/text/registering_families.rb +48 -0
  201. data/manual/text/rendering_and_color.rb +37 -0
  202. data/manual/text/right_to_left_text.rb +47 -0
  203. data/manual/text/rotation.rb +43 -0
  204. data/manual/text/single_usage.rb +37 -0
  205. data/manual/text/text.rb +73 -0
  206. data/manual/text/text_box_excess.rb +32 -0
  207. data/manual/text/text_box_extensions.rb +45 -0
  208. data/manual/text/text_box_overflow.rb +48 -0
  209. data/manual/text/utf8.rb +28 -0
  210. data/manual/text/win_ansi_charset.rb +60 -0
  211. data/prawn.gemspec +45 -0
  212. data/spec/acceptance/png.rb +25 -0
  213. data/spec/annotations_spec.rb +74 -0
  214. data/spec/bounding_box_spec.rb +510 -0
  215. data/spec/column_box_spec.rb +65 -0
  216. data/spec/data/curves.pdf +66 -0
  217. data/spec/destinations_spec.rb +15 -0
  218. data/spec/document_spec.rb +748 -0
  219. data/spec/extensions/encoding_helpers.rb +11 -0
  220. data/spec/extensions/mocha.rb +46 -0
  221. data/spec/font_metric_cache_spec.rb +52 -0
  222. data/spec/font_spec.rb +474 -0
  223. data/spec/formatted_text_arranger_spec.rb +421 -0
  224. data/spec/formatted_text_box_spec.rb +705 -0
  225. data/spec/formatted_text_fragment_spec.rb +298 -0
  226. data/spec/graphics_spec.rb +683 -0
  227. data/spec/grid_spec.rb +96 -0
  228. data/spec/image_handler_spec.rb +54 -0
  229. data/spec/images_spec.rb +153 -0
  230. data/spec/inline_formatted_text_parser_spec.rb +564 -0
  231. data/spec/jpg_spec.rb +25 -0
  232. data/spec/line_wrap_spec.rb +367 -0
  233. data/spec/measurement_units_spec.rb +25 -0
  234. data/spec/outline_spec.rb +430 -0
  235. data/spec/png_spec.rb +245 -0
  236. data/spec/reference_spec.rb +25 -0
  237. data/spec/repeater_spec.rb +160 -0
  238. data/spec/security_spec.rb +158 -0
  239. data/spec/soft_mask_spec.rb +79 -0
  240. data/spec/span_spec.rb +44 -0
  241. data/spec/spec_helper.rb +54 -0
  242. data/spec/stamp_spec.rb +160 -0
  243. data/spec/stroke_styles_spec.rb +211 -0
  244. data/spec/text_at_spec.rb +143 -0
  245. data/spec/text_box_spec.rb +1043 -0
  246. data/spec/text_rendering_mode_spec.rb +45 -0
  247. data/spec/text_spacing_spec.rb +93 -0
  248. data/spec/text_spec.rb +557 -0
  249. data/spec/text_with_inline_formatting_spec.rb +35 -0
  250. data/spec/transparency_spec.rb +91 -0
  251. data/spec/view_spec.rb +43 -0
  252. metadata +509 -0
@@ -0,0 +1,27 @@
1
+ # encoding: utf-8
2
+ #
3
+ # A PDF document is a collection of pages. When we create a new document be it
4
+ # with <code>Document.new</code> or on a <code>Document.generate</code> block
5
+ # one initial page is created for us.
6
+ #
7
+ # Some methods might create new pages automatically like <code>text</code> which
8
+ # will create a new page whenever the text string cannot fit on the current
9
+ # page.
10
+ #
11
+ # But what if you want to go to the next page by yourself? That is easy.
12
+ #
13
+ # Just use the <code>start_new_page</code> method and a shiny new page will be
14
+ # created for you just like in the following snippet.
15
+ #
16
+ require File.expand_path(File.join(File.dirname(__FILE__),
17
+ %w[.. example_helper]))
18
+
19
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
20
+ Prawn::ManualBuilder::Example.generate(filename) do
21
+ text "We are still on the initial page for this example. Now I'll ask " +
22
+ "Prawn to gently start a new page. Please follow me to the next page."
23
+
24
+ start_new_page
25
+
26
+ text "See. We've left the previous page behind."
27
+ end
@@ -0,0 +1,36 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Examples for Prawn basic concepts.
4
+ #
5
+
6
+ require_relative "../example_helper"
7
+
8
+ Prawn::ManualBuilder::Example.generate("basic_concepts.pdf", :page_size => "FOLIO") do
9
+
10
+ package "basic_concepts" do |p|
11
+
12
+ p.example "creation", :eval_source => false, :full_source => true
13
+ p.example "origin"
14
+ p.example "cursor"
15
+ p.example "other_cursor_helpers"
16
+ p.example "adding_pages"
17
+ p.example "measurement"
18
+ p.example "view", :eval_source => false, :full_source => true
19
+
20
+ p.intro do
21
+ prose("This chapter covers the minimum amount of functionality you'll need to start using Prawn.
22
+
23
+ If you are new to Prawn this is the first chapter to read. Once you are comfortable with the concepts shown here you might want to check the Basics section of the Graphics, Bounding Box and Text sections.
24
+
25
+ The examples show:")
26
+
27
+ list( "How to create new pdf documents in every possible way",
28
+ "Where the origin for the document coordinates is. What are Bounding Boxes and how they interact with the origin",
29
+ "How the cursor behaves",
30
+ "How to start new pages",
31
+ "What the base unit for measurement and coordinates is and how to use other convenient measures",
32
+ "How to build custom view objects that use Prawn's DSL"
33
+ )
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,39 @@
1
+ # encoding: utf-8
2
+ #
3
+ # There are three ways to create a PDF Document in Prawn: creating a new
4
+ # <code>Prawn::Document</code> instance, or using the
5
+ # <code>Prawn::Document.generate</code> method with and without block arguments.
6
+ #
7
+ # The following snippet showcase each way by creating a simple document with
8
+ # some text drawn.
9
+ #
10
+ # When we instantiate the <code>Prawn::Document</code> object the actual pdf
11
+ # document will only be created after we call <code>render_file</code>.
12
+ #
13
+ # The generate method will render the actual pdf object after exiting the block.
14
+ # When we use it without a block argument the provided block is evaluated in the
15
+ # context of a newly created <code>Prawn::Document</code> instance. When we use
16
+ # it with a block argument a <code>Prawn::Document</code> instance is created
17
+ # and passed to the block.
18
+ #
19
+ # The generate method without block arguments requires
20
+ # less typing and defines and renders the pdf document in one shot.
21
+ # Almost all of the examples are coded this way.
22
+ #
23
+ require File.expand_path(File.join(File.dirname(__FILE__),
24
+ %w[.. example_helper]))
25
+
26
+ # Assignment
27
+ pdf = Prawn::Document.new
28
+ pdf.text "Hello World"
29
+ pdf.render_file "assignment.pdf"
30
+
31
+ # Implicit Block
32
+ Prawn::Document.generate("implicit.pdf") do
33
+ text "Hello World"
34
+ end
35
+
36
+ # Explicit Block
37
+ Prawn::Document.generate("explicit.pdf") do |pdf|
38
+ pdf.text "Hello World"
39
+ end
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+ #
3
+ # We normally write our documents from top to bottom and it is no different with
4
+ # Prawn. Even if the origin is on the bottom left corner we still fill the page
5
+ # from the top to the bottom. In other words the cursor for inserting content
6
+ # starts on the top of the page.
7
+ #
8
+ # Most of the functions that insert content on the page will start at the
9
+ # current cursor position and proceed to the bottom of the page.
10
+ #
11
+ # The following snippet shows how the cursor behaves when we add some text to
12
+ # the page and demonstrates some of the helpers to manage the cursor position.
13
+ # The <code>cursor</code> method returns the current cursor position.
14
+ #
15
+ require File.expand_path(File.join(File.dirname(__FILE__),
16
+ %w[.. example_helper]))
17
+
18
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
19
+ Prawn::ManualBuilder::Example.generate(filename) do
20
+ stroke_axis
21
+
22
+ text "the cursor is here: #{cursor}"
23
+ text "now it is here: #{cursor}"
24
+
25
+ move_down 200
26
+ text "on the first move the cursor went down to: #{cursor}"
27
+
28
+ move_up 100
29
+ text "on the second move the cursor went up to: #{cursor}"
30
+
31
+ move_cursor_to 50
32
+ text "on the last move the cursor went directly to: #{cursor}"
33
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+ #
3
+ # The base unit in Prawn is the PDF Point. One PDF Point is equal to 1/72 of
4
+ # an inch.
5
+ #
6
+ # There is no need to waste time converting this measure. Prawn provides
7
+ # helpers for converting from other measurements
8
+ # to PDF Points.
9
+ #
10
+ # Just <code>require "prawn/measurement_extensions"</code> and it will mix some
11
+ # helpers onto <code>Numeric</code> for converting common measurement units to
12
+ # PDF Points.
13
+ #
14
+ require File.expand_path(File.join(File.dirname(__FILE__),
15
+ %w[.. example_helper]))
16
+
17
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
18
+ Prawn::ManualBuilder::Example.generate(filename) do
19
+ require "prawn/measurement_extensions"
20
+
21
+ [:mm, :cm, :dm, :m, :in, :yd, :ft].each do |measurement|
22
+ text "1 #{measurement} in PDF Points: #{1.send(measurement)} pt"
23
+ move_down 5.mm
24
+ end
25
+ end
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+ #
3
+ # This is the most important concept you need to learn about Prawn:
4
+ #
5
+ # PDF documents have the origin <code>[0,0]</code> at the bottom-left corner of
6
+ # the page.
7
+ #
8
+ # A bounding box is a structure which provides boundaries for inserting content.
9
+ # A bounding box also has the property of relocating the origin to its relative
10
+ # bottom-left corner. However, be aware that the location specified when
11
+ # creating a bounding box is its top-left corner, not bottom-left (hence the
12
+ # <code>[100, 300]</code> coordinates below).
13
+ #
14
+ # Even if you never create a bounding box explictly, each document already comes
15
+ # with one called the margin box. This initial bounding box is the one
16
+ # responsible for the document margins.
17
+ #
18
+ # So practically speaking the origin of a page on a default generated document
19
+ # isn't the absolute bottom left corner but the bottom left corner of the margin
20
+ # box.
21
+ #
22
+ # The following snippet strokes a circle on the margin box origin. Then strokes
23
+ # the boundaries of a bounding box and a circle on its origin.
24
+ #
25
+ require File.expand_path(File.join(File.dirname(__FILE__),
26
+ %w[.. example_helper]))
27
+
28
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
29
+ Prawn::ManualBuilder::Example.generate(filename) do
30
+ stroke_axis
31
+
32
+ stroke_circle [0, 0], 10
33
+
34
+ bounding_box([100, 300], :width => 300, :height => 200) do
35
+ stroke_bounds
36
+ stroke_circle [0, 0], 10
37
+ end
38
+ end
@@ -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::ManualBuilder::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,42 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # To create a custom class that extends Prawn's functionality,
4
+ # use the <code>Prawn::View</code> mixin. This approach is safer than creating
5
+ # subclasses of <code>Prawn::Document</code> while being just as convenient.
6
+ #
7
+ # By using this mixin, your state will be kept completely separate
8
+ # from <code>Prawn::Document</code>'s state, and you will avoid accidental method
9
+ # collisions within <code>Prawn::Document</code>.
10
+ #
11
+ # To build custom classes that make use of other custom classes,
12
+ # you can define a method named <code>document()</code> that returns
13
+ # any object that acts similar to a <code>Prawn::Document</code>
14
+ # object. <code>Prawn::View</code> will then direct all delegated
15
+ # calls to that object instead.
16
+
17
+ require_relative "../example_helper"
18
+
19
+ class Greeter
20
+ include Prawn::View
21
+
22
+ def initialize(name)
23
+ @name = name
24
+ end
25
+
26
+ def say_hello
27
+ text "Hello, #{@name}!"
28
+ end
29
+
30
+ def say_goodbye
31
+ font("Courier") do
32
+ text "Goodbye, #{@name}!"
33
+ end
34
+ end
35
+ end
36
+
37
+ greeter = Greeter.new("Gregory")
38
+
39
+ greeter.say_hello
40
+ greeter.say_goodbye
41
+
42
+ greeter.save_as("greetings.pdf")
@@ -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::ManualBuilder::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::BoundingBox</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::ManualBuilder::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::ManualBuilder::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::ManualBuilder::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::ManualBuilder::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