nurettin-prawn 1.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (303) hide show
  1. data/COPYING +2 -0
  2. data/GPLv2 +340 -0
  3. data/GPLv3 +674 -0
  4. data/Gemfile +18 -0
  5. data/LICENSE +56 -0
  6. data/README.md +98 -0
  7. data/Rakefile +45 -0
  8. data/data/encodings/win_ansi.txt +29 -0
  9. data/data/fonts/Action Man.dfont +0 -0
  10. data/data/fonts/Activa.ttf +0 -0
  11. data/data/fonts/Chalkboard.ttf +0 -0
  12. data/data/fonts/Courier-Bold.afm +342 -0
  13. data/data/fonts/Courier-BoldOblique.afm +342 -0
  14. data/data/fonts/Courier-Oblique.afm +342 -0
  15. data/data/fonts/Courier.afm +342 -0
  16. data/data/fonts/DejaVuSans.ttf +0 -0
  17. data/data/fonts/Dustismo_Roman.ttf +0 -0
  18. data/data/fonts/Helvetica-Bold.afm +2827 -0
  19. data/data/fonts/Helvetica-BoldOblique.afm +2827 -0
  20. data/data/fonts/Helvetica-Oblique.afm +3051 -0
  21. data/data/fonts/Helvetica.afm +3051 -0
  22. data/data/fonts/MustRead.html +19 -0
  23. data/data/fonts/Symbol.afm +213 -0
  24. data/data/fonts/Times-Bold.afm +2588 -0
  25. data/data/fonts/Times-BoldItalic.afm +2384 -0
  26. data/data/fonts/Times-Italic.afm +2667 -0
  27. data/data/fonts/Times-Roman.afm +2419 -0
  28. data/data/fonts/ZapfDingbats.afm +225 -0
  29. data/data/fonts/comicsans.ttf +0 -0
  30. data/data/fonts/gkai00mp.ttf +0 -0
  31. data/data/images/16bit.alpha +0 -0
  32. data/data/images/16bit.dat +0 -0
  33. data/data/images/16bit.png +0 -0
  34. data/data/images/arrow.png +0 -0
  35. data/data/images/arrow2.png +0 -0
  36. data/data/images/barcode_issue.png +0 -0
  37. data/data/images/dice.alpha +0 -0
  38. data/data/images/dice.dat +0 -0
  39. data/data/images/dice.png +0 -0
  40. data/data/images/dice_interlaced.png +0 -0
  41. data/data/images/fractal.jpg +0 -0
  42. data/data/images/letterhead.jpg +0 -0
  43. data/data/images/page_white_text.alpha +0 -0
  44. data/data/images/page_white_text.dat +0 -0
  45. data/data/images/page_white_text.png +0 -0
  46. data/data/images/pigs.jpg +0 -0
  47. data/data/images/prawn.png +0 -0
  48. data/data/images/rails.dat +0 -0
  49. data/data/images/rails.png +0 -0
  50. data/data/images/ruport.png +0 -0
  51. data/data/images/ruport_data.dat +0 -0
  52. data/data/images/ruport_transparent.png +0 -0
  53. data/data/images/ruport_type0.png +0 -0
  54. data/data/images/stef.jpg +0 -0
  55. data/data/images/tru256.bmp +0 -0
  56. data/data/images/web-links.dat +1 -0
  57. data/data/images/web-links.png +0 -0
  58. data/data/pdfs/complex_template.pdf +0 -0
  59. data/data/pdfs/contains_ttf_font.pdf +0 -0
  60. data/data/pdfs/encrypted.pdf +0 -0
  61. data/data/pdfs/form.pdf +820 -0
  62. data/data/pdfs/hexagon.pdf +61 -0
  63. data/data/pdfs/indirect_reference.pdf +86 -0
  64. data/data/pdfs/multipage_template.pdf +127 -0
  65. data/data/pdfs/nested_pages.pdf +118 -0
  66. data/data/pdfs/page_without_mediabox.pdf +193 -0
  67. data/data/pdfs/resources_as_indirect_object.pdf +83 -0
  68. data/data/pdfs/two_hexagons.pdf +90 -0
  69. data/data/pdfs/version_1_6.pdf +61 -0
  70. data/data/shift_jis_text.txt +1 -0
  71. data/lib/prawn.rb +29 -0
  72. data/lib/prawn/compatibility.rb +87 -0
  73. data/lib/prawn/core.rb +87 -0
  74. data/lib/prawn/core/annotations.rb +61 -0
  75. data/lib/prawn/core/byte_string.rb +9 -0
  76. data/lib/prawn/core/destinations.rb +90 -0
  77. data/lib/prawn/core/document_state.rb +79 -0
  78. data/lib/prawn/core/literal_string.rb +16 -0
  79. data/lib/prawn/core/name_tree.rb +177 -0
  80. data/lib/prawn/core/object_store.rb +320 -0
  81. data/lib/prawn/core/page.rb +212 -0
  82. data/lib/prawn/core/pdf_object.rb +125 -0
  83. data/lib/prawn/core/reference.rb +119 -0
  84. data/lib/prawn/core/text.rb +268 -0
  85. data/lib/prawn/core/text/formatted/arranger.rb +294 -0
  86. data/lib/prawn/core/text/formatted/line_wrap.rb +288 -0
  87. data/lib/prawn/core/text/formatted/wrap.rb +153 -0
  88. data/lib/prawn/document.rb +707 -0
  89. data/lib/prawn/document/bounding_box.rb +510 -0
  90. data/lib/prawn/document/column_box.rb +132 -0
  91. data/lib/prawn/document/graphics_state.rb +136 -0
  92. data/lib/prawn/document/internals.rb +173 -0
  93. data/lib/prawn/document/page_geometry.rb +136 -0
  94. data/lib/prawn/document/snapshot.rb +89 -0
  95. data/lib/prawn/document/span.rb +55 -0
  96. data/lib/prawn/encoding.rb +121 -0
  97. data/lib/prawn/errors.rb +99 -0
  98. data/lib/prawn/font.rb +386 -0
  99. data/lib/prawn/font/afm.rb +203 -0
  100. data/lib/prawn/font/dfont.rb +42 -0
  101. data/lib/prawn/font/ttf.rb +343 -0
  102. data/lib/prawn/graphics.rb +523 -0
  103. data/lib/prawn/graphics/cap_style.rb +46 -0
  104. data/lib/prawn/graphics/color.rb +231 -0
  105. data/lib/prawn/graphics/dash.rb +82 -0
  106. data/lib/prawn/graphics/join_style.rb +47 -0
  107. data/lib/prawn/graphics/patterns.rb +137 -0
  108. data/lib/prawn/graphics/transformation.rb +156 -0
  109. data/lib/prawn/graphics/transparency.rb +99 -0
  110. data/lib/prawn/images.rb +196 -0
  111. data/lib/prawn/images/image.rb +65 -0
  112. data/lib/prawn/images/jpg.rb +85 -0
  113. data/lib/prawn/images/png.rb +362 -0
  114. data/lib/prawn/layout.rb +20 -0
  115. data/lib/prawn/layout/grid.rb +259 -0
  116. data/lib/prawn/measurement_extensions.rb +46 -0
  117. data/lib/prawn/measurements.rb +71 -0
  118. data/lib/prawn/outline.rb +326 -0
  119. data/lib/prawn/repeater.rb +122 -0
  120. data/lib/prawn/security.rb +269 -0
  121. data/lib/prawn/soft_mask.rb +94 -0
  122. data/lib/prawn/stamp.rb +134 -0
  123. data/lib/prawn/table.rb +609 -0
  124. data/lib/prawn/table/cell.rb +776 -0
  125. data/lib/prawn/table/cell/image.rb +70 -0
  126. data/lib/prawn/table/cell/in_table.rb +27 -0
  127. data/lib/prawn/table/cell/span_dummy.rb +88 -0
  128. data/lib/prawn/table/cell/subtable.rb +65 -0
  129. data/lib/prawn/table/cell/text.rb +152 -0
  130. data/lib/prawn/table/cells.rb +260 -0
  131. data/lib/prawn/text.rb +420 -0
  132. data/lib/prawn/text/box.rb +141 -0
  133. data/lib/prawn/text/formatted.rb +4 -0
  134. data/lib/prawn/text/formatted/box.rb +563 -0
  135. data/lib/prawn/text/formatted/fragment.rb +253 -0
  136. data/lib/prawn/text/formatted/parser.rb +217 -0
  137. data/lib/prawn/utilities.rb +44 -0
  138. data/manual/basic_concepts/adding_pages.rb +27 -0
  139. data/manual/basic_concepts/basic_concepts.rb +34 -0
  140. data/manual/basic_concepts/creation.rb +39 -0
  141. data/manual/basic_concepts/cursor.rb +33 -0
  142. data/manual/basic_concepts/measurement.rb +25 -0
  143. data/manual/basic_concepts/origin.rb +38 -0
  144. data/manual/basic_concepts/other_cursor_helpers.rb +40 -0
  145. data/manual/bounding_box/bounding_box.rb +39 -0
  146. data/manual/bounding_box/bounds.rb +49 -0
  147. data/manual/bounding_box/canvas.rb +24 -0
  148. data/manual/bounding_box/creation.rb +23 -0
  149. data/manual/bounding_box/indentation.rb +46 -0
  150. data/manual/bounding_box/nesting.rb +45 -0
  151. data/manual/bounding_box/russian_boxes.rb +40 -0
  152. data/manual/bounding_box/stretchy.rb +31 -0
  153. data/manual/document_and_page_options/background.rb +27 -0
  154. data/manual/document_and_page_options/document_and_page_options.rb +31 -0
  155. data/manual/document_and_page_options/metadata.rb +23 -0
  156. data/manual/document_and_page_options/page_margins.rb +38 -0
  157. data/manual/document_and_page_options/page_size.rb +34 -0
  158. data/manual/example_file.rb +116 -0
  159. data/manual/example_helper.rb +430 -0
  160. data/manual/example_package.rb +53 -0
  161. data/manual/example_section.rb +46 -0
  162. data/manual/graphics/circle_and_ellipse.rb +22 -0
  163. data/manual/graphics/color.rb +24 -0
  164. data/manual/graphics/common_lines.rb +28 -0
  165. data/manual/graphics/fill_and_stroke.rb +42 -0
  166. data/manual/graphics/fill_rules.rb +37 -0
  167. data/manual/graphics/gradients.rb +37 -0
  168. data/manual/graphics/graphics.rb +58 -0
  169. data/manual/graphics/helper.rb +17 -0
  170. data/manual/graphics/line_width.rb +35 -0
  171. data/manual/graphics/lines_and_curves.rb +41 -0
  172. data/manual/graphics/polygon.rb +29 -0
  173. data/manual/graphics/rectangle.rb +21 -0
  174. data/manual/graphics/rotate.rb +28 -0
  175. data/manual/graphics/scale.rb +41 -0
  176. data/manual/graphics/soft_masks.rb +46 -0
  177. data/manual/graphics/stroke_cap.rb +31 -0
  178. data/manual/graphics/stroke_dash.rb +43 -0
  179. data/manual/graphics/stroke_join.rb +30 -0
  180. data/manual/graphics/translate.rb +29 -0
  181. data/manual/graphics/transparency.rb +35 -0
  182. data/manual/images/absolute_position.rb +23 -0
  183. data/manual/images/fit.rb +21 -0
  184. data/manual/images/horizontal.rb +25 -0
  185. data/manual/images/images.rb +40 -0
  186. data/manual/images/plain_image.rb +18 -0
  187. data/manual/images/scale.rb +22 -0
  188. data/manual/images/vertical.rb +28 -0
  189. data/manual/images/width_and_height.rb +25 -0
  190. data/manual/layout/boxes.rb +27 -0
  191. data/manual/layout/content.rb +25 -0
  192. data/manual/layout/layout.rb +28 -0
  193. data/manual/layout/simple_grid.rb +23 -0
  194. data/manual/manual/cover.rb +26 -0
  195. data/manual/manual/foreword.rb +13 -0
  196. data/manual/manual/how_to_read_this_manual.rb +41 -0
  197. data/manual/manual/manual.rb +36 -0
  198. data/manual/outline/add_subsection_to.rb +61 -0
  199. data/manual/outline/insert_section_after.rb +47 -0
  200. data/manual/outline/outline.rb +32 -0
  201. data/manual/outline/sections_and_pages.rb +67 -0
  202. data/manual/repeatable_content/page_numbering.rb +54 -0
  203. data/manual/repeatable_content/repeatable_content.rb +31 -0
  204. data/manual/repeatable_content/repeater.rb +55 -0
  205. data/manual/repeatable_content/stamp.rb +41 -0
  206. data/manual/security/encryption.rb +31 -0
  207. data/manual/security/permissions.rb +38 -0
  208. data/manual/security/security.rb +28 -0
  209. data/manual/syntax_highlight.rb +52 -0
  210. data/manual/table/basic_block.rb +53 -0
  211. data/manual/table/before_rendering_page.rb +26 -0
  212. data/manual/table/cell_border_lines.rb +24 -0
  213. data/manual/table/cell_borders_and_bg.rb +31 -0
  214. data/manual/table/cell_dimensions.rb +30 -0
  215. data/manual/table/cell_text.rb +38 -0
  216. data/manual/table/column_widths.rb +30 -0
  217. data/manual/table/content_and_subtables.rb +39 -0
  218. data/manual/table/creation.rb +27 -0
  219. data/manual/table/filtering.rb +36 -0
  220. data/manual/table/flow_and_header.rb +17 -0
  221. data/manual/table/image_cells.rb +33 -0
  222. data/manual/table/position.rb +29 -0
  223. data/manual/table/row_colors.rb +20 -0
  224. data/manual/table/span.rb +30 -0
  225. data/manual/table/style.rb +22 -0
  226. data/manual/table/table.rb +52 -0
  227. data/manual/table/width.rb +27 -0
  228. data/manual/templates/full_template.rb +23 -0
  229. data/manual/templates/page_template.rb +47 -0
  230. data/manual/templates/templates.rb +26 -0
  231. data/manual/text/alignment.rb +44 -0
  232. data/manual/text/color.rb +24 -0
  233. data/manual/text/column_box.rb +32 -0
  234. data/manual/text/fallback_fonts.rb +37 -0
  235. data/manual/text/font.rb +41 -0
  236. data/manual/text/font_size.rb +45 -0
  237. data/manual/text/font_style.rb +23 -0
  238. data/manual/text/formatted_callbacks.rb +60 -0
  239. data/manual/text/formatted_text.rb +50 -0
  240. data/manual/text/free_flowing_text.rb +51 -0
  241. data/manual/text/group.rb +29 -0
  242. data/manual/text/inline.rb +43 -0
  243. data/manual/text/kerning_and_character_spacing.rb +39 -0
  244. data/manual/text/leading.rb +25 -0
  245. data/manual/text/line_wrapping.rb +41 -0
  246. data/manual/text/paragraph_indentation.rb +26 -0
  247. data/manual/text/positioned_text.rb +38 -0
  248. data/manual/text/registering_families.rb +48 -0
  249. data/manual/text/rendering_and_color.rb +37 -0
  250. data/manual/text/right_to_left_text.rb +43 -0
  251. data/manual/text/rotation.rb +43 -0
  252. data/manual/text/single_usage.rb +37 -0
  253. data/manual/text/text.rb +75 -0
  254. data/manual/text/text_box_excess.rb +32 -0
  255. data/manual/text/text_box_extensions.rb +45 -0
  256. data/manual/text/text_box_overflow.rb +44 -0
  257. data/manual/text/utf8.rb +28 -0
  258. data/manual/text/win_ansi_charset.rb +59 -0
  259. data/prawn.gemspec +46 -0
  260. data/spec/annotations_spec.rb +90 -0
  261. data/spec/bounding_box_spec.rb +493 -0
  262. data/spec/cell_spec.rb +584 -0
  263. data/spec/column_box_spec.rb +33 -0
  264. data/spec/data/curves.pdf +66 -0
  265. data/spec/destinations_spec.rb +15 -0
  266. data/spec/document_spec.rb +736 -0
  267. data/spec/extensions/encoding_helpers.rb +6 -0
  268. data/spec/extensions/mocha.rb +44 -0
  269. data/spec/font_spec.rb +433 -0
  270. data/spec/formatted_text_arranger_spec.rb +421 -0
  271. data/spec/formatted_text_box_spec.rb +640 -0
  272. data/spec/formatted_text_fragment_spec.rb +298 -0
  273. data/spec/graphics_spec.rb +651 -0
  274. data/spec/grid_spec.rb +85 -0
  275. data/spec/images_spec.rb +140 -0
  276. data/spec/inline_formatted_text_parser_spec.rb +515 -0
  277. data/spec/jpg_spec.rb +25 -0
  278. data/spec/line_wrap_spec.rb +333 -0
  279. data/spec/measurement_units_spec.rb +23 -0
  280. data/spec/name_tree_spec.rb +112 -0
  281. data/spec/object_store_spec.rb +170 -0
  282. data/spec/outline_spec.rb +426 -0
  283. data/spec/pdf_object_spec.rb +172 -0
  284. data/spec/png_spec.rb +240 -0
  285. data/spec/reference_spec.rb +105 -0
  286. data/spec/repeater_spec.rb +158 -0
  287. data/spec/security_spec.rb +126 -0
  288. data/spec/snapshot_spec.rb +186 -0
  289. data/spec/soft_mask_spec.rb +117 -0
  290. data/spec/span_spec.rb +49 -0
  291. data/spec/spec_helper.rb +36 -0
  292. data/spec/stamp_spec.rb +159 -0
  293. data/spec/stroke_styles_spec.rb +193 -0
  294. data/spec/table_spec.rb +1209 -0
  295. data/spec/template_spec.rb +351 -0
  296. data/spec/text_at_spec.rb +129 -0
  297. data/spec/text_box_spec.rb +1029 -0
  298. data/spec/text_rendering_mode_spec.rb +45 -0
  299. data/spec/text_spacing_spec.rb +93 -0
  300. data/spec/text_spec.rb +421 -0
  301. data/spec/text_with_inline_formatting_spec.rb +35 -0
  302. data/spec/transparency_spec.rb +89 -0
  303. metadata +544 -0
