prawn 1.0.0.rc1 → 1.0.0.rc2
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +18 -0
- data/README.md +5 -3
- data/Rakefile +8 -14
- data/data/pdfs/nested_pages.pdf +13 -13
- data/lib/prawn.rb +3 -1
- data/lib/prawn/compatibility.rb +46 -10
- data/lib/prawn/core.rb +3 -1
- data/lib/prawn/core/document_state.rb +2 -1
- data/lib/prawn/core/object_store.rb +61 -5
- data/lib/prawn/core/page.rb +3 -6
- data/lib/prawn/core/pdf_object.rb +21 -4
- data/lib/prawn/core/reference.rb +6 -2
- data/lib/prawn/core/text.rb +4 -4
- data/lib/prawn/core/text/formatted/line_wrap.rb +23 -8
- data/lib/prawn/document.rb +21 -15
- data/lib/prawn/document/bounding_box.rb +3 -3
- data/lib/prawn/document/column_box.rb +22 -4
- data/lib/prawn/document/snapshot.rb +1 -1
- data/lib/prawn/encoding.rb +1 -1
- data/lib/prawn/errors.rb +4 -0
- data/lib/prawn/font.rb +1 -1
- data/lib/prawn/font/afm.rb +30 -72
- data/lib/prawn/font/ttf.rb +6 -33
- data/lib/prawn/graphics.rb +148 -23
- data/lib/prawn/graphics/color.rb +8 -1
- data/lib/prawn/graphics/patterns.rb +137 -0
- data/lib/prawn/images.rb +25 -19
- data/lib/prawn/images/jpg.rb +4 -4
- data/lib/prawn/images/png.rb +18 -12
- data/lib/prawn/security.rb +6 -4
- data/lib/prawn/soft_mask.rb +94 -0
- data/lib/prawn/table.rb +136 -31
- data/lib/prawn/table/cell.rb +260 -29
- data/lib/prawn/table/cell/span_dummy.rb +88 -0
- data/lib/prawn/table/cell/text.rb +36 -14
- data/lib/prawn/table/cells.rb +91 -41
- data/lib/prawn/text.rb +3 -2
- data/lib/prawn/text/formatted/box.rb +14 -5
- data/lib/prawn/text/formatted/fragment.rb +33 -22
- data/lib/prawn/text/formatted/parser.rb +5 -2
- data/lib/prawn/utilities.rb +44 -0
- data/manual/basic_concepts/adding_pages.rb +27 -0
- data/manual/basic_concepts/basic_concepts.rb +34 -0
- data/manual/basic_concepts/creation.rb +39 -0
- data/manual/basic_concepts/cursor.rb +33 -0
- data/manual/basic_concepts/measurement.rb +25 -0
- data/manual/basic_concepts/origin.rb +38 -0
- data/manual/basic_concepts/other_cursor_helpers.rb +40 -0
- data/manual/bounding_box/bounding_box.rb +39 -0
- data/manual/bounding_box/bounds.rb +49 -0
- data/manual/bounding_box/canvas.rb +24 -0
- data/manual/bounding_box/creation.rb +23 -0
- data/manual/bounding_box/indentation.rb +46 -0
- data/manual/bounding_box/nesting.rb +45 -0
- data/manual/bounding_box/russian_boxes.rb +40 -0
- data/manual/bounding_box/stretchy.rb +31 -0
- data/manual/document_and_page_options/background.rb +27 -0
- data/manual/document_and_page_options/document_and_page_options.rb +31 -0
- data/manual/document_and_page_options/metadata.rb +23 -0
- data/manual/document_and_page_options/page_margins.rb +38 -0
- data/manual/document_and_page_options/page_size.rb +34 -0
- data/manual/example_file.rb +116 -0
- data/manual/example_helper.rb +430 -0
- data/manual/example_package.rb +53 -0
- data/manual/example_section.rb +46 -0
- data/manual/graphics/circle_and_ellipse.rb +22 -0
- data/manual/graphics/color.rb +24 -0
- data/manual/graphics/common_lines.rb +28 -0
- data/manual/graphics/fill_and_stroke.rb +42 -0
- data/manual/graphics/fill_rules.rb +37 -0
- data/manual/graphics/gradients.rb +37 -0
- data/manual/graphics/graphics.rb +58 -0
- data/manual/graphics/helper.rb +17 -0
- data/manual/graphics/line_width.rb +35 -0
- data/manual/graphics/lines_and_curves.rb +41 -0
- data/manual/graphics/polygon.rb +29 -0
- data/manual/graphics/rectangle.rb +21 -0
- data/manual/graphics/rotate.rb +28 -0
- data/manual/graphics/scale.rb +41 -0
- data/manual/graphics/soft_masks.rb +46 -0
- data/manual/graphics/stroke_cap.rb +31 -0
- data/manual/graphics/stroke_dash.rb +43 -0
- data/manual/graphics/stroke_join.rb +30 -0
- data/manual/graphics/translate.rb +29 -0
- data/manual/graphics/transparency.rb +35 -0
- data/manual/images/absolute_position.rb +23 -0
- data/manual/images/fit.rb +21 -0
- data/manual/images/horizontal.rb +25 -0
- data/manual/images/images.rb +40 -0
- data/manual/images/plain_image.rb +18 -0
- data/manual/images/scale.rb +22 -0
- data/manual/images/vertical.rb +28 -0
- data/manual/images/width_and_height.rb +25 -0
- data/manual/layout/boxes.rb +27 -0
- data/manual/layout/content.rb +25 -0
- data/manual/layout/layout.rb +28 -0
- data/manual/layout/simple_grid.rb +23 -0
- data/manual/manual/cover.rb +26 -0
- data/manual/manual/foreword.rb +13 -0
- data/manual/manual/how_to_read_this_manual.rb +41 -0
- data/manual/manual/manual.rb +36 -0
- data/manual/outline/add_subsection_to.rb +61 -0
- data/manual/outline/insert_section_after.rb +47 -0
- data/manual/outline/outline.rb +32 -0
- data/manual/outline/sections_and_pages.rb +67 -0
- data/manual/repeatable_content/page_numbering.rb +54 -0
- data/manual/repeatable_content/repeatable_content.rb +31 -0
- data/manual/repeatable_content/repeater.rb +55 -0
- data/manual/repeatable_content/stamp.rb +41 -0
- data/manual/security/encryption.rb +31 -0
- data/manual/security/permissions.rb +38 -0
- data/manual/security/security.rb +28 -0
- data/manual/syntax_highlight.rb +52 -0
- data/manual/table/basic_block.rb +53 -0
- data/manual/table/before_rendering_page.rb +26 -0
- data/manual/table/cell_border_lines.rb +24 -0
- data/manual/table/cell_borders_and_bg.rb +31 -0
- data/manual/table/cell_dimensions.rb +30 -0
- data/manual/table/cell_text.rb +38 -0
- data/manual/table/column_widths.rb +30 -0
- data/manual/table/content_and_subtables.rb +39 -0
- data/manual/table/creation.rb +27 -0
- data/manual/table/filtering.rb +36 -0
- data/manual/table/flow_and_header.rb +17 -0
- data/manual/table/image_cells.rb +33 -0
- data/manual/table/position.rb +29 -0
- data/manual/table/row_colors.rb +20 -0
- data/manual/table/span.rb +30 -0
- data/manual/table/style.rb +22 -0
- data/manual/table/table.rb +52 -0
- data/manual/table/width.rb +27 -0
- data/manual/templates/full_template.rb +23 -0
- data/manual/templates/page_template.rb +47 -0
- data/manual/templates/templates.rb +26 -0
- data/manual/text/alignment.rb +44 -0
- data/manual/text/color.rb +24 -0
- data/manual/text/column_box.rb +32 -0
- data/manual/text/fallback_fonts.rb +37 -0
- data/manual/text/font.rb +41 -0
- data/manual/text/font_size.rb +45 -0
- data/manual/text/font_style.rb +23 -0
- data/manual/text/formatted_callbacks.rb +60 -0
- data/manual/text/formatted_text.rb +50 -0
- data/manual/text/free_flowing_text.rb +51 -0
- data/manual/text/group.rb +29 -0
- data/manual/text/inline.rb +43 -0
- data/manual/text/kerning_and_character_spacing.rb +39 -0
- data/manual/text/leading.rb +25 -0
- data/manual/text/line_wrapping.rb +41 -0
- data/manual/text/paragraph_indentation.rb +26 -0
- data/manual/text/positioned_text.rb +38 -0
- data/manual/text/registering_families.rb +48 -0
- data/manual/text/rendering_and_color.rb +37 -0
- data/manual/text/right_to_left_text.rb +43 -0
- data/manual/text/rotation.rb +43 -0
- data/manual/text/single_usage.rb +37 -0
- data/manual/text/text.rb +75 -0
- data/manual/text/text_box_excess.rb +32 -0
- data/manual/text/text_box_extensions.rb +45 -0
- data/manual/text/text_box_overflow.rb +44 -0
- data/manual/text/utf8.rb +28 -0
- data/manual/text/win_ansi_charset.rb +59 -0
- data/prawn.gemspec +10 -7
- data/spec/bounding_box_spec.rb +107 -17
- data/spec/cell_spec.rb +66 -40
- data/spec/column_box_spec.rb +33 -0
- data/spec/document_spec.rb +45 -24
- data/spec/extensions/encoding_helpers.rb +6 -0
- data/spec/extensions/mocha.rb +1 -0
- data/spec/font_spec.rb +71 -53
- data/spec/formatted_text_arranger_spec.rb +19 -19
- data/spec/formatted_text_box_spec.rb +16 -16
- data/spec/formatted_text_fragment_spec.rb +6 -6
- data/spec/graphics_spec.rb +96 -31
- data/spec/grid_spec.rb +2 -2
- data/spec/images_spec.rb +18 -10
- data/spec/jpg_spec.rb +1 -1
- data/spec/line_wrap_spec.rb +14 -14
- data/spec/measurement_units_spec.rb +2 -2
- data/spec/name_tree_spec.rb +6 -6
- data/spec/object_store_spec.rb +17 -17
- data/spec/outline_spec.rb +35 -17
- data/spec/pdf_object_spec.rb +3 -1
- data/spec/png_spec.rb +22 -19
- data/spec/reference_spec.rb +24 -1
- data/spec/repeater_spec.rb +9 -9
- data/spec/security_spec.rb +3 -3
- data/spec/snapshot_spec.rb +3 -3
- data/spec/soft_mask_spec.rb +117 -0
- data/spec/span_spec.rb +4 -4
- data/spec/spec_helper.rb +12 -6
- data/spec/stamp_spec.rb +12 -12
- data/spec/stroke_styles_spec.rb +5 -5
- data/spec/table_spec.rb +458 -88
- data/spec/template_spec.rb +108 -54
- data/spec/text_at_spec.rb +17 -17
- data/spec/text_box_spec.rb +76 -45
- data/spec/text_rendering_mode_spec.rb +5 -5
- data/spec/text_spacing_spec.rb +4 -4
- data/spec/text_spec.rb +44 -40
- metadata +419 -250
- data/lib/prawn/graphics/gradient.rb +0 -84
- data/lib/prawn/security/arcfour.rb +0 -51
@@ -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
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# All of the previous styling options we've seen deal with all the table cells
|
4
|
+
# at once.
|
5
|
+
#
|
6
|
+
# With initializer blocks we may deal with specific cells.
|
7
|
+
# A block passed to one of the table methods (<code>Prawn::Table.new</code>,
|
8
|
+
# <code>Prawn::Document#table</code>, <code>Prawn::Document#make_table</code>)
|
9
|
+
# will be called after cell setup but before layout. This is a very flexible way
|
10
|
+
# to specify styling and layout constraints.
|
11
|
+
#
|
12
|
+
# Just like the <code>Prawn::Document.generate</code> method, the table
|
13
|
+
# initializer blocks may be used with and without a block argument.
|
14
|
+
#
|
15
|
+
# The table class has three methods that are handy within an initializer block:
|
16
|
+
# <code>cells</code>, <code>rows</code> and <code>columns</code>. All three
|
17
|
+
# return an instance of <code>Prawn::Table::Cells</code> which represents
|
18
|
+
# a selection of cells.
|
19
|
+
#
|
20
|
+
# <code>cells</code> return all the table cells, while <code>rows</code> and
|
21
|
+
# <code>columns</code> accept a number or a range as argument which returns a
|
22
|
+
# single row/column or a range of rows/columns respectively. (<code>rows</code>
|
23
|
+
# and <code>columns</code> are also aliased as <code>row</code> and
|
24
|
+
# <code>column</code>)
|
25
|
+
#
|
26
|
+
# The <code>Prawn::Table::Cells</code> class also defines <code>rows</code> and
|
27
|
+
# <code>columns</code> so they may be chained to narrow the selection of cells.
|
28
|
+
#
|
29
|
+
# All of the cell styling options we've seen on previous examples may be set as
|
30
|
+
# properties of the selection of cells.
|
31
|
+
#
|
32
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
33
|
+
%w[.. example_helper]))
|
34
|
+
|
35
|
+
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
36
|
+
Prawn::Example.generate(filename) do
|
37
|
+
data = [ ["Header", "A " * 5, "B"],
|
38
|
+
["Data row", "C", "D " * 5],
|
39
|
+
["Another data row", "E", "F"]]
|
40
|
+
|
41
|
+
table(data) do
|
42
|
+
cells.padding = 12
|
43
|
+
cells.borders = []
|
44
|
+
|
45
|
+
row(0).borders = [:bottom]
|
46
|
+
row(0).border_width = 2
|
47
|
+
row(0).font_style = :bold
|
48
|
+
|
49
|
+
columns(0..1).borders = [:right]
|
50
|
+
|
51
|
+
row(0).columns(0..1).borders = [:bottom, :right]
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# <code>Prawn::Table#initialize</code> takes a
|
4
|
+
# <code>:before_rendering_page</code> argument, to adjust the way an entire page
|
5
|
+
# of table cells is styled. This allows you to do things like draw a border
|
6
|
+
# around the entire table as displayed on a page.
|
7
|
+
#
|
8
|
+
# The callback is passed a Cells object that is numbered based on the order of
|
9
|
+
# the cells on the page (e.g., the first row on the page is
|
10
|
+
# <code>cells.row(0)</code>).
|
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
|
+
table([["foo", "bar", "baz"]] * 40) do |t|
|
18
|
+
t.cells.border_width = 1
|
19
|
+
t.before_rendering_page do |page|
|
20
|
+
page.row(0).border_top_width = 3
|
21
|
+
page.row(-1).border_bottom_width = 3
|
22
|
+
page.column(0).border_left_width = 3
|
23
|
+
page.column(-1).border_right_width = 3
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# The <code>border_lines</code> option accepts an array with the styles of the
|
4
|
+
# border sides. The default is <code>[:solid, :solid, :solid, :solid]</code>.
|
5
|
+
#
|
6
|
+
# <code>border_lines</code> must be set to an array.
|
7
|
+
#
|
8
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
9
|
+
%w[.. example_helper]))
|
10
|
+
|
11
|
+
filename = File.basename(__FILE__).gsub('.rb', '.pdf')
|
12
|
+
Prawn::Example.generate(filename) do
|
13
|
+
data = [ ["Look at how the cell border lines can be mixed", "", ""],
|
14
|
+
["dotted top border", "", ""],
|
15
|
+
["solid right border", "", ""],
|
16
|
+
["dotted bottom border", "", ""],
|
17
|
+
["dashed left border", "", ""]
|
18
|
+
]
|
19
|
+
|
20
|
+
text "Cell :border_lines => [:dotted, :solid, :dotted, :dashed]"
|
21
|
+
|
22
|
+
table(data, :cell_style =>
|
23
|
+
{ :border_lines => [:dotted, :solid, :dotted, :dashed] })
|
24
|
+
end
|