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,18 @@
1
+ # encoding: utf-8
2
+ #
3
+ # To embed images onto your PDF file use the <code>image</code> method.
4
+ # It accepts the file path of the image to be loaded and some optional
5
+ # arguments.
6
+ #
7
+ # If only the image path is provided the image will be rendered starting on
8
+ # the cursor position. No manipulation is done with the image even if it doesn't
9
+ # fit entirely on the page like the following snippet.
10
+ #
11
+ require File.expand_path(File.join(File.dirname(__FILE__),
12
+ %w[.. example_helper]))
13
+
14
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
15
+ Prawn::Example.generate(filename) do
16
+ text "The image will go right below this line of text."
17
+ image "#{Prawn::DATADIR}/images/pigs.jpg"
18
+ end
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+ #
3
+ # To scale an image use the <code>:scale</code> option.
4
+ #
5
+ # It scales the image proportionally given the provided value.
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
+ text "Normal size"
13
+ image "#{Prawn::DATADIR}/images/stef.jpg"
14
+ move_down 20
15
+
16
+ text "Scaled to 50%"
17
+ image "#{Prawn::DATADIR}/images/stef.jpg", :scale => 0.5
18
+ move_down 20
19
+
20
+ text "Scaled to 200%"
21
+ image "#{Prawn::DATADIR}/images/stef.jpg", :scale => 2
22
+ end
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+ #
3
+ # To set the vertical position of an image use the <code>:vposition</code>
4
+ # option.
5
+ #
6
+ # It may be <code>:top</code>, <code>:center</code>, <code>:bottom</code> or a
7
+ # number representing the y-offset from the top boundary.
8
+ #
9
+ require File.expand_path(File.join(File.dirname(__FILE__),
10
+ %w[.. example_helper]))
11
+
12
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
13
+ Prawn::Example.generate(filename) do
14
+ bounding_box([0, cursor], :width => 500, :height => 450) do
15
+ stroke_bounds
16
+
17
+ [:top, :center, :bottom].each do |vposition|
18
+ text "Image vertically aligned to the #{vposition}.", :valign => vposition
19
+ image "#{Prawn::DATADIR}/images/stef.jpg", :position => 250,
20
+ :vposition => vposition
21
+ end
22
+
23
+ text_box "The next image has a 100 point offset from the top boundary",
24
+ :at => [bounds.width - 110, bounds.top - 10], :width => 100
25
+ image "#{Prawn::DATADIR}/images/stef.jpg", :position => :right,
26
+ :vposition => 100
27
+ end
28
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+ #
3
+ # The image size can be set with the <code>:width</code> and
4
+ # <code>:height</code> options.
5
+ #
6
+ # If only one of those is provided, the image will be scaled proportionally.
7
+ # When both are provided, the image will be stretched to fit the dimensions
8
+ # without maintaining the aspect ratio.
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 "Scale by setting only the width"
16
+ image "#{Prawn::DATADIR}/images/pigs.jpg", :width => 150
17
+ move_down 20
18
+
19
+ text "Scale by setting only the height"
20
+ image "#{Prawn::DATADIR}/images/pigs.jpg", :height => 100
21
+ move_down 20
22
+
23
+ text "Stretch to fit the width and height provided"
24
+ image "#{Prawn::DATADIR}/images/pigs.jpg", :width => 500, :height => 100
25
+ end
@@ -0,0 +1,27 @@
1
+ # encoding: utf-8
2
+ #
3
+ # After defined the grid is there but nothing happens. To start taking effect
4
+ # we need to use the grid boxes.
5
+ #
6
+ # <code>grid</code> has three different return values based on the arguments
7
+ # received. With no arguments it will return the grid itself. With integers it
8
+ # will return the grid box at those indices. With two arrays it will return a
9
+ # multi-box spanning the region of the two grid boxes at the arrays indices.
10
+ #
11
+ require File.expand_path(File.join(File.dirname(__FILE__),
12
+ %w[.. example_helper]))
13
+
14
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
15
+ Prawn::Example.generate(filename) do
16
+ # The grid only need to be defined once, but since all the examples should be
17
+ # able to run alone we are repeating it on every example
18
+ define_grid(:columns => 5, :rows => 8, :gutter => 10)
19
+
20
+ grid(4,0).show
21
+ grid(5,1).show
22
+
23
+ grid([6,2], [7,3]).show
24
+
25
+ grid([4,4], [7,4]).show
26
+ grid([7,0], [7,1]).show
27
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Now that we know how to access the boxes we might as well add some content
4
+ # to them.
5
+ #
6
+ # This can be done by taping into the bounding box for a given grid box or
7
+ # multi-box with the <code>bounding_box</code> method.
8
+ #
9
+ require File.expand_path(File.join(File.dirname(__FILE__),
10
+ %w[.. example_helper]))
11
+
12
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
13
+ Prawn::Example.generate(filename) do
14
+ # The grid only need to be defined once, but since all the examples should be
15
+ # able to run alone we are repeating it on every example
16
+ define_grid(:columns => 5, :rows => 8, :gutter => 10)
17
+
18
+ grid([5,0], [7,1]).bounding_box do
19
+ text "Adding some content to this multi_box.\n" + " _ " * 200
20
+ end
21
+
22
+ grid(6,3).bounding_box do
23
+ text "Just a little snippet here.\n" + " _ " * 10
24
+ end
25
+ end
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Examples for using grid layouts.
4
+ #
5
+ require File.expand_path(File.join(File.dirname(__FILE__),
6
+ %w[.. example_helper]))
7
+
8
+ Prawn::Example.generate("layout.pdf", :page_size => "FOLIO") do
9
+
10
+ package "layout" do |p|
11
+
12
+ p.example "simple_grid"
13
+ p.example "boxes"
14
+ p.example "content"
15
+
16
+ p.intro do
17
+ prose("Prawn has support for two-dimensional grid based layouts out of the box.
18
+
19
+ The examples show:")
20
+
21
+ list( "How to define the document grid",
22
+ "How to configure the grid rows and columns gutters",
23
+ "How to create boxes according to the grid"
24
+ )
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+ #
3
+ # The document grid on Prawn is just a table-like structure with a defined
4
+ # number of rows and columns. There are some helpers to create boxes of content
5
+ # based on the grid coordinates.
6
+ #
7
+ # <code>define_grid</code> accepts the following options which are pretty much
8
+ # self-explanatory: <code>:rows</code>, <code>:columns</code>,
9
+ # <code>:gutter</code>, <code>:row_gutter</code>, <code>:column_gutter</code>
10
+ #
11
+ require File.expand_path(File.join(File.dirname(__FILE__),
12
+ %w[.. example_helper]))
13
+
14
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
15
+ Prawn::Example.generate(filename) do
16
+ # The grid only need to be defined once, but since all the examples should be
17
+ # able to run alone we are repeating it on every example
18
+ define_grid(:columns => 5, :rows => 8, :gutter => 10)
19
+ text "We defined the grid, roll over to the next page to see its outline"
20
+
21
+ start_new_page
22
+ grid.show_all
23
+ end
@@ -0,0 +1,35 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Prawn manual how to read this manual page.
4
+ #
5
+ require File.expand_path(File.join(File.dirname(__FILE__),
6
+ %w[.. example_helper]))
7
+
8
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
9
+ Prawn::Example.generate(filename) do
10
+ move_down 200
11
+
12
+ image "#{Prawn::DATADIR}/images/prawn.png",
13
+ :scale => 0.9,
14
+ :at => [10, cursor]
15
+
16
+ formatted_text_box([ {:text => "Prawn\n",
17
+ :styles => [:bold],
18
+ :size => 100}
19
+ ], :at => [170, cursor - 50])
20
+
21
+ formatted_text_box([ {:text => "by example",
22
+ :font => 'Courier',
23
+ :size => 60}
24
+ ], :at => [170, cursor - 160])
25
+
26
+ #long git commit hash
27
+ #commit = `git show --pretty=%H`
28
+ #short git commit hash
29
+ commit = `git show --pretty=%h`
30
+ formatted_text_box([ {:text => "Last Update: #{Time.now.strftime("%Y-%m-%d")}\n
31
+ git commit: #{commit}",
32
+ :size => 12}
33
+ ], :at => [390, cursor - 620])
34
+
35
+ end
@@ -0,0 +1,85 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Prawn manual foreword page.
4
+ #
5
+ require File.expand_path(File.join(File.dirname(__FILE__),
6
+ %w[.. example_helper]))
7
+
8
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
9
+ Prawn::Example.generate(filename) do
10
+ header("Foreword, by Gregory Brown")
11
+ prose %{
12
+ Back in 2008, the state of PDF generation in
13
+ Ruby was grim. The best general purpose tool that existed was
14
+ Austin Ziegler's PDF::Writer, which was an ambitious but
15
+ painfully unsustainable project. Despite years of hard work
16
+ from Austin, the code was slow, buggy, and hard to
17
+ understand. All of those things made it very difficult
18
+ to extend with the many features that its users needed,
19
+ and so it gradually turned into abandonware.
20
+
21
+ Because I had a lot of work that depended on PDF generation
22
+ I eventually volunteered to become the new maintainer of
23
+ PDF::Writer. In the first couple months after I got commit bit, I
24
+ managed to get out a couple minor releases that fixed
25
+ known issues that had been left unresolved for years,
26
+ and that made some people happy. However, the cliff
27
+ ahead of me was far too steep to climb: without a
28
+ major redesign, PDF::Writer would never support proper
29
+ internationalization, would not easily be ported to
30
+ Ruby 1.9, and would remain painfully slow for many
31
+ ordinary tasks.
32
+
33
+ Against my better judgement, but out of desperation, I
34
+ was convinced that the only way forward was to attempt the
35
+ big rewrite. It is good that I didn't realize
36
+ how impossible that task would be, because otherwise,
37
+ I would have never started working
38
+ on Prawn. But with the support of dozens of Ruby community
39
+ members who had graciously crowd-funded this project
40
+ so that I could take a few months off of work to
41
+ kick start it (long before Kickstarter existed!), Prawn
42
+ was born.
43
+
44
+ The PDF specification is over 1300 pages long, and despite
45
+ being the original author and lead maintainer of this
46
+ project from 2008-2011, I still know relatively little
47
+ about the intricacies of the format. I relied heavily
48
+ on the insights of our core team and casual contributors
49
+ to educate me on various issues, and to help develop
50
+ nearly every feature of this project. From day one,
51
+ Prawn was a stone soup in which virtually all of the
52
+ tasty bits were provided by the community at large --
53
+ my most significant contribution was to simply
54
+ keep stirring the pot. Now, the pot mostly stirs itself,
55
+ with the occasional nudge from one of the core
56
+ team members (usually Brad or James, but everyone
57
+ has pitched in at one time or the other.)
58
+
59
+ Although Prawn bears no resemblance to PDF::Writer, this library
60
+ is most certainly its spiritual successor. That means that between
61
+ Austin's efforts and that of the Prawn team, we've been
62
+ trying to solve the PDF problem comfortably in Ruby for
63
+ nearly a decade now. This manual will help you decide for
64
+ yourself whether we've managed to finally overcome that
65
+ challenge or not.
66
+
67
+ I sincerely hope that a few years down the line, someone else
68
+ comes along and makes something brand new and exciting that
69
+ blows Prawn out of the water and onto the barbeque. But until
70
+ that happens, what you'll find here is a very powerful
71
+ PDF generation library that has a great team supporting it,
72
+ and I suspect it will stay that way for the forseeable future.
73
+
74
+ Happy Hacking!
75
+
76
+ -greg
77
+
78
+ PS: I cannot be possibly be more grateful for the time, money,
79
+ code, and knowledge that the Ruby community has invested in
80
+ this project. Whether you're a core team member or someone
81
+ who filed a single thoughtful bug report, your efforts are
82
+ what kept me motivated throughout the years that I spent working
83
+ on this project.
84
+ }
85
+ end
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Prawn manual how to read this manual page.
4
+ #
5
+ require File.expand_path(File.join(File.dirname(__FILE__),
6
+ %w[.. example_helper]))
7
+
8
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
9
+ Prawn::Example.generate(filename) do
10
+ header("How to read this manual")
11
+
12
+ prose <<-END_TEXT
13
+ This manual is a collection of examples categorized by theme and organized from the least to the most complex. While it covers most of the common use cases it is not a comprehensive guide.
14
+
15
+ The best way to read it depends on your previous knowledge of Prawn and what you need to accomplish.
16
+
17
+ If you are beginning with Prawn the first chapter will teach you the most basic concepts and how to create pdf documents. For an overview of the other features each chapter beyond the first either has a Basics section (which offer enough insight on the feature without showing all the advanced stuff you might never use) or is simple enough with only a few examples.
18
+
19
+ Once you understand the basics you might want to come back to this manual looking for examples that accomplish tasks you need.
20
+
21
+ Advanced users are encouraged to go beyond this manual and read the source code directly if any doubt is not directly covered on this manual.
22
+ END_TEXT
23
+
24
+ move_down(BOX_MARGIN)
25
+ header("Reading the examples")
26
+
27
+ prose <<-END_TEXT
28
+ The title of each example is the relative path from the Prawn source manual/ folder.
29
+
30
+ The first body of text is the introductory text for the example. Generaly it is a short description of the features illustrated by the example.
31
+
32
+ Next comes the example source code block in fixed width font.
33
+
34
+ Most of the example snippets illustrate features that alter the page in place. The effect of these snippets is shown right below a dashed line. If it doesn't make sense to evaluate the snippet inline, a box with the link for the example file is shown instead.
35
+
36
+ Note that the <code>stroke_axis</code> method, used occasionally in the manual, is not part of standard Prawn and is used for demonstrative purposes. It is defined in this file:
37
+
38
+ https://github.com/prawnpdf/prawn/blob/master/manual/example_helper.rb
39
+ END_TEXT
40
+
41
+ end
@@ -0,0 +1,35 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Generates the Prawn by example manual.
4
+ #
5
+
6
+ Encoding.default_external = "UTF-8" if defined? Encoding
7
+
8
+ require File.expand_path(File.join(File.dirname(__FILE__),
9
+ %w[.. example_helper]))
10
+
11
+ Prawn::Example.generate("manual.pdf",
12
+ :optimize_objects => true,
13
+ :skip_page_creation => true,
14
+ :page_size => "FOLIO") do
15
+
16
+ load_page "cover"
17
+ load_page "foreword"
18
+ load_page "how_to_read_this_manual"
19
+
20
+ # Core chapters
21
+ load_package "basic_concepts"
22
+ load_package "graphics"
23
+ load_package "text"
24
+ load_package "bounding_box"
25
+
26
+ # Remaining chapters
27
+ load_package "layout"
28
+ load_package "images"
29
+ load_package "table"
30
+ load_package "document_and_page_options"
31
+ load_package "outline"
32
+ load_package "repeatable_content"
33
+ load_package "templates"
34
+ load_package "security"
35
+ end
@@ -0,0 +1,61 @@
1
+ # encoding: utf-8
2
+ #
3
+ # We have already seen how to define an outline tree sequentially.
4
+ #
5
+ # If you'd like to add nodes to the middle of an outline tree the
6
+ # <code>add_subsection_to</code> may help you.
7
+ #
8
+ # It allows you to insert sections to the outline tree at any point. Just
9
+ # provide the <code>title</code> of the parent section, the
10
+ # <code>position</code> you want the new subsection to be inserted
11
+ # <code>:first</code> or <code>:last</code> (defaults to <code>:last</code>)
12
+ # and a block to declare the subsection.
13
+ #
14
+ # The <code>add_subsection_to</code> block doesn't necessarily create new
15
+ # sections, it may also create new pages.
16
+ #
17
+ # If the parent title provided is the title of a page. The page will be
18
+ # converted into a section to receive the subsection created.
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
+ # First we create 10 pages and some default outline
26
+ (1..10).each do |index|
27
+ text "Page #{index}"
28
+ start_new_page
29
+ end
30
+
31
+ outline.define do
32
+ section("Section 1", :destination => 1) do
33
+ page :title => "Page 2", :destination => 2
34
+ page :title => "Page 3", :destination => 3
35
+ end
36
+ end
37
+
38
+ # Now we will start adding nodes to the previous outline
39
+ outline.add_subsection_to("Section 1", :first) do
40
+ outline.section("Added later - first position") do
41
+ outline.page :title => "Page 4", :destination => 4
42
+ outline.page :title => "Page 5", :destination => 5
43
+ end
44
+ end
45
+
46
+ outline.add_subsection_to("Section 1") do
47
+ outline.page :title => "Added later - last position",
48
+ :destination => 6
49
+ end
50
+
51
+ outline.add_subsection_to("Added later - first position") do
52
+ outline.page :title => "Another page added later",
53
+ :destination => 7
54
+ end
55
+
56
+ # The title provided is for a page which will be converted into a section
57
+ outline.add_subsection_to("Page 3") do
58
+ outline.page :title => "Last page added",
59
+ :destination => 8
60
+ end
61
+ end