@@ -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
@@ -0,0 +1,34 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Prawn comes with support for most of the common page sizes so you'll only need
4
+ # to provide specific values if your intended format is not supported. To see a
5
+ # list with all supported sizes take a look at: https://github.com/prawnpdf/prawn/blob/master/lib/prawn/document/page_geometry.rb
6
+ #
7
+ # To define the size use <code>:page_size</code> when creating new documents
8
+ # and <code>:size</code> when starting new pages. The default page size for new
9
+ # documents is LETTER (612.00 x 792.00).
10
+ #
11
+ # You may also define the orientation of the page to be either portrait
12
+ # (default) or landscape. Use <code>:page_layout</code> when creating new
13
+ # documents and <code>:layout</code> when starting new pages.
14
+ #
15
+ require File.expand_path(File.join(File.dirname(__FILE__),
16
+ %w[.. example_helper]))
17
+
18
+ Prawn::Document.generate("page_size.pdf",
19
+ :page_size => "EXECUTIVE",
20
+ :page_layout => :landscape
21
+ ) do
22
+ text "EXECUTIVE landscape page."
23
+
24
+ custom_size = [275, 326]
25
+
26
+ ["A4", "TABLOID", "B7", custom_size ].each do |size|
27
+
28
+ start_new_page(:size => size, :layout => :portrait)
29
+ text "#{size} portrait page."
30
+
31
+ start_new_page(:size => size, :layout => :landscape)
32
+ text "#{size} landscape page."
33
+ end
34
+ end
@@ -0,0 +1,116 @@
1
+ # encoding: utf-8
2
+
3
+ module Prawn
4
+
5
+ # The Prawn::ExampleFile class is a utility class to ease the manipulation
6
+ # and extraction of source code and comments from the actual example files
7
+ #
8
+ class ExampleFile
9
+ attr_reader :package, :filename
10
+
11
+ # Stores the file data, filename and parent, which will be either an
12
+ # ExampleSection or an ExamplePackage.
13
+ #
14
+ # Available boolean options are:
15
+ #
16
+ # <tt>:eval_source</tt>:: Evals the example source code (default: true)
17
+ # <tt>:full_source</tt>:: Extract the full source code when true. Extract
18
+ # only the code between the generate block when false (default: false)
19
+ #
20
+ def initialize(parent, filename, options={})
21
+ @parent = parent.is_a?(String) ? ExamplePackage.new(parent) : parent
22
+
23
+ @filename = filename
24
+ @data = read_file(@parent.folder_name, filename)
25
+
26
+ @options = {:eval_source => true, :full_source => false}.merge(options)
27
+ end
28
+
29
+ # Return the example source code excluding the initial comments and
30
+ # require calls
31
+ #
32
+ def full_source
33
+ @data.gsub(/# encoding.*?\n.*require.*?\n\n/m, "\n").strip
34
+ end
35
+
36
+ # Return the example source contained inside the first generate block or
37
+ # the full source if no generate block is found
38
+ #
39
+ def generate_block_source
40
+ block = @data.slice(/\w+\.generate.*? do\n(.*)end/m, 1)
41
+
42
+ return full_source unless block
43
+
44
+ block.gsub(/^( ){2}/, "")
45
+ end
46
+
47
+ # Return either the full_source or the generate_block_source according
48
+ # to the options
49
+ #
50
+ def source
51
+ @options[:full_source] ? full_source : generate_block_source
52
+ end
53
+
54
+ # Return true if the example source should be evaluated inline within
55
+ # the manual according to the options
56
+ #
57
+ def eval?
58
+ @options[:eval_source]
59
+ end
60
+
61
+ # Retrieve the comments between the encoding declaration and the require
62
+ # call for example_helper.rb
63
+ #
64
+ # Then removes the '#' signs, reflows the line breaks and return the result
65
+ #
66
+ def introduction_text
67
+ intro = @data.slice(/# encoding.*?\n(.*)require File\.expand_path/m, 1)
68
+ intro.gsub!(/\n# (?=\S)/m, ' ')
69
+ intro.gsub!(/^#/, '')
70
+ intro.gsub!("\n", "\n\n")
71
+ intro.rstrip!
72
+ intro
73
+ end
74
+
75
+ # Returns a human friendly version of the example file name
76
+ #
77
+ def name
78
+ @name ||= @filename[/(.*)\.rb/, 1].gsub("_", " ").capitalize
79
+ end
80
+
81
+ # Returns this example's parent original folder name
82
+ #
83
+ def parent_folder_name
84
+ @parent.folder_name
85
+ end
86
+
87
+ # Returns the human friendly version of this example parent name
88
+ #
89
+ def parent_name
90
+ @parent.name
91
+ end
92
+
93
+ # Renders this example to a pdf
94
+ #
95
+ def render(pdf)
96
+ pdf.render_example(self)
97
+ end
98
+
99
+ private
100
+
101
+ # Read the data from a file in a given package
102
+ #
103
+ def read_file(folder_name, filename)
104
+ data = File.read(File.expand_path(File.join(
105
+ File.dirname(__FILE__), folder_name, filename)))
106
+
107
+ # XXX If we ever have manual files with source encodings other than
108
+ # UTF-8, we will need to fix this to work on Ruby 1.9.
109
+ if data.respond_to?(:encode!)
110
+ data.encode!("UTF-8")
111
+ end
112
+ data
113
+ end
114
+
115
+ end
116
+ end
@@ -0,0 +1,430 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Helper for organizing examples
4
+ #
5
+
6
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
7
+ require 'prawn'
8
+ require 'prawn/security'
9
+ require 'prawn/layout'
10
+
11
+ require 'enumerator'
12
+
13
+ require File.expand_path(File.join(File.dirname(__FILE__), 'example_file'))
14
+ require File.expand_path(File.join(File.dirname(__FILE__), 'example_section'))
15
+ require File.expand_path(File.join(File.dirname(__FILE__), 'example_package'))
16
+ require File.expand_path(File.join(File.dirname(__FILE__), 'syntax_highlight'))
17
+
18
+ Prawn.debug = true
19
+
20
+ module Prawn
21
+
22
+ # The Prawn::Example class holds all the helper methods used to generate the
23
+ # Prawn by example manual.
24
+ #
25
+ # The overall structure is to have single example files grouped by package
26
+ # folders. Each package has a package builder file (with the same name as the
27
+ # package folder) that defines the inner structure of subsections and
28
+ # examples. The manual is then built by loading all the packages and some
29
+ # standalone pages.
30
+ #
31
+ # To see one of the examples check manual/basic_concepts/cursor.rb
32
+ #
33
+ # To see one of the package builders check
34
+ # manual/basic_concepts/basic_concepts.rb
35
+ #
36
+ # To see how the manual is built check manual/manual/manual.rb (Yes that's a
37
+ # whole load of manuals)
38
+ #
39
+ class Example < Prawn::Document
40
+
41
+ # Values used for the manual design:
42
+
43
+ # This is the default value for the margin box
44
+ #
45
+ BOX_MARGIN = 36
46
+
47
+ # Additional indentation to keep the line measure with a reasonable size
48
+ #
49
+ INNER_MARGIN = 30
50
+
51
+ # Vertical Rhythm settings
52
+ #
53
+ RHYTHM = 10
54
+ LEADING = 2
55
+
56
+ # Colors
57
+ #
58
+ BLACK = "000000"
59
+ LIGHT_GRAY = "F2F2F2"
60
+ GRAY = "DDDDDD"
61
+ DARK_GRAY = "333333"
62
+ BROWN = "A4441C"
63
+ ORANGE = "F28157"
64
+ LIGHT_GOLD = "FBFBBE"
65
+ DARK_GOLD = "EBE389"
66
+ BLUE = "0000D0"
67
+
68
+ # Used to generate the url for the example files
69
+ #
70
+ MANUAL_URL = "http://github.com/prawnpdf/prawn/tree/master/manual"
71
+
72
+
73
+ # Loads a package. Used on the manual.
74
+ #
75
+ def load_package(package)
76
+ load_file(package, package)
77
+ end
78
+
79
+ # Loads a page with outline support. Used on the manual.
80
+ #
81
+ def load_page(page)
82
+ load_file("manual", page)
83
+
84
+ outline.define do
85
+ section(page.gsub("_", " ").capitalize, :destination => page_number)
86
+ end
87
+ end
88
+
89
+ # Opens a file in a given package and evals the source
90
+ #
91
+ def load_file(package, file)
92
+ start_new_page
93
+ example = ExampleFile.new(package, "#{file}.rb")
94
+ eval example.generate_block_source
95
+ end
96
+
97
+
98
+ # Creates a new ExamplePackage object and yields it to a block in order for
99
+ # it to be populated with examples, sections and some introduction text.
100
+ # Used on the package files.
101
+ #
102
+ def package(package, &block)
103
+ ep = ExamplePackage.new(package)
104
+ ep.instance_eval(&block)
105
+ ep.render(self)
106
+ end
107
+
108
+ # Renders an ExamplePackage cover page.
109
+ #
110
+ # Starts a new page and renders the package introduction text.
111
+ #
112
+ def render_package_cover(package)
113
+ header(package.name)
114
+ instance_eval &(package.intro_block)
115
+
116
+ outline.define do
117
+ section(package.name, :destination => page_number, :closed => true)
118
+ end
119
+ end
120
+
121
+ # Add the ExampleSection to the document outline within the appropriate
122
+ # package.
123
+ #
124
+ def render_section(section)
125
+ outline.add_subsection_to(section.package_name) do
126
+ outline.section(section.name, :closed => true)
127
+ end
128
+ end
129
+
130
+ # Renders an ExampleFile.
131
+ #
132
+ # Starts a new page and renders an introductory text, the example source and
133
+ # evaluates the example source inline whenever that is appropriate according
134
+ # to the ExampleFile directives.
135
+ #
136
+ def render_example(example)
137
+ start_new_page
138
+
139
+ outline.add_subsection_to(example.parent_name) do
140
+ outline.page(:destination => page_number, :title => example.name)
141
+ end
142
+
143
+ example_header(example.parent_folder_name, example.filename)
144
+
145
+ prose(example.introduction_text)
146
+
147
+ code(example.source)
148
+
149
+ if example.eval?
150
+ eval_code(example.source)
151
+ else
152
+ source_link(example)
153
+ end
154
+
155
+ reset_settings
156
+ end
157
+
158
+ # Render the example header. Used on the example pages of the manual
159
+ #
160
+ def example_header(package, example)
161
+ header_box do
162
+ register_fonts
163
+ font('DejaVu', :size => 18) do
164
+ formatted_text([ { :text => package, :color => BROWN },
165
+ { :text => "/", :color => BROWN },
166
+ { :text => example, :color => ORANGE }
167
+ ], :valign => :center)
168
+ end
169
+ end
170
+ end
171
+
172
+ # Register fonts used on the manual
173
+ #
174
+ def register_fonts
175
+ kai_file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf"
176
+ font_families["Kai"] = {
177
+ :normal => { :file => kai_file, :font => "Kai" }
178
+ }
179
+
180
+ dejavu_file = "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf"
181
+ font_families["DejaVu"] = {
182
+ :normal => { :file => dejavu_file, :font => "DejaVu" }
183
+ }
184
+ end
185
+
186
+ # Render a block of text after processing code tags and URLs to be used with
187
+ # the inline_format option.
188
+ #
189
+ # Used on the introducory text for example pages of the manual and on
190
+ # package pages intro
191
+ #
192
+ def prose(str)
193
+
194
+ # Process the <code> tags
195
+ str.gsub!(/<code>([^<]+?)<\/code>/,
196
+ "<font name='Courier'><b>\\1<\/b><\/font>")
197
+
198
+ # Process the links
199
+ str.gsub!(/(https?:\/\/\S+)/,
200
+ "<color rgb='#{BLUE}'><link href=\"\\1\">\\1</link></color>")
201
+
202
+ inner_box do
203
+ font("Helvetica", :size => 11) do
204
+ str.split(/\n\n+/).each do |paragraph|
205
+
206
+ text(paragraph.gsub(/\s+/," "),
207
+ :align => :justify,
208
+ :inline_format => true,
209
+ :leading => LEADING,
210
+ :color => DARK_GRAY)
211
+
212
+ move_down(RHYTHM)
213
+ end
214
+ end
215
+ end
216
+
217
+ move_down(RHYTHM)
218
+ end
219
+
220
+ # Render a code block. Used on the example pages of the manual
221
+ #
222
+ def code(str)
223
+ pre_text = str.gsub(' ', Prawn::Text::NBSP)
224
+ pre_text = ::CodeRay.scan(pre_text, :ruby).to_prawn
225
+
226
+ font('Courier', :size => 9.5) do
227
+ colored_box(pre_text, :fill_color => DARK_GRAY)
228
+ end
229
+ end
230
+
231
+ # Renders a dashed line and evaluates the code inline
232
+ #
233
+ def eval_code(source)
234
+ move_down(RHYTHM)
235
+
236
+ dash(3)
237
+ stroke_color(BROWN)
238
+ stroke_horizontal_line(-BOX_MARGIN, bounds.width + BOX_MARGIN)
239
+ stroke_color(BLACK)
240
+ undash
241
+
242
+ move_down(RHYTHM*3)
243
+ begin
244
+ eval(source)
245
+ rescue => e
246
+ puts "Error evaluating example: #{e.message}"
247
+ puts
248
+ puts "---- Source: ----"
249
+ puts source
250
+ end
251
+ end
252
+
253
+ # Renders a box with the link for the example file
254
+ #
255
+ def source_link(example)
256
+ url = "#{MANUAL_URL}/#{example.parent_folder_name}/#{example.filename}"
257
+
258
+ reason = [{ :text => "This code snippet was not evaluated inline. " +
259
+ "You may see its output by running the " +
260
+ "example file located here:\n",
261
+ :color => DARK_GRAY },
262
+
263
+ { :text => url,
264
+ :color => BLUE,
265
+ :link => url}
266
+ ]
267
+
268
+ font('Helvetica', :size => 9) do
269
+ colored_box(reason,
270
+ :fill_color => LIGHT_GOLD,
271
+ :stroke_color => DARK_GOLD,
272
+ :leading => LEADING*3)
273
+ end
274
+ end
275
+
276
+ # Render a page header. Used on the manual lone pages and package
277
+ # introductory pages
278
+ #
279
+ def header(str)
280
+ header_box do
281
+ register_fonts
282
+ font('DejaVu', :size => 24) do
283
+ text(str, :color => BROWN, :valign => :center)
284
+ end
285
+ end
286
+ end
287
+
288
+ # Render the arguments as a bulleted list. Used on the manual package
289
+ # introductory pages
290
+ #
291
+ def list(*items)
292
+ move_up(RHYTHM)
293
+
294
+ inner_box do
295
+ font("Helvetica", :size => 11) do
296
+ items.each do |li|
297
+ float { text("•", :color => DARK_GRAY) }
298
+ indent(RHYTHM) do
299
+ text(li.gsub(/\s+/," "),
300
+ :inline_format => true,
301
+ :color => DARK_GRAY,
302
+ :leading => LEADING)
303
+ end
304
+
305
+ move_down(RHYTHM)
306
+ end
307
+ end
308
+ end
309
+ end
310
+
311
+ # Renders the page-wide headers
312
+ #
313
+ def header_box(&block)
314
+ bounding_box([-bounds.absolute_left, cursor + BOX_MARGIN],
315
+ :width => bounds.absolute_left + bounds.absolute_right,
316
+ :height => BOX_MARGIN*2 + RHYTHM*2) do
317
+
318
+ fill_color LIGHT_GRAY
319
+ fill_rectangle([bounds.left, bounds.top],
320
+ bounds.right,
321
+ bounds.top - bounds.bottom)
322
+ fill_color BLACK
323
+
324
+ indent(BOX_MARGIN + INNER_MARGIN, &block)
325
+ end
326
+
327
+ stroke_color GRAY
328
+ stroke_horizontal_line(-BOX_MARGIN, bounds.width + BOX_MARGIN, :at => cursor)
329
+ stroke_color BLACK
330
+
331
+ move_down(RHYTHM*3)
332
+ end
333
+
334
+ # Renders a Bounding Box for the inner margin
335
+ #
336
+ def inner_box(&block)
337
+ bounding_box([INNER_MARGIN, cursor],
338
+ :width => bounds.width - INNER_MARGIN*2,
339
+ &block)
340
+ end
341
+
342
+ # Renders a Bounding Box with some background color and the formatted text
343
+ # inside it
344
+ #
345
+ def colored_box(box_text, options={})
346
+ options = { :fill_color => DARK_GRAY,
347
+ :stroke_color => nil,
348
+ :text_color => LIGHT_GRAY,
349
+ :leading => LEADING
350
+ }.merge(options)
351
+
352
+ register_fonts
353
+ text_options = { :leading => options[:leading],
354
+ :fallback_fonts => ["DejaVu", "Kai"]
355
+ }
356
+
357
+ box_height = height_of_formatted(box_text, text_options)
358
+
359
+ bounding_box([INNER_MARGIN + RHYTHM, cursor],
360
+ :width => bounds.width - (INNER_MARGIN+RHYTHM)*2) do
361
+
362
+ fill_color options[:fill_color]
363
+ stroke_color options[:stroke_color] || options[:fill_color]
364
+ fill_and_stroke_rounded_rectangle(
365
+ [bounds.left - RHYTHM, cursor],
366
+ bounds.left + bounds.right + RHYTHM*2,
367
+ box_height + RHYTHM*2,
368
+ 5
369
+ )
370
+ fill_color BLACK
371
+ stroke_color BLACK
372
+
373
+ pad(RHYTHM) do
374
+ formatted_text(box_text, text_options)
375
+ end
376
+ end
377
+
378
+ move_down(RHYTHM*2)
379
+ end
380
+
381
+ # Draws X and Y axis rulers beginning at the margin box origin. Used on
382
+ # examples.
383
+ #
384
+ def stroke_axis(options={})
385
+ options = { :height => (cursor - 20).to_i,
386
+ :width => bounds.width.to_i
387
+ }.merge(options)
388
+
389
+ dash(1, :space => 4)
390
+ stroke_horizontal_line(-21, options[:width], :at => 0)
391
+ stroke_vertical_line(-21, options[:height], :at => 0)
392
+ undash
393
+
394
+ fill_circle [0, 0], 1
395
+
396
+ (100..options[:width]).step(100) do |point|
397
+ fill_circle [point, 0], 1
398
+ draw_text point, :at => [point-5, -10], :size => 7
399
+ end
400
+
401
+ (100..options[:height]).step(100) do |point|
402
+ fill_circle [0, point], 1
403
+ draw_text point, :at => [-17, point-2], :size => 7
404
+ end
405
+ end
406
+
407
+ # Reset some of the Prawn settings including graphics and text to their
408
+ # defaults.
409
+ #
410
+ # Used after rendering examples so that each new example starts with a clean
411
+ # slate.
412
+ #
413
+ def reset_settings
414
+
415
+ # Text settings
416
+ font("Helvetica", :size => 12)
417
+ default_leading 0
418
+ self.text_direction = :ltr
419
+
420
+ # Graphics settings
421
+ self.line_width = 1
422
+ self.cap_style = :butt
423
+ self.join_style = :miter
424
+ undash
425
+ fill_color BLACK
426
+ stroke_color BLACK
427
+ end
428
+
429
+ end
430
+ end