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,47 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Another way to insert nodes into an existing outline is the
4
+ # <code>insert_section_after</code> method.
5
+ #
6
+ # It accepts the title of the node that the new section will go after and a
7
+ # block declaring the new section.
8
+ #
9
+ # As is the case with <code>add_subsection_to</code> the section added
10
+ # doesn't need to be a section, it may be just a page.
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
+ # First we create 10 pages and some default outline
18
+ (1..10).each do |index|
19
+ text "Page #{index}"
20
+ start_new_page
21
+ end
22
+
23
+ outline.define do
24
+ section("Section 1", :destination => 1) do
25
+ page :title => "Page 2", :destination => 2
26
+ page :title => "Page 3", :destination => 3
27
+ end
28
+ end
29
+
30
+ # Now we will start adding nodes to the previous outline
31
+ outline.insert_section_after("Page 2") do
32
+ outline.section("Section after Page 2") do
33
+ outline.page :title => "Page 4", :destination => 4
34
+ end
35
+ end
36
+
37
+ outline.insert_section_after("Section 1") do
38
+ outline.section("Section after Section 1") do
39
+ outline.page :title => "Page 5", :destination => 5
40
+ end
41
+ end
42
+
43
+ # Adding just a page
44
+ outline.insert_section_after("Page 3") do
45
+ outline.page :title => "Page after Page 3", :destination => 6
46
+ end
47
+ end
@@ -0,0 +1,32 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Examples for defining the document outline.
4
+ #
5
+ require File.expand_path(File.join(File.dirname(__FILE__),
6
+ %w[.. example_helper]))
7
+
8
+ Prawn::Example.generate("outline.pdf", :page_size => "FOLIO") do
9
+
10
+ package "outline" do |p|
11
+
12
+ p.section "Basics" do |s|
13
+ s.example "sections_and_pages", :eval_source => false
14
+ end
15
+
16
+ p.section "Adding nodes later" do |s|
17
+ s.example "add_subsection_to", :eval_source => false
18
+ s.example "insert_section_after", :eval_source => false
19
+ end
20
+
21
+ p.intro do
22
+ prose("The outline of a PDF document is the table of contents tab you see to the right or left of your PDF viewer.
23
+
24
+ The examples include:")
25
+
26
+ list( "How to define sections and pages",
27
+ "How to insert sections and/or pages to a previously defined outline structure"
28
+ )
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,67 @@
1
+ # encoding: utf-8
2
+ #
3
+ # The document outline tree is the set of links used to navigate through the
4
+ # various document sections and pages.
5
+ #
6
+ # To define the document outline we first use the <code>outline</code>
7
+ # method to lazily instantiate an outline object. Then we use the
8
+ # <code>define</code> method with a block to start the outline tree.
9
+ #
10
+ # The basic methods for creating outline nodes are <code>section</code> and
11
+ # <code>page</code>. The only difference between the two is that
12
+ # <code>page</code> doesn't accept a block and will only create leaf nodes
13
+ # while <code>section</code> accepts a block to create nested nodes.
14
+ #
15
+ # <code>section</code> accepts the title of the section and two options:
16
+ # <code>:destination</code> - a page number to link and <code>:closed</code> -
17
+ # a boolean value that defines if the nested outline nodes are shown when the
18
+ # document is open (defaults to true).
19
+ #
20
+ # <code>page</code> is very similar to section. It requires a
21
+ # <code>:title</code> option to be set and accepts a <code>:destination</code>.
22
+ #
23
+ # <code>section</code> and <code>page</code> may also be used without the
24
+ # <code>define</code> method but they will need to instantiate the
25
+ # <code>outline</code> object every time.
26
+ #
27
+ require File.expand_path(File.join(File.dirname(__FILE__),
28
+ %w[.. example_helper]))
29
+
30
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
31
+ Prawn::Example.generate(filename) do
32
+ # First we create 10 pages just to have something to link to
33
+ (1..10).each do |index|
34
+ text "Page #{index}"
35
+ start_new_page
36
+ end
37
+
38
+ outline.define do
39
+ section("Section 1", :destination => 1) do
40
+ page :title => "Page 2", :destination => 2
41
+ page :title => "Page 3", :destination => 3
42
+ end
43
+
44
+ section("Section 2", :destination => 4) do
45
+ page :title => "Page 5", :destination => 5
46
+
47
+ section("Subsection 2.1", :destination => 6, :closed => true) do
48
+ page :title => "Page 7", :destination => 7
49
+ end
50
+ end
51
+ end
52
+
53
+ # Outside of the define block
54
+ outline.section("Section 3", :destination => 8) do
55
+ outline.page :title => "Page 9", :destination => 9
56
+ end
57
+
58
+ outline.page :title => "Page 10", :destination => 10
59
+
60
+ # Section and Pages without links. While a section without a link may be
61
+ # useful to group some pages, a page without a link is useless
62
+ outline.update do # update is an alias to define
63
+ section("Section without link") do
64
+ page :title => "Page without link"
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,54 @@
1
+ # encoding: utf-8
2
+ #
3
+ # The <code>number_pages</code> method is a simple way to number the pages of
4
+ # your document. It should be called towards the end of the document since
5
+ # pages created after the call won't be numbered.
6
+ #
7
+ # It accepts a string and a hash of options:
8
+ #
9
+ # <code>start_count_at</code> is the value from which to start numbering pages
10
+ #
11
+ # <code>total_pages</code> If provided, will replace <code>total</code> with
12
+ # the value given. Useful for overriding the total number of pages when using
13
+ # the start_count_at option.
14
+ #
15
+ # <code>page_filter</code>, which is one of: <code>:all</code>,
16
+ # <code>:odd</code>, <code>:even</code>, an array, a range, or a Proc that
17
+ # receives the page number as an argument and should return true if the page
18
+ # number should be printed on that page.
19
+ #
20
+ # <code>color</code> which accepts the same values as <code>fill_color</code>
21
+ #
22
+ # As well as any option accepted by <code>text_box</code>
23
+ #
24
+ require File.expand_path(File.join(File.dirname(__FILE__),
25
+ %w[.. example_helper]))
26
+
27
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
28
+ Prawn::Example.generate(filename) do
29
+ text "This is the first page!"
30
+
31
+ 10.times do
32
+ start_new_page
33
+ text "Here comes yet another page."
34
+ end
35
+
36
+ string = "page <page> of <total>"
37
+ # Green page numbers 1 to 7
38
+ options = { :at => [bounds.right - 150, 0],
39
+ :width => 150,
40
+ :align => :right,
41
+ :page_filter => (1..7),
42
+ :start_count_at => 1,
43
+ :color => "007700" }
44
+ number_pages string, options
45
+
46
+ # Gray page numbers from 8 on up
47
+ options[:page_filter] = lambda{ |pg| pg > 7}
48
+ options[:start_count_at] = 8
49
+ options[:color] = "333333"
50
+ number_pages string, options
51
+
52
+ start_new_page
53
+ text "See. This page isn't numbered and doesn't count towards the total."
54
+ 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("repeatable_content.pdf", :page_size => "FOLIO") do
9
+
10
+ package "repeatable_content" do |p|
11
+
12
+ p.example "repeater", :eval_source => false
13
+ p.example "stamp"
14
+ p.example "page_numbering", :eval_source => false
15
+
16
+ p.intro do
17
+ prose("Prawn offers two ways to handle repeatable content blocks. Repeater is useful for content that gets repeated at well defined intervals while Stamp is more appropriate if you need better control of when to repeat it.
18
+
19
+ There is also one very specific helper for numbering pages.
20
+
21
+ The examples show:")
22
+
23
+ list( "How to repeat content on several pages with a single invocation",
24
+ "How to create a new Stamp",
25
+ 'How to "stamp" the content block on the page',
26
+ "How to number the document pages with one simple call"
27
+ )
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,55 @@
1
+ # encoding: utf-8
2
+ #
3
+ # The <code>repeat</code> method is quite versatile when it comes to define
4
+ # the intervals at which the content block should repeat.
5
+ #
6
+ # The interval may be a symbol (<code>:all</code>, <code>:odd</code>,
7
+ # <code>:even</code>), an array listing the pages, a range or a
8
+ # <code>Proc</code> that receives the page number as an argument and should
9
+ # return true if the content is to be repeated on the given page.
10
+ #
11
+ # You may also pass an option <code>:dynamic</code> to reevaluate the code block
12
+ # on every call which is useful when the content changes based on the page
13
+ # number.
14
+ #
15
+ # It is also important to say that no matter where you define the repeater it
16
+ # will be applied to all matching pages.
17
+ #
18
+ require File.expand_path(File.join(File.dirname(__FILE__),
19
+ %w[.. example_helper]))
20
+
21
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
22
+ Prawn::Example.generate(filename) do
23
+ repeat(:all) do
24
+ draw_text "All pages", :at => bounds.top_left
25
+ end
26
+
27
+ repeat(:odd) do
28
+ draw_text "Only odd pages", :at => [0,0]
29
+ end
30
+
31
+ repeat(:even) do
32
+ draw_text "Only even pages", :at => [0,0]
33
+ end
34
+
35
+ repeat([1,3,7]) do
36
+ draw_text "Only on pages 1, 3 and 7", :at => [100,0]
37
+ end
38
+
39
+ repeat(2..4) do
40
+ draw_text "From the 2nd to the 4th page", :at => [300,0]
41
+ end
42
+
43
+ repeat(lambda { |pg| pg % 3 == 0 }) do
44
+ draw_text "Every third page", :at => [250, 20]
45
+ end
46
+
47
+ repeat(:all, :dynamic => true) do
48
+ draw_text page_number, :at => [500, 0]
49
+ end
50
+
51
+ 10.times do
52
+ start_new_page
53
+ draw_text "A wonderful page", :at => [400,400]
54
+ end
55
+ end
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Stamps should be used when you have content that will be included multiple
4
+ # times in a document. Its advantages over creating the content anew each time
5
+ # are:
6
+ # 1. Faster document creation
7
+ # 2. Smaller final document
8
+ # 3. Faster display on subsequent displays of the repeated
9
+ # element because the viewer application can cache the rendered
10
+ # results
11
+ #
12
+ # The <code>create_stamp</code> method does just what it says. Pass it a block
13
+ # with the content that should be generated and the stamp will be created.
14
+ #
15
+ # There are two methods to render the stamp on a page <code>stamp</code> and
16
+ # <code>stamp_at</code>. The first will render the stamp as is while the
17
+ # second accepts a point to serve as an offset to the stamp content.
18
+ #
19
+ require File.expand_path(File.join(File.dirname(__FILE__),
20
+ %w[.. example_helper]))
21
+
22
+ filename = File.basename(__FILE__).gsub('.rb', '.pdf')
23
+ Prawn::Example.generate(filename) do
24
+ create_stamp("approved") do
25
+ rotate(30, :origin => [-5, -5]) do
26
+ stroke_color "FF3333"
27
+ stroke_ellipse [0, 0], 29, 15
28
+ stroke_color "000000"
29
+
30
+ fill_color "993333"
31
+ font("Times-Roman") do
32
+ draw_text "Approved", :at => [-23, -3]
33
+ end
34
+ fill_color "000000"
35
+ end
36
+ end
37
+
38
+ stamp "approved"
39
+
40
+ stamp_at "approved", [200, 200]
41
+ end
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+ #
3
+ # The <code>encrypt_document</code> method, as you might have already guessed,
4
+ # is used to encrypt the PDF document.
5
+ #
6
+ # Once encrypted whoever is using the document will need the user password to
7
+ # read the document. This password can be set with the
8
+ # <code>:user_password</code> option. If this is not set the document will be
9
+ # encrypted but a password will not be needed to read the document.
10
+ #
11
+ # There are some caveats when encrypting your PDFs. Be sure to read the source
12
+ # documentation (you can find it here:
13
+ # https://github.com/prawnpdf/prawn/blob/master/lib/prawn/security.rb ) before
14
+ # using this for anything super serious.
15
+ #
16
+ require File.expand_path(File.join(File.dirname(__FILE__),
17
+ %w[.. example_helper]))
18
+
19
+
20
+ # Bare encryption. No password needed.
21
+ Prawn::Example.generate("bare_encryption.pdf") do
22
+ text "See, no password was asked but the document is still encrypted."
23
+ encrypt_document
24
+ end
25
+
26
+
27
+ # Simple password. All permissions granted.
28
+ Prawn::Example.generate("simple_password.pdf") do
29
+ text "You was asked for a password."
30
+ encrypt_document(:user_password => 'foo', :owner_password => 'bar')
31
+ end
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Some permissions may be set for the regular user with the following options:
4
+ # <code>:print_document</code>, <code>:modify_contents</code>,
5
+ # <code>:copy_contents</code>, <code>:modify_annotations</code>. All this
6
+ # options default to true, so if you'd like to revoke just set them to false.
7
+ #
8
+ # A user may bypass all permissions if he provides the owner password which
9
+ # may be set with the <code>:owner_password</code> option. This option may be
10
+ # set to <code>:random</code> so that users will never be able to bypass
11
+ # permissions.
12
+ #
13
+ # There are some caveats when encrypting your PDFs. Be sure to read the source
14
+ # documentation (you can find it here:
15
+ # https://github.com/prawnpdf/prawn/blob/master/lib/prawn/security.rb ) before
16
+ # using this for anything super serious.
17
+ #
18
+ require File.expand_path(File.join(File.dirname(__FILE__),
19
+ %w[.. example_helper]))
20
+
21
+
22
+ # User cannot print the document.
23
+ Prawn::Example.generate("cannot_print.pdf") do
24
+ text "If you used the user password you won't be able to print the doc."
25
+ encrypt_document(:user_password => 'foo', :owner_password => 'bar',
26
+ :permissions => { :print_document => false })
27
+ end
28
+
29
+
30
+ # All permissions revoked and owner password set to random
31
+ Prawn::Example.generate("no_permissions.pdf") do
32
+ text "You may only view this and won't be able to use the owner password."
33
+ encrypt_document(:user_password => 'foo', :owner_password => :random,
34
+ :permissions => { :print_document => false,
35
+ :modify_contents => false,
36
+ :copy_contents => false,
37
+ :modify_annotations => false })
38
+ end
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Examples for document encryption.
4
+ #
5
+ require File.expand_path(File.join(File.dirname(__FILE__),
6
+ %w[.. example_helper]))
7
+
8
+ Prawn::Example.generate("security.pdf", :page_size => "FOLIO") do
9
+
10
+ package "security" do |p|
11
+
12
+ p.example "encryption", :eval_source => false, :full_source => true
13
+ p.example "permissions", :eval_source => false, :full_source => true
14
+
15
+ p.intro do
16
+ prose("Security lets you control who can read the document by defining a password.
17
+
18
+ The examples include:")
19
+
20
+ list( "How to encrypt the document without the need for a password",
21
+ "How to configure the regular user permitions",
22
+ "How to require a password for the regular user",
23
+ "How to set a owner password that bypass the document permissions"
24
+ )
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,52 @@
1
+ # encoding: utf-8
2
+
3
+ require "coderay"
4
+
5
+ # Registers a to_prawn method on CodeRay. It returns an array of hashes to be
6
+ # used with formatted_text.
7
+ #
8
+ # Usage:
9
+ #
10
+ # CodeRay.scan(string, :ruby).to_prawn
11
+ #
12
+ class PrawnEncoder < CodeRay::Encoders::Encoder
13
+ register_for :to_prawn
14
+
15
+ COLORS = { :default => "FFFFFF",
16
+
17
+ :comment => "AEAEAE",
18
+ :constant => "88A5D2",
19
+ :instance_variable => "E8ED97",
20
+ :integer => "C8FF0E",
21
+ :float => "C8FF0E",
22
+ :inline_delimiter => "EF804F", # #{} within a string
23
+ :keyword => "FEE100",
24
+
25
+ # BUG: There appear to be some problem with this token. Method
26
+ # definitions are considered as ident tokens
27
+ #
28
+ :method => "FF5C00",
29
+ :string => "56D65E",
30
+ :symbol => "C8FF0E"
31
+ }
32
+
33
+ def setup(options)
34
+ super
35
+ @out = []
36
+ @open = []
37
+ end
38
+
39
+ def text_token(text, kind)
40
+ color = COLORS[kind] || COLORS[@open.last] || COLORS[:default]
41
+
42
+ @out << {:text => text, :color => color}
43
+ end
44
+
45
+ def begin_group(kind)
46
+ @open << kind
47
+ end
48
+
49
+ def end_group(kind)
50
+ @open.pop
51
+ end
52
+ end