prawn 0.11.1 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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"