davebenvenuti-prawn 0.11.1.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +340 -0
- data/HACKING +50 -0
- data/LICENSE +56 -0
- data/README +141 -0
- data/Rakefile +52 -0
- data/data/encodings/win_ansi.txt +29 -0
- data/data/fonts/Action Man.dfont +0 -0
- data/data/fonts/Activa.ttf +0 -0
- data/data/fonts/Chalkboard.ttf +0 -0
- data/data/fonts/Courier-Bold.afm +342 -0
- data/data/fonts/Courier-BoldOblique.afm +342 -0
- data/data/fonts/Courier-Oblique.afm +342 -0
- data/data/fonts/Courier.afm +342 -0
- data/data/fonts/DejaVuSans.ttf +0 -0
- data/data/fonts/Dustismo_Roman.ttf +0 -0
- data/data/fonts/Helvetica-Bold.afm +2827 -0
- data/data/fonts/Helvetica-BoldOblique.afm +2827 -0
- data/data/fonts/Helvetica-Oblique.afm +3051 -0
- data/data/fonts/Helvetica.afm +3051 -0
- data/data/fonts/MustRead.html +19 -0
- data/data/fonts/Symbol.afm +213 -0
- data/data/fonts/Times-Bold.afm +2588 -0
- data/data/fonts/Times-BoldItalic.afm +2384 -0
- data/data/fonts/Times-Italic.afm +2667 -0
- data/data/fonts/Times-Roman.afm +2419 -0
- data/data/fonts/ZapfDingbats.afm +225 -0
- data/data/fonts/comicsans.ttf +0 -0
- data/data/fonts/gkai00mp.ttf +0 -0
- data/data/images/16bit.alpha +0 -0
- data/data/images/16bit.dat +0 -0
- data/data/images/16bit.png +0 -0
- data/data/images/arrow.png +0 -0
- data/data/images/arrow2.png +0 -0
- data/data/images/barcode_issue.png +0 -0
- data/data/images/dice.alpha +0 -0
- data/data/images/dice.dat +0 -0
- data/data/images/dice.png +0 -0
- data/data/images/dice_interlaced.png +0 -0
- data/data/images/fractal.jpg +0 -0
- data/data/images/letterhead.jpg +0 -0
- data/data/images/page_white_text.alpha +0 -0
- data/data/images/page_white_text.dat +0 -0
- data/data/images/page_white_text.png +0 -0
- data/data/images/pigs.jpg +0 -0
- data/data/images/rails.dat +0 -0
- data/data/images/rails.png +0 -0
- data/data/images/ruport.png +0 -0
- data/data/images/ruport_data.dat +0 -0
- data/data/images/ruport_transparent.png +0 -0
- data/data/images/ruport_type0.png +0 -0
- data/data/images/stef.jpg +0 -0
- data/data/images/tru256.bmp +0 -0
- data/data/images/web-links.dat +1 -0
- data/data/images/web-links.png +0 -0
- data/data/pdfs/complex_template.pdf +0 -0
- data/data/pdfs/contains_ttf_font.pdf +0 -0
- data/data/pdfs/encrypted.pdf +0 -0
- data/data/pdfs/hexagon.pdf +61 -0
- data/data/pdfs/indirect_reference.pdf +86 -0
- data/data/pdfs/nested_pages.pdf +118 -0
- data/data/pdfs/page_without_mediabox.pdf +193 -0
- data/data/pdfs/resources_as_indirect_object.pdf +83 -0
- data/data/pdfs/two_hexagons.pdf +90 -0
- data/data/pdfs/version_1_6.pdf +61 -0
- data/data/shift_jis_text.txt +1 -0
- data/examples/bounding_box/bounding_boxes.rb +44 -0
- data/examples/bounding_box/indentation.rb +35 -0
- data/examples/bounding_box/russian_boxes.rb +37 -0
- data/examples/bounding_box/stretched_nesting.rb +68 -0
- data/examples/example_helper.rb +8 -0
- data/examples/general/background.rb +24 -0
- data/examples/general/canvas.rb +16 -0
- data/examples/general/context_sensitive_headers.rb +38 -0
- data/examples/general/float.rb +12 -0
- data/examples/general/margin.rb +37 -0
- data/examples/general/measurement_units.rb +52 -0
- data/examples/general/metadata-info.rb +17 -0
- data/examples/general/multi_page_layout.rb +19 -0
- data/examples/general/outlines.rb +67 -0
- data/examples/general/page_geometry.rb +32 -0
- data/examples/general/page_numbering.rb +16 -0
- data/examples/general/repeaters.rb +48 -0
- data/examples/general/stamp.rb +42 -0
- data/examples/general/templates.rb +14 -0
- data/examples/graphics/basic_images.rb +24 -0
- data/examples/graphics/cmyk.rb +13 -0
- data/examples/graphics/curves.rb +12 -0
- data/examples/graphics/hexagon.rb +14 -0
- data/examples/graphics/image_fit.rb +16 -0
- data/examples/graphics/image_flow.rb +38 -0
- data/examples/graphics/image_position.rb +18 -0
- data/examples/graphics/line.rb +33 -0
- data/examples/graphics/png_types.rb +23 -0
- data/examples/graphics/polygons.rb +17 -0
- data/examples/graphics/remote_images.rb +13 -0
- data/examples/graphics/rounded_polygons.rb +20 -0
- data/examples/graphics/rounded_rectangle.rb +21 -0
- data/examples/graphics/ruport_style_helpers.rb +20 -0
- data/examples/graphics/stroke_bounds.rb +21 -0
- data/examples/graphics/stroke_cap_and_join.rb +46 -0
- data/examples/graphics/stroke_dash.rb +43 -0
- data/examples/graphics/transformations.rb +53 -0
- data/examples/graphics/transparency.rb +27 -0
- data/examples/grid/bounding_boxes.rb +22 -0
- data/examples/grid/column_gutter_grid.rb +21 -0
- data/examples/grid/multi_boxes.rb +52 -0
- data/examples/grid/show_grid.rb +14 -0
- data/examples/grid/simple_grid.rb +21 -0
- data/examples/m17n/chinese_text_wrapping.rb +18 -0
- data/examples/m17n/euro.rb +16 -0
- data/examples/m17n/sjis.rb +29 -0
- data/examples/m17n/utf8.rb +14 -0
- data/examples/m17n/win_ansi_charset.rb +55 -0
- data/examples/security/hello_foo.rb +9 -0
- data/examples/table/bill.rb +54 -0
- data/examples/table/cell.rb +13 -0
- data/examples/table/checkerboard.rb +23 -0
- data/examples/table/header.rb +15 -0
- data/examples/table/inline_format_table.rb +13 -0
- data/examples/table/multi_page_table.rb +10 -0
- data/examples/table/simple_table.rb +25 -0
- data/examples/table/subtable.rb +13 -0
- data/examples/table/widths.rb +21 -0
- data/examples/text/alignment.rb +19 -0
- data/examples/text/character_spacing.rb +13 -0
- data/examples/text/dfont.rb +49 -0
- data/examples/text/family_based_styling.rb +25 -0
- data/examples/text/font_calculations.rb +92 -0
- data/examples/text/font_size.rb +34 -0
- data/examples/text/hyphenation.rb +46 -0
- data/examples/text/indent_paragraphs.rb +23 -0
- data/examples/text/inline_format.rb +104 -0
- data/examples/text/kerning.rb +31 -0
- data/examples/text/rotated.rb +99 -0
- data/examples/text/shaped_text_box.rb +32 -0
- data/examples/text/simple_text.rb +18 -0
- data/examples/text/simple_text_ttf.rb +18 -0
- data/examples/text/span.rb +30 -0
- data/examples/text/text_box.rb +89 -0
- data/examples/text/text_box_returning_excess.rb +52 -0
- data/examples/text/text_flow.rb +68 -0
- data/lib/prawn.rb +26 -0
- data/lib/prawn/compatibility.rb +51 -0
- data/lib/prawn/core.rb +85 -0
- data/lib/prawn/core/annotations.rb +61 -0
- data/lib/prawn/core/byte_string.rb +9 -0
- data/lib/prawn/core/destinations.rb +90 -0
- data/lib/prawn/core/document_state.rb +78 -0
- data/lib/prawn/core/literal_string.rb +16 -0
- data/lib/prawn/core/name_tree.rb +165 -0
- data/lib/prawn/core/object_store.rb +236 -0
- data/lib/prawn/core/page.rb +199 -0
- data/lib/prawn/core/pdf_object.rb +108 -0
- data/lib/prawn/core/reference.rb +112 -0
- data/lib/prawn/core/text.rb +140 -0
- data/lib/prawn/core/text/formatted/arranger.rb +266 -0
- data/lib/prawn/core/text/formatted/line_wrap.rb +127 -0
- data/lib/prawn/core/text/formatted/wrap.rb +112 -0
- data/lib/prawn/core/text/line_wrap.rb +211 -0
- data/lib/prawn/core/text/wrap.rb +82 -0
- data/lib/prawn/document.rb +575 -0
- data/lib/prawn/document/bounding_box.rb +428 -0
- data/lib/prawn/document/graphics_state.rb +48 -0
- data/lib/prawn/document/internals.rb +170 -0
- data/lib/prawn/document/page_geometry.rb +136 -0
- data/lib/prawn/document/snapshot.rb +87 -0
- data/lib/prawn/document/span.rb +55 -0
- data/lib/prawn/encoding.rb +121 -0
- data/lib/prawn/errors.rb +86 -0
- data/lib/prawn/font.rb +368 -0
- data/lib/prawn/font/afm.rb +225 -0
- data/lib/prawn/font/dfont.rb +42 -0
- data/lib/prawn/font/ttf.rb +350 -0
- data/lib/prawn/graphics.rb +325 -0
- data/lib/prawn/graphics/cap_style.rb +38 -0
- data/lib/prawn/graphics/color.rb +205 -0
- data/lib/prawn/graphics/dash.rb +71 -0
- data/lib/prawn/graphics/join_style.rb +38 -0
- data/lib/prawn/graphics/transformation.rb +156 -0
- data/lib/prawn/graphics/transparency.rb +99 -0
- data/lib/prawn/images.rb +217 -0
- data/lib/prawn/images/jpg.rb +85 -0
- data/lib/prawn/images/png.rb +356 -0
- data/lib/prawn/layout.rb +20 -0
- data/lib/prawn/layout/grid.rb +259 -0
- data/lib/prawn/measurement_extensions.rb +46 -0
- data/lib/prawn/measurements.rb +71 -0
- data/lib/prawn/outline.rb +326 -0
- data/lib/prawn/repeater.rb +129 -0
- data/lib/prawn/security.rb +262 -0
- data/lib/prawn/security/arcfour.rb +51 -0
- data/lib/prawn/stamp.rb +126 -0
- data/lib/prawn/table.rb +451 -0
- data/lib/prawn/table/cell.rb +395 -0
- data/lib/prawn/table/cell/in_table.rb +27 -0
- data/lib/prawn/table/cell/subtable.rb +65 -0
- data/lib/prawn/table/cell/text.rb +135 -0
- data/lib/prawn/table/cells.rb +206 -0
- data/lib/prawn/text.rb +449 -0
- data/lib/prawn/text/box.rb +397 -0
- data/lib/prawn/text/formatted.rb +4 -0
- data/lib/prawn/text/formatted/box.rb +222 -0
- data/lib/prawn/text/formatted/fragment.rb +181 -0
- data/lib/prawn/text/formatted/parser.rb +213 -0
- data/prawn.gemspec +28 -0
- data/spec/annotations_spec.rb +90 -0
- data/spec/bounding_box_spec.rb +190 -0
- data/spec/cell_spec.rb +430 -0
- data/spec/destinations_spec.rb +15 -0
- data/spec/document_spec.rb +476 -0
- data/spec/extensions/mocha.rb +32 -0
- data/spec/font_spec.rb +324 -0
- data/spec/formatted_text_arranger_spec.rb +426 -0
- data/spec/formatted_text_box_spec.rb +756 -0
- data/spec/formatted_text_fragment_spec.rb +211 -0
- data/spec/graphics_spec.rb +446 -0
- data/spec/grid_spec.rb +85 -0
- data/spec/images_spec.rb +119 -0
- data/spec/inline_formatted_text_parser_spec.rb +502 -0
- data/spec/jpg_spec.rb +25 -0
- data/spec/line_wrap_spec.rb +341 -0
- data/spec/measurement_units_spec.rb +23 -0
- data/spec/name_tree_spec.rb +112 -0
- data/spec/object_store_spec.rb +160 -0
- data/spec/outline_spec.rb +404 -0
- data/spec/pdf_object_spec.rb +170 -0
- data/spec/png_spec.rb +237 -0
- data/spec/reference_spec.rb +82 -0
- data/spec/repeater_spec.rb +96 -0
- data/spec/security_spec.rb +120 -0
- data/spec/snapshot_spec.rb +154 -0
- data/spec/span_spec.rb +49 -0
- data/spec/spec_helper.rb +34 -0
- data/spec/stamp_spec.rb +108 -0
- data/spec/stroke_styles_spec.rb +163 -0
- data/spec/table_spec.rb +687 -0
- data/spec/template_spec.rb +165 -0
- data/spec/text_at_spec.rb +125 -0
- data/spec/text_box_spec.rb +777 -0
- data/spec/text_spacing_spec.rb +75 -0
- data/spec/text_spec.rb +349 -0
- data/spec/text_with_inline_formatting_spec.rb +193 -0
- data/spec/transparency_spec.rb +89 -0
- data/vendor/pdf-inspector/README +18 -0
- data/vendor/pdf-inspector/lib/pdf/inspector.rb +26 -0
- data/vendor/pdf-inspector/lib/pdf/inspector/extgstate.rb +18 -0
- data/vendor/pdf-inspector/lib/pdf/inspector/graphics.rb +131 -0
- data/vendor/pdf-inspector/lib/pdf/inspector/page.rb +25 -0
- data/vendor/pdf-inspector/lib/pdf/inspector/text.rb +46 -0
- data/vendor/pdf-inspector/lib/pdf/inspector/xobject.rb +19 -0
- data/vendor/ttfunk/data/fonts/DejaVuSans.ttf +0 -0
- data/vendor/ttfunk/data/fonts/comicsans.ttf +0 -0
- data/vendor/ttfunk/example.rb +45 -0
- data/vendor/ttfunk/lib/ttfunk.rb +102 -0
- data/vendor/ttfunk/lib/ttfunk/directory.rb +17 -0
- data/vendor/ttfunk/lib/ttfunk/encoding/mac_roman.rb +88 -0
- data/vendor/ttfunk/lib/ttfunk/encoding/windows_1252.rb +69 -0
- data/vendor/ttfunk/lib/ttfunk/reader.rb +44 -0
- data/vendor/ttfunk/lib/ttfunk/resource_file.rb +78 -0
- data/vendor/ttfunk/lib/ttfunk/subset.rb +18 -0
- data/vendor/ttfunk/lib/ttfunk/subset/base.rb +141 -0
- data/vendor/ttfunk/lib/ttfunk/subset/mac_roman.rb +50 -0
- data/vendor/ttfunk/lib/ttfunk/subset/unicode.rb +48 -0
- data/vendor/ttfunk/lib/ttfunk/subset/unicode_8bit.rb +63 -0
- data/vendor/ttfunk/lib/ttfunk/subset/windows_1252.rb +55 -0
- data/vendor/ttfunk/lib/ttfunk/subset_collection.rb +72 -0
- data/vendor/ttfunk/lib/ttfunk/table.rb +46 -0
- data/vendor/ttfunk/lib/ttfunk/table/cmap.rb +34 -0
- data/vendor/ttfunk/lib/ttfunk/table/cmap/format00.rb +54 -0
- data/vendor/ttfunk/lib/ttfunk/table/cmap/format04.rb +126 -0
- data/vendor/ttfunk/lib/ttfunk/table/cmap/subtable.rb +79 -0
- data/vendor/ttfunk/lib/ttfunk/table/glyf.rb +64 -0
- data/vendor/ttfunk/lib/ttfunk/table/glyf/compound.rb +81 -0
- data/vendor/ttfunk/lib/ttfunk/table/glyf/simple.rb +37 -0
- data/vendor/ttfunk/lib/ttfunk/table/head.rb +44 -0
- data/vendor/ttfunk/lib/ttfunk/table/hhea.rb +41 -0
- data/vendor/ttfunk/lib/ttfunk/table/hmtx.rb +47 -0
- data/vendor/ttfunk/lib/ttfunk/table/kern.rb +79 -0
- data/vendor/ttfunk/lib/ttfunk/table/kern/format0.rb +62 -0
- data/vendor/ttfunk/lib/ttfunk/table/loca.rb +43 -0
- data/vendor/ttfunk/lib/ttfunk/table/maxp.rb +40 -0
- data/vendor/ttfunk/lib/ttfunk/table/name.rb +125 -0
- data/vendor/ttfunk/lib/ttfunk/table/os2.rb +78 -0
- data/vendor/ttfunk/lib/ttfunk/table/post.rb +91 -0
- data/vendor/ttfunk/lib/ttfunk/table/post/format10.rb +43 -0
- data/vendor/ttfunk/lib/ttfunk/table/post/format20.rb +35 -0
- data/vendor/ttfunk/lib/ttfunk/table/post/format25.rb +23 -0
- data/vendor/ttfunk/lib/ttfunk/table/post/format30.rb +17 -0
- data/vendor/ttfunk/lib/ttfunk/table/post/format40.rb +17 -0
- data/vendor/ttfunk/lib/ttfunk/table/simple.rb +14 -0
- metadata +379 -0
@@ -0,0 +1,52 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# A text box is positioned by a top-left corner, width, and height and is
|
4
|
+
# essentially an invisible rectangle that the text will flow within. If the
|
5
|
+
# text exceeds the boundaries, it is either truncated, replaced with some
|
6
|
+
# ellipses, or set to expand beyond the bottom boundary.
|
7
|
+
#
|
8
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
9
|
+
%w[.. example_helper]))
|
10
|
+
|
11
|
+
Prawn::Document.generate("text_box_returning_excess.pdf") do
|
12
|
+
|
13
|
+
# Note that without the initial space in p_break, newlines may be eaten by
|
14
|
+
# the wrap/unwrap process that happens inside the text box.
|
15
|
+
p_break = " \n\n"
|
16
|
+
callout = "Lorem ipsum dolor sit amet"
|
17
|
+
lorem = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.#{p_break}Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.#{p_break}Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
|
18
|
+
|
19
|
+
box_height = font.height * 5
|
20
|
+
|
21
|
+
# Add a callout box that the rest of the text should flow around
|
22
|
+
font_size(18) do
|
23
|
+
text_box callout, {
|
24
|
+
:width => 100,
|
25
|
+
:height => font.height * 3,
|
26
|
+
:overflow => :truncate,
|
27
|
+
:at => [100, bounds.top - box_height - 4]
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
excess_text = text_box lorem + p_break + lorem, {
|
32
|
+
:width => 300,
|
33
|
+
:height => box_height,
|
34
|
+
:overflow => :truncate,
|
35
|
+
:at => [100, bounds.top],
|
36
|
+
}
|
37
|
+
|
38
|
+
excess_text = text_box excess_text, {
|
39
|
+
:width => 200,
|
40
|
+
:height => box_height,
|
41
|
+
:overflow => :truncate,
|
42
|
+
:at => [200, bounds.top - box_height],
|
43
|
+
}
|
44
|
+
|
45
|
+
text_box excess_text, {
|
46
|
+
:width => 300,
|
47
|
+
:height => box_height,
|
48
|
+
:overflow => :expand,
|
49
|
+
:at => [100, bounds.top - box_height * 2],
|
50
|
+
}
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# Basic text flowing example including the use of bounding boxes. A somewhat
|
4
|
+
# old example, mostly retained for nostalgia.
|
5
|
+
#
|
6
|
+
require File.expand_path(File.join(File.dirname(__FILE__),
|
7
|
+
%w[.. example_helper]))
|
8
|
+
|
9
|
+
content = <<-EOS
|
10
|
+
How does
|
11
|
+
Prawn deal with
|
12
|
+
white
|
13
|
+
space
|
14
|
+
|
15
|
+
and
|
16
|
+
|
17
|
+
line
|
18
|
+
breaks?
|
19
|
+
EOS
|
20
|
+
|
21
|
+
poem = <<-EOS
|
22
|
+
GOOD-BYE
|
23
|
+
|
24
|
+
Good-bye, proud world! I'm going home: Thou art not my friend, and I'm not thine. Long through thy weary crowds I roam; A river-ark on the ocean brine, Long I've been tossed like the driven foam: But now, proud world! I'm going home.
|
25
|
+
|
26
|
+
Good-bye to Flattery's fawning face; To Grandeur with his wise grimace; To upstart Wealth's averted eye; To supple Office, low and high; To crowded halls, to court and street; To frozen hearts and hasting feet; To those who go, and those who come; Good-bye, proud world! I'm going home.
|
27
|
+
|
28
|
+
I am going to my own hearth-stone, Bosomed in yon green hills alone,-- secret nook in a pleasant land, Whose groves the frolic fairies planned; Where arches green, the livelong day, Echo the blackbird's roundelay, And vulgar feet have never trod A spot that is sacred to thought and God.
|
29
|
+
|
30
|
+
O, when I am safe in my sylvan home, I tread on the pride of Greece and Rome; And when I am stretched beneath the pines, Where the evening star so holy shines, I laugh at the lore and the pride of man, At the sophist schools and the learned clan; For what are they all, in their high conceit, When man in the bush with God may meet?
|
31
|
+
EOS
|
32
|
+
|
33
|
+
overflow = "This text should flow gracefully onto the next page, like a stream"+
|
34
|
+
" flows elegantly from a mountain lake down into the village below."
|
35
|
+
|
36
|
+
Prawn::Document.generate("flow.pdf") do |pdf|
|
37
|
+
|
38
|
+
pdf.font "Times-Roman"
|
39
|
+
pdf.stroke_line [pdf.bounds.left, pdf.bounds.top],
|
40
|
+
[pdf.bounds.right, pdf.bounds.top]
|
41
|
+
|
42
|
+
pdf.text content, :size => 10
|
43
|
+
|
44
|
+
pdf.bounding_box([100,600], :width => 200, :height => 525) do
|
45
|
+
pdf.stroke_line [pdf.bounds.left, pdf.bounds.top],
|
46
|
+
[pdf.bounds.right, pdf.bounds.top]
|
47
|
+
pdf.text poem, :size => 12
|
48
|
+
end
|
49
|
+
|
50
|
+
pdf.bounding_box([325,600], :width => 200, :height => 525) do
|
51
|
+
pdf.stroke_line [pdf.bounds.left, pdf.bounds.top],
|
52
|
+
[pdf.bounds.right, pdf.bounds.top]
|
53
|
+
pdf.text poem.reverse, :size => 12
|
54
|
+
end
|
55
|
+
|
56
|
+
pdf.text overflow * 10, :size => 14
|
57
|
+
|
58
|
+
pdf.text "Hooray! We've conquered the evil PDF gods", :size => 36
|
59
|
+
|
60
|
+
pdf.bounding_box([100,450], :width => 300) do
|
61
|
+
pdf.stroke_line [pdf.bounds.left, pdf.bounds.top],
|
62
|
+
[pdf.bounds.right, pdf.bounds.top]
|
63
|
+
pdf.text poem, :size => 10, :leading => 5
|
64
|
+
end
|
65
|
+
|
66
|
+
pdf.text "And this text automatically goes below the poem", :size => 18
|
67
|
+
|
68
|
+
end
|
data/lib/prawn.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# Welcome to Prawn, the best PDF Generation library ever.
|
2
|
+
# This documentation covers user level functionality.
|
3
|
+
#
|
4
|
+
# Those looking to contribute code or write extensions should look
|
5
|
+
# into the lib/prawn/core/* source tree.
|
6
|
+
#
|
7
|
+
module Prawn #:nodoc:
|
8
|
+
VERSION = "0.11.1.pre"
|
9
|
+
end
|
10
|
+
|
11
|
+
require "prawn/core"
|
12
|
+
require "prawn/text"
|
13
|
+
require "prawn/graphics"
|
14
|
+
require "prawn/images"
|
15
|
+
require "prawn/images/jpg"
|
16
|
+
require "prawn/images/png"
|
17
|
+
require "prawn/stamp"
|
18
|
+
require "prawn/security"
|
19
|
+
require "prawn/document"
|
20
|
+
require "prawn/font"
|
21
|
+
require "prawn/encoding"
|
22
|
+
require "prawn/measurements"
|
23
|
+
require "prawn/repeater"
|
24
|
+
require "prawn/outline"
|
25
|
+
require "prawn/layout"
|
26
|
+
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
#
|
3
|
+
# Why would we ever use Ruby 1.8.7 when we can backport with something
|
4
|
+
# as simple as this?
|
5
|
+
#
|
6
|
+
class String #:nodoc:
|
7
|
+
def first_line
|
8
|
+
self.each_line { |line| return line }
|
9
|
+
end
|
10
|
+
unless "".respond_to?(:lines)
|
11
|
+
alias_method :lines, :to_a
|
12
|
+
end
|
13
|
+
unless "".respond_to?(:each_char)
|
14
|
+
def each_char #:nodoc:
|
15
|
+
# copied from jcode
|
16
|
+
if block_given?
|
17
|
+
scan(/./m) { |x| yield x }
|
18
|
+
else
|
19
|
+
scan(/./m)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
unless File.respond_to?(:binread)
|
26
|
+
def File.binread(file) #:nodoc:
|
27
|
+
File.open(file,"rb") { |f| f.read }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
if RUBY_VERSION < "1.9"
|
32
|
+
|
33
|
+
def ruby_18 #:nodoc:
|
34
|
+
yield
|
35
|
+
end
|
36
|
+
|
37
|
+
def ruby_19 #:nodoc:
|
38
|
+
false
|
39
|
+
end
|
40
|
+
|
41
|
+
else
|
42
|
+
|
43
|
+
def ruby_18 #:nodoc:
|
44
|
+
false
|
45
|
+
end
|
46
|
+
|
47
|
+
def ruby_19 #:nodoc:
|
48
|
+
yield
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
data/lib/prawn/core.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# Prawn : A library for PDF generation in Ruby
|
3
|
+
#
|
4
|
+
# Copyright April 2008, Gregory Brown. All Rights Reserved.
|
5
|
+
#
|
6
|
+
# This is free software. Please see the LICENSE and COPYING files for details.
|
7
|
+
|
8
|
+
require "set"
|
9
|
+
|
10
|
+
%w[ttfunk/lib].each do |dep|
|
11
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__) + "/../../vendor/#{dep}")
|
12
|
+
end
|
13
|
+
|
14
|
+
begin
|
15
|
+
require 'ttfunk'
|
16
|
+
rescue LoadError
|
17
|
+
puts "Failed to load ttfunk. If you are running Prawn from git:"
|
18
|
+
puts " git submodule init"
|
19
|
+
puts " git submodule update"
|
20
|
+
exit
|
21
|
+
end
|
22
|
+
|
23
|
+
module Prawn
|
24
|
+
extend self
|
25
|
+
|
26
|
+
file = __FILE__
|
27
|
+
file = File.readlink(file) if File.symlink?(file)
|
28
|
+
dir = File.dirname(file)
|
29
|
+
|
30
|
+
# The base source directory for Prawn as installed on the system
|
31
|
+
#
|
32
|
+
BASEDIR = File.expand_path(File.join(dir, '..', '..'))
|
33
|
+
|
34
|
+
# Whe set to true, Prawn will verify hash options to ensure only valid keys
|
35
|
+
# are used. Off by default.
|
36
|
+
#
|
37
|
+
# Example:
|
38
|
+
# >> Prawn::Document.new(:tomato => "Juicy")
|
39
|
+
# Prawn::Errors::UnknownOption:
|
40
|
+
# Detected unknown option(s): [:tomato]
|
41
|
+
# Accepted options are: [:page_size, :page_layout, :left_margin, ...]
|
42
|
+
#
|
43
|
+
attr_accessor :debug
|
44
|
+
|
45
|
+
def verify_options(accepted, actual) #:nodoc:
|
46
|
+
return unless debug || $DEBUG
|
47
|
+
unless (act=Set[*actual.keys]).subset?(acc=Set[*accepted])
|
48
|
+
raise Prawn::Errors::UnknownOption,
|
49
|
+
"\nDetected unknown option(s): #{(act - acc).to_a.inspect}\n" <<
|
50
|
+
"Accepted options are: #{accepted.inspect}"
|
51
|
+
end
|
52
|
+
yield if block_given?
|
53
|
+
end
|
54
|
+
|
55
|
+
module Configurable #:nodoc:
|
56
|
+
def configuration(*args)
|
57
|
+
@config ||= Marshal.load(Marshal.dump(default_configuration))
|
58
|
+
if Hash === args[0]
|
59
|
+
@config.update(args[0])
|
60
|
+
elsif args.length > 1
|
61
|
+
@config.values_at(*args)
|
62
|
+
elsif args.length == 1
|
63
|
+
@config[args[0]]
|
64
|
+
else
|
65
|
+
@config
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
alias_method :C, :configuration
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
require "prawn/compatibility"
|
74
|
+
require "prawn/errors"
|
75
|
+
require "prawn/core/pdf_object"
|
76
|
+
require "prawn/core/reference"
|
77
|
+
require "prawn/core/page"
|
78
|
+
require "prawn/core/object_store"
|
79
|
+
require "prawn/core/document_state"
|
80
|
+
require "prawn/core/literal_string"
|
81
|
+
require "prawn/core/byte_string"
|
82
|
+
require "prawn/core/name_tree"
|
83
|
+
require "prawn/core/annotations"
|
84
|
+
require "prawn/core/destinations"
|
85
|
+
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# annotations.rb : Implements low-level annotation support for PDF
|
4
|
+
#
|
5
|
+
# Copyright November 2008, Jamis Buck. All Rights Reserved.
|
6
|
+
#
|
7
|
+
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
|
+
#
|
9
|
+
module Prawn
|
10
|
+
module Core
|
11
|
+
|
12
|
+
# Provides very low-level support for annotations.
|
13
|
+
#
|
14
|
+
module Annotations #:nodoc:
|
15
|
+
|
16
|
+
# Adds a new annotation (section 8.4 in PDF spec) to the current page.
|
17
|
+
# +options+ must be a Hash describing the annotation.
|
18
|
+
#
|
19
|
+
def annotate(options)
|
20
|
+
state.page.dictionary.data[:Annots] ||= []
|
21
|
+
options = sanitize_annotation_hash(options)
|
22
|
+
state.page.dictionary.data[:Annots] << ref!(options)
|
23
|
+
return options
|
24
|
+
end
|
25
|
+
|
26
|
+
# A convenience method for creating Text annotations. +rect+ must be an array
|
27
|
+
# of four numbers, describing the bounds of the annotation. +contents+ should
|
28
|
+
# be a string, to be shown when the annotation is activated.
|
29
|
+
#
|
30
|
+
def text_annotation(rect, contents, options={})
|
31
|
+
options = options.merge(:Subtype => :Text, :Rect => rect, :Contents => contents)
|
32
|
+
annotate(options)
|
33
|
+
end
|
34
|
+
|
35
|
+
# A convenience method for creating Link annotations. +rect+ must be an array
|
36
|
+
# of four numbers, describing the bounds of the annotation. The +options+ hash
|
37
|
+
# should include either :Dest (describing the target destination, usually as a
|
38
|
+
# string that has been recorded in the document's Dests tree), or :A (describing
|
39
|
+
# an action to perform on clicking the link), or :PA (for describing a URL to
|
40
|
+
# link to).
|
41
|
+
#
|
42
|
+
def link_annotation(rect, options={})
|
43
|
+
options = options.merge(:Subtype => :Link, :Rect => rect)
|
44
|
+
annotate(options)
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def sanitize_annotation_hash(options)
|
50
|
+
options = options.merge(:Type => :Annot)
|
51
|
+
|
52
|
+
if options[:Dest].is_a?(String)
|
53
|
+
options[:Dest] = Prawn::Core::LiteralString.new(options[:Dest])
|
54
|
+
end
|
55
|
+
|
56
|
+
options
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# prawn/core/destinations.rb : Implements destination support for PDF
|
4
|
+
#
|
5
|
+
# Copyright November 2008, Jamis Buck. All Rights Reserved.
|
6
|
+
#
|
7
|
+
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
|
+
|
9
|
+
module Prawn
|
10
|
+
module Core
|
11
|
+
module Destinations #:nodoc:
|
12
|
+
|
13
|
+
# The maximum number of children to fit into a single node in the Dests tree.
|
14
|
+
NAME_TREE_CHILDREN_LIMIT = 20 #:nodoc:
|
15
|
+
|
16
|
+
# The Dests name tree in the Name dictionary (see Prawn::Document::Internal#names).
|
17
|
+
# This name tree is used to store named destinations (PDF spec 8.2.1).
|
18
|
+
# (For more on name trees, see section 3.8.4 in the PDF spec.)
|
19
|
+
#
|
20
|
+
def dests
|
21
|
+
names.data[:Dests] ||= ref!(Prawn::Core::NameTree::Node.new(self, NAME_TREE_CHILDREN_LIMIT))
|
22
|
+
end
|
23
|
+
|
24
|
+
# Adds a new destination to the dests name tree (see #dests). The
|
25
|
+
# +reference+ parameter will be converted into a Prawn::Reference if
|
26
|
+
# it is not already one.
|
27
|
+
#
|
28
|
+
def add_dest(name, reference)
|
29
|
+
reference = ref!(reference) unless reference.is_a?(Prawn::Core::Reference)
|
30
|
+
dests.data.add(name, reference)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Return a Dest specification for a specific location (and optional zoom
|
34
|
+
# level).
|
35
|
+
#
|
36
|
+
def dest_xyz(left, top, zoom=nil, page=current_page)
|
37
|
+
[page, :XYZ, left, top, zoom]
|
38
|
+
end
|
39
|
+
|
40
|
+
# Return a Dest specification that will fit the given page into the
|
41
|
+
# viewport.
|
42
|
+
#
|
43
|
+
def dest_fit(page=current_page)
|
44
|
+
[page, :Fit]
|
45
|
+
end
|
46
|
+
|
47
|
+
# Return a Dest specification that will fit the given page horizontally
|
48
|
+
# into the viewport, aligned vertically at the given top coordinate.
|
49
|
+
#
|
50
|
+
def dest_fit_horizontally(top, page=current_page)
|
51
|
+
[page, :FitH, top]
|
52
|
+
end
|
53
|
+
|
54
|
+
# Return a Dest specification that will fit the given page vertically
|
55
|
+
# into the viewport, aligned horizontally at the given left coordinate.
|
56
|
+
#
|
57
|
+
def dest_fit_vertically(left, page=current_page)
|
58
|
+
[page, :FitV, left]
|
59
|
+
end
|
60
|
+
|
61
|
+
# Return a Dest specification that will fit the given rectangle into the
|
62
|
+
# viewport, for the given page.
|
63
|
+
#
|
64
|
+
def dest_fit_rect(left, bottom, right, top, page=current_page)
|
65
|
+
[page, :FitR, left, bottom, right, top]
|
66
|
+
end
|
67
|
+
|
68
|
+
# Return a Dest specfication that will fit the given page's bounding box
|
69
|
+
# into the viewport.
|
70
|
+
#
|
71
|
+
def dest_fit_bounds(page=current_page)
|
72
|
+
[page, :FitB]
|
73
|
+
end
|
74
|
+
|
75
|
+
# Same as #dest_fit_horizontally, but works on the page's bounding box
|
76
|
+
# instead of the entire page.
|
77
|
+
#
|
78
|
+
def dest_fit_bounds_horizontally(top, page=current_page)
|
79
|
+
[page, :FitBH, top]
|
80
|
+
end
|
81
|
+
|
82
|
+
# Same as #dest_fit_vertically, but works on the page's bounding box
|
83
|
+
# instead of the entire page.
|
84
|
+
#
|
85
|
+
def dest_fit_bounds_vertically(left, page=current_page)
|
86
|
+
[page, :FitBV, left]
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|