prawn 0.11.1 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. data/GPLv2 +340 -0
  2. data/GPLv3 +674 -0
  3. data/README.md +96 -0
  4. data/Rakefile +0 -12
  5. data/examples/example_helper.rb +3 -0
  6. data/lib/prawn.rb +1 -1
  7. data/lib/prawn/core/page.rb +4 -2
  8. data/lib/prawn/core/pdf_object.rb +7 -7
  9. data/lib/prawn/core/text/formatted/arranger.rb +2 -1
  10. data/lib/prawn/core/text/formatted/line_wrap.rb +2 -1
  11. data/lib/prawn/core/text/formatted/wrap.rb +5 -1
  12. data/lib/prawn/document.rb +135 -112
  13. data/lib/prawn/document/bounding_box.rb +51 -5
  14. data/lib/prawn/document/column_box.rb +0 -19
  15. data/lib/prawn/document/internals.rb +1 -0
  16. data/lib/prawn/document/snapshot.rb +3 -0
  17. data/lib/prawn/font.rb +4 -3
  18. data/lib/prawn/font/afm.rb +11 -2
  19. data/lib/prawn/font/ttf.rb +15 -0
  20. data/lib/prawn/images.rb +1 -1
  21. data/lib/prawn/table.rb +23 -7
  22. data/lib/prawn/table/cell.rb +31 -9
  23. data/lib/prawn/table/cell/text.rb +2 -2
  24. data/prawn.gemspec +5 -6
  25. data/spec/bounding_box_spec.rb +157 -0
  26. data/spec/data/curves.pdf +66 -0
  27. data/spec/document_spec.rb +59 -4
  28. data/spec/extensions/mocha.rb +1 -3
  29. data/spec/font_spec.rb +23 -0
  30. data/spec/formatted_text_box_spec.rb +40 -0
  31. data/spec/images_spec.rb +7 -0
  32. data/spec/object_store_spec.rb +3 -3
  33. data/spec/snapshot_spec.rb +33 -0
  34. data/spec/table_spec.rb +75 -0
  35. data/spec/template_spec.rb +11 -5
  36. data/spec/text_spacing_spec.rb +18 -0
  37. data/spec/text_spec.rb +32 -0
  38. metadata +217 -283
  39. data/HACKING +0 -50
  40. data/README +0 -141
  41. data/examples/bounding_box/bounding_boxes.rb +0 -44
  42. data/examples/bounding_box/indentation.rb +0 -35
  43. data/examples/bounding_box/stretched_nesting.rb +0 -68
  44. data/examples/general/background.rb +0 -24
  45. data/examples/general/canvas.rb +0 -16
  46. data/examples/general/float.rb +0 -12
  47. data/examples/general/margin.rb +0 -37
  48. data/examples/general/measurement_units.rb +0 -52
  49. data/examples/general/metadata-info.rb +0 -17
  50. data/examples/general/multi_page_layout.rb +0 -19
  51. data/examples/general/outlines.rb +0 -67
  52. data/examples/general/page_geometry.rb +0 -32
  53. data/examples/general/page_numbering.rb +0 -40
  54. data/examples/general/page_templates.rb +0 -20
  55. data/examples/general/repeaters.rb +0 -48
  56. data/examples/general/stamp.rb +0 -42
  57. data/examples/general/templates.rb +0 -14
  58. data/examples/graphics/basic_images.rb +0 -24
  59. data/examples/graphics/curves.rb +0 -12
  60. data/examples/graphics/hexagon.rb +0 -14
  61. data/examples/graphics/image_fit.rb +0 -16
  62. data/examples/graphics/image_flow.rb +0 -38
  63. data/examples/graphics/image_position.rb +0 -18
  64. data/examples/graphics/line.rb +0 -33
  65. data/examples/graphics/polygons.rb +0 -17
  66. data/examples/graphics/rounded_polygons.rb +0 -20
  67. data/examples/graphics/rounded_rectangle.rb +0 -21
  68. data/examples/graphics/ruport_style_helpers.rb +0 -20
  69. data/examples/graphics/stroke_bounds.rb +0 -21
  70. data/examples/graphics/stroke_cap_and_join.rb +0 -46
  71. data/examples/graphics/stroke_dash.rb +0 -43
  72. data/examples/graphics/transformations.rb +0 -53
  73. data/examples/graphics/transparency.rb +0 -27
  74. data/examples/grid/bounding_boxes.rb +0 -22
  75. data/examples/grid/column_gutter_grid.rb +0 -21
  76. data/examples/grid/multi_boxes.rb +0 -52
  77. data/examples/grid/show_grid.rb +0 -14
  78. data/examples/grid/simple_grid.rb +0 -21
  79. data/examples/m17n/chinese_text_wrapping.rb +0 -18
  80. data/examples/m17n/euro.rb +0 -16
  81. data/examples/m17n/utf8.rb +0 -14
  82. data/examples/security/hello_foo.rb +0 -9
  83. data/examples/table/borders.rb +0 -25
  84. data/examples/table/cell.rb +0 -13
  85. data/examples/table/checkerboard.rb +0 -23
  86. data/examples/table/inline_format_table.rb +0 -13
  87. data/examples/table/multi_page_table.rb +0 -10
  88. data/examples/table/simple_table.rb +0 -25
  89. data/examples/table/subtable.rb +0 -13
  90. data/examples/table/widths.rb +0 -21
  91. data/examples/text/alignment.rb +0 -19
  92. data/examples/text/character_spacing.rb +0 -13
  93. data/examples/text/dfont.rb +0 -49
  94. data/examples/text/family_based_styling.rb +0 -25
  95. data/examples/text/font_size.rb +0 -34
  96. data/examples/text/inline_format.rb +0 -104
  97. data/examples/text/kerning.rb +0 -31
  98. data/examples/text/rendering_mode.rb +0 -21
  99. data/examples/text/rotated.rb +0 -99
  100. data/examples/text/shaped_text_box.rb +0 -32
  101. data/examples/text/simple_text.rb +0 -18
  102. data/examples/text/simple_text_ttf.rb +0 -18
  103. data/examples/text/span.rb +0 -30
  104. data/examples/text/text_box.rb +0 -90
  105. data/examples/text/text_box_returning_excess.rb +0 -52
  106. data/examples/text/text_flow.rb +0 -68
@@ -1,17 +0,0 @@
1
- # encoding: utf-8
2
- #
3
- # Demonstrates how to set metadata properties via the info option
4
- # It allows one to specify no standard properties
5
- #
6
- require File.expand_path(File.join(File.dirname(__FILE__),
7
- %w[.. example_helper]))
8
-
9
- Prawn::Document.generate "metadata-info.pdf",
10
- :info => {
11
- :Title => "My title", :Author => "John Doe", :Subject => "My Subject",
12
- :Keywords => "test metadata ruby pdf dry", :Creator => "ACME Soft App",
13
- :Producer => "Prawn", :CreationDate => Time.now, :Grok => "Test Property"
14
- } do
15
- text "This is a test of setting metadata properties via the info option"
16
- text "It allows one to specify no standard properties like 'Grok'"
17
- end
@@ -1,19 +0,0 @@
1
- # encoding: utf-8
2
- #
3
- # This demonstrates that Prawn can modify page size, margins and layout for
4
- # each individual page, via Document#start_new_page()
5
- #
6
- require File.expand_path(File.join(File.dirname(__FILE__),
7
- %w[.. example_helper]))
8
-
9
- Prawn::Document.generate("multi-layout.pdf", :page_layout => :landscape) do |pdf|
10
- pdf.text "This is on a landscaped page"
11
- pdf.start_new_page(:layout => :portrait)
12
- pdf.text "This is on a portrait page"
13
- pdf.start_new_page(:size => "LEGAL")
14
- pdf.text "This is on legal paper size"
15
- pdf.start_new_page(:left_margin => 150, :right_margin => 150)
16
- pdf.text "This page has very wide left and right margins, causing a squeeze"
17
- pdf.start_new_page(:margin => 300, :right_margin => 0)
18
- pdf.text "This page has even wider margins on all sides except for the right side, where it's 0"
19
- end
@@ -1,67 +0,0 @@
1
- # encoding: utf-8
2
- #
3
- # This example demonstrates the use of the the outlines option for a new document
4
- # it sets an initial outline item with a title
5
- #
6
- require File.expand_path(File.join(File.dirname(__FILE__),
7
- %w[.. example_helper]))
8
-
9
- Prawn::Document.generate('outlines.pdf') do
10
- text "Page 1. This is the first Chapter. "
11
- start_new_page
12
- text "Page 2. More in the first Chapter. "
13
- start_new_page
14
- text "Page 3. This is the second Chapter. It has a subsection. "
15
- start_new_page
16
- text "Page 4. More in the second Chapter. "
17
- outline.section 'Preface' do
18
- outline.page :title => 'Preface'
19
- end
20
- outline.define do
21
- section 'Chapter 1', :destination => 1, :closed => true do
22
- page :destination => 1, :title => 'Page 1'
23
- page :destination => 2, :title => 'Page 2'
24
- end
25
- section 'Chapter 2', :destination => 3 do
26
- section 'Chapter 2 Subsection' do
27
- page :title => 'Page 3'
28
- end
29
- page :destination => 4, :title => 'Page 4'
30
- end
31
- end
32
- start_new_page
33
- text "Page 5. Appendix"
34
- start_new_page
35
- text "Page 6. More in the Appendix"
36
- outline.section 'Appendix', :destination => 5 do
37
- outline.page :destination => 5, :title => 'Page 5'
38
- outline.page :destination => 6, :title => 'Page 6'
39
- end
40
- go_to_page 4
41
- start_new_page
42
- text "inserted before the Appendix"
43
- outline.update do
44
- insert_section_after 'Chapter 2' do
45
- page :destination => page_number, :title => "Pre-Appendix"
46
- end
47
- end
48
- go_to_page 7
49
- start_new_page
50
- text "One last page"
51
- outline.insert_section_after 'Page 6' do
52
- outline.page :destination => page_number, :title => "Inserted after 6"
53
- end
54
- outline.add_subsection_to 'Chapter 1', :first do
55
- outline.section 'Inserted subsection', :destination => 1 do
56
- outline.page :destination => 1, :title => "Page 1 again"
57
- end
58
- end
59
- start_new_page
60
- text "Really this is the last page."
61
- outline.update do
62
- page :destination => page_number, :title => "Last Page"
63
- end
64
- start_new_page
65
- text "OK, I lied; this is the very last page."
66
- outline.page :destination => page_number, :title => "Very Last Page"
67
- end
@@ -1,32 +0,0 @@
1
- # encoding: utf-8
2
- #
3
- # This demonstrates basic page layout and landscape options for Prawn
4
- # documents. The style used here is a bit out of date, see
5
- # multi_page_layout.rb for a more modern example.
6
- #
7
- require File.expand_path(File.join(File.dirname(__FILE__),
8
- %w[.. example_helper]))
9
-
10
- def pdf(*options)
11
- Prawn::Document.new(*options)
12
- end
13
-
14
- # defaults to portrait and US letter
15
- portrait_letter = pdf
16
- portrait_letter.render_file "portrait_letter.pdf"
17
-
18
- landscape_letter = pdf(:page_layout => :landscape)
19
- landscape_letter.render_file "landscape_letter.pdf"
20
-
21
- portrait_legal = pdf(:page_size => "LEGAL")
22
- portrait_legal.render_file "portrait_legal.pdf"
23
-
24
- landscape_legal = pdf(:page_size => "LEGAL", :page_layout => :landscape)
25
- landscape_legal.render_file "landscape_legal.pdf"
26
-
27
- portrait_a4 = pdf(:page_size => "A4")
28
- portrait_a4.render_file "portrait_a4.pdf"
29
-
30
- landscape_a4 = pdf(:page_size => "A4", :page_layout => :landscape)
31
- landscape_a4.render_file("landscape_a4.pdf")
32
-
@@ -1,40 +0,0 @@
1
- # encoding: utf-8
2
- #
3
- # This example demonstrates how to add a "page k of n"
4
- # template to your documents.
5
- #
6
- require File.expand_path(File.join(File.dirname(__FILE__),
7
- %w[.. example_helper]))
8
-
9
- Prawn::Document.generate("page_with_numbering.pdf") do
10
- text "Hai"
11
- start_new_page
12
- text "bai"
13
- start_new_page
14
- text "-- Hai again"
15
- number_pages "<page> in a total of <total>", :at => [bounds.right - 100, 20],
16
- :width => 150,
17
- :page_filter => :all
18
- end
19
-
20
- Prawn::Document.generate("page_with_numbering_extra_options.pdf") do
21
- text "Hai"
22
- start_new_page :layout => :landscape
23
- text "bai"
24
- start_new_page :layout => :portrait
25
- text "-- Hai again"
26
- number_pages "<page> in a total of <total>", :at => [bounds.right - 150, 20],
27
- :width => 150,
28
- :align => :right,
29
- :page_filter => :odd,
30
- :start_count_at => 12,
31
- :total_pages => 15
32
-
33
- number_pages "<page> in a total of <total>", :at => [bounds.left + 50, 20],
34
- :width => 150,
35
- :align => :left,
36
- :page_filter => :even,
37
- :start_count_at => 13,
38
- :total_pages => 15,
39
- :color => "FF0000"
40
- end
@@ -1,20 +0,0 @@
1
- # encoding: utf-8
2
- #
3
- # This sample demonstrates the use of the :template option when using #start_new_page to add a
4
- # new page. Only one page of the template is currently imported for the template and which page of
5
- # the pdf template is used can be specified with the :template_page option which defaults to 1.
6
-
7
- require File.expand_path(File.join(File.dirname(__FILE__),
8
- %w[.. example_helper]))
9
-
10
- filename = "#{Prawn::BASEDIR}/data/pdfs/multipage_template.pdf"
11
-
12
- Prawn::Document.generate("page_template.pdf") do
13
- text "This is the first page and content is brand new", :size => 18, :align => :center
14
- start_new_page(:template => filename, :template_page => 2)
15
- move_down 20
16
- text "Here is some content that has been added to the page template", :size => 18, :align => :center
17
- start_new_page(:template => filename, :template_page => 3)
18
- move_down 20
19
- text "Here is content that has been added to page 3 of the template", :size => 18, :align => :center
20
- end
@@ -1,48 +0,0 @@
1
- # encoding: utf-8
2
- #
3
- # This example demonstrates how to make use of Prawn's repeating element
4
- # support. Note that all repeated elements are generated using XObjects, so
5
- # they should be pretty efficient.
6
- #
7
- #
8
- require File.expand_path(File.join(File.dirname(__FILE__),
9
- %w[.. example_helper]))
10
-
11
- Prawn::Document.generate("repeat.pdf", :skip_page_creation => true) do
12
-
13
- repeat :all do
14
- draw_text "ALLLLLL", :at => bounds.top_left
15
- end
16
-
17
- repeat :odd do
18
- draw_text "ODD", :at => [0,0]
19
- end
20
-
21
- repeat :even do
22
- draw_text "EVEN", :at => [0,0]
23
- end
24
-
25
- repeat [1,2] do
26
- draw_text "[1,2]", :at => [100,0]
27
- end
28
-
29
- repeat 2..4 do
30
- draw_text "2..4", :at => [200,0]
31
- end
32
-
33
- repeat(lambda { |pg| pg % 3 == 0 }) do
34
- draw_text "Every third", :at => [250, 20]
35
- end
36
-
37
- repeat(:all, :dynamic => true) do
38
- draw_text page_number, :at => [500, 0]
39
- end
40
-
41
- 10.times do
42
- start_new_page
43
- draw_text "A wonderful page", :at => [400,400]
44
- end
45
-
46
- end
47
-
48
-
@@ -1,42 +0,0 @@
1
- # encoding: utf-8
2
- #
3
- # Demonstrate use of stamps
4
- #
5
- require File.expand_path(File.join(File.dirname(__FILE__),
6
- %w[.. example_helper]))
7
-
8
- Prawn::Document.generate("stamp.pdf", :skip_page_creation => true) do
9
-
10
- create_stamp("odd_page_template") do
11
- draw_text "This is the odd page template",
12
- :at => [0, bounds.top - font.height]
13
- draw_text "This is also in the odd page template", :at => [0, 0]
14
- end
15
-
16
- create_stamp("even_page_template") do
17
- draw_text "This is the even page template",
18
- :at => [0, bounds.top - font.height]
19
- draw_text "This is also in the even page template", :at => [0, 0]
20
- end
21
-
22
- start_new_page
23
- stamp("odd_page_template")
24
-
25
- create_stamp("MyStamp") do
26
- fill_color("ff0000")
27
- fill_circle([0, 0], 20)
28
- fill_color("000000")
29
- fill_circle([10, 10], 20)
30
- end
31
-
32
- 10.times do |i|
33
- 10.times do |j|
34
- stamp_at("MyStamp", [100 + j * 50, bounds.top - 100 - i * 50])
35
- end
36
- end
37
-
38
- 4.times do |i|
39
- start_new_page
40
- stamp("#{i % 2 == 0 ? 'even' : 'odd'}_page_template")
41
- end
42
- end
@@ -1,14 +0,0 @@
1
- # encoding: utf-8
2
- #
3
- # This sample demonstrates the use of the :template option when generating
4
- # a new Document. The template PDF file is imported into a new document.
5
-
6
- require File.expand_path(File.join(File.dirname(__FILE__),
7
- %w[.. example_helper]))
8
-
9
- filename = "#{Prawn::BASEDIR}/reference_pdfs/curves.pdf"
10
-
11
- Prawn::Document.generate("template.pdf", :template => filename) do
12
- text "Previous pages and content imported", :size => 18, :align => :center
13
- text "This page and content is brand new", :size => 18, :align => :center
14
- end
@@ -1,24 +0,0 @@
1
- # encoding: utf-8
2
- #
3
- # Demonstrates basic image embedding and positioning functionality.
4
- # For positioning images alongside flowing text, see the image_flow.rb
5
- # example.
6
- #
7
- require File.expand_path(File.join(File.dirname(__FILE__),
8
- %w[.. example_helper]))
9
-
10
- Prawn::Document.generate("basic_images.pdf", :page_layout => :landscape) do
11
- stef = "#{Prawn::BASEDIR}/data/images/stef.jpg"
12
- image stef, :at => [75, 75]
13
-
14
- stef = "#{Prawn::BASEDIR}/data/images/stef.jpg"
15
- image stef, :at => [500, 400], :width => 200, :height => 200
16
-
17
- draw_text "Please enjoy the pigs", :size => 36, :at => [200,15]
18
-
19
- ruport = "#{Prawn::BASEDIR}/data/images/ruport.png"
20
- image ruport, :at => [400,200], :width => 150
21
-
22
- ruport = "#{Prawn::BASEDIR}/data/images/ruport_transparent.png"
23
- image ruport, :at => [50,525]
24
- end
@@ -1,12 +0,0 @@
1
- # encoding: utf-8
2
- #
3
- # Demonstrates simple curve and circle usage
4
- #
5
- require File.expand_path(File.join(File.dirname(__FILE__),
6
- %w[.. example_helper]))
7
-
8
- pdf = Prawn::Document.new
9
- pdf.move_to [100,100]
10
- pdf.stroke_curve_to [50,50], :bounds => [[60,90], [60, 90]]
11
- pdf.fill_circle [200,200], 10
12
- pdf.render_file "curves.pdf"
@@ -1,14 +0,0 @@
1
- # encoding: utf-8
2
- #
3
- # Draws and fills a Hexagon using Document#polygon
4
- #
5
- require File.expand_path(File.join(File.dirname(__FILE__),
6
- %w[.. example_helper]))
7
-
8
- pdf = Prawn::Document.new
9
-
10
- pdf.fill_color "ff0000"
11
- pdf.fill_polygon [100, 250], [200, 300], [300, 250],
12
- [300, 150], [200, 100], [100, 150]
13
-
14
- pdf.render_file "hexagon.pdf"
@@ -1,16 +0,0 @@
1
- # encoding: utf-8
2
- #
3
- # Demonstrates fitting an image within a rectangular width and height.
4
- # The image will be scaled down to fit within the box, while preserving
5
- # the aspect ratio.
6
- #
7
- require File.expand_path(File.join(File.dirname(__FILE__),
8
- %w[.. example_helper]))
9
-
10
- Prawn::Document.generate("image_fit.pdf", :page_layout => :landscape) do
11
-
12
- pigs = "#{Prawn::BASEDIR}/data/images/pigs.jpg"
13
- stroke_rectangle [50,450], 200, 200
14
- image pigs, :at => [50,450], :fit => [200,200]
15
-
16
- end
@@ -1,38 +0,0 @@
1
- # encoding: utf-8
2
- #
3
- # Demonstrates automated flowing and positioning of images, as well as
4
- # aligining images along the x-axis via the :position argument. This is
5
- # useful when used in combination with flowing text, where the exact final
6
- # position of the image is not known ahead of time.
7
- #
8
- require File.expand_path(File.join(File.dirname(__FILE__),
9
- %w[.. example_helper]))
10
-
11
- Prawn::Document.generate("image-flow.pdf", :page_layout => :landscape) do
12
- self.font_size = 8
13
- stef = "#{Prawn::BASEDIR}/data/images/stef.jpg"
14
-
15
- text "Image at default position with no arguments"
16
-
17
- move_down 10
18
-
19
- image stef
20
-
21
- text "Centered image flowing"
22
-
23
- image stef, :position => :center
24
-
25
- text "Right aligned image flowing"
26
-
27
- image stef, :position => :right
28
-
29
- text "Explicitly left aligned image flowing"
30
-
31
- move_down 10
32
-
33
- image stef, :position => :left
34
-
35
- text "Flowing image at x=50"
36
-
37
- image stef, :position => 50
38
- end
@@ -1,18 +0,0 @@
1
- # encoding: utf-8
2
- #
3
- # Demonstrates vertical and horizontal positioning of images.
4
- #
5
- require File.expand_path(File.join(File.dirname(__FILE__),
6
- %w[.. example_helper]))
7
-
8
- Prawn::Document.generate("image_position.pdf", :page_layout => :landscape) do
9
-
10
- dice = "#{Prawn::BASEDIR}/data/images/dice.png"
11
-
12
- image dice, :scale => 0.2, :position => :left, :vposition => :top
13
- image dice, :scale => 0.2, :position => :right, :vposition => :top
14
- image dice, :scale => 0.2, :position => :center, :vposition => :top
15
- image dice, :scale => 0.2, :position => :center, :vposition => :center
16
- image dice, :scale => 0.2, :position => :center, :vposition => :bottom
17
-
18
- end
@@ -1,33 +0,0 @@
1
- # encoding: utf-8
2
- #
3
- # The very first Prawn example. Here for nostalgia's sake.
4
- #
5
- require File.expand_path(File.join(File.dirname(__FILE__),
6
- %w[.. example_helper]))
7
-
8
- pdf = Prawn::Document.new
9
- pdf.line_width = 10
10
-
11
- [[100,741,100,641],
12
- [100,691,150,691],
13
- [150,741,150,641],
14
- [200,741,200,641],
15
- [100,600,100,500],
16
- [100,600,150,550],
17
- [100,550,150,550],
18
- [175,600,175,500],
19
- [175,600,225,550],
20
- [175,550,225,550],
21
- [175,550,225,500],
22
- [275,600,250,500],
23
- [275,600,300,500],
24
- [250,550,300,550],
25
- [315,600,350,500],
26
- [350,500,365,550],
27
- [365,550,380,500],
28
- [380,500,415,600],
29
- [430,600,430,500],
30
- [430,600,465,500],
31
- [465,600,465,500]].each { |points| pdf.stroke_line(*points) }
32
-
33
- pdf.render_file "lines.pdf"