prawn 0.13.0 → 2.4.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.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data/.yardopts +10 -0
- data/GPLv2 +20 -21
- data/Gemfile +3 -16
- data/Rakefile +17 -39
- data/lib/prawn/document/bounding_box.rb +85 -42
- data/lib/prawn/document/column_box.rb +21 -11
- data/lib/prawn/document/internals.rb +40 -147
- data/lib/prawn/document/span.rb +25 -17
- data/lib/prawn/document.rb +286 -245
- data/lib/prawn/encoding.rb +68 -101
- data/lib/prawn/errors.rb +47 -43
- data/lib/prawn/font.rb +204 -155
- data/lib/prawn/font_metric_cache.rb +25 -21
- data/lib/prawn/fonts/afm.rb +292 -0
- data/lib/prawn/{font → fonts}/dfont.rb +7 -13
- data/lib/prawn/fonts/otf.rb +11 -0
- data/lib/prawn/fonts/ttc.rb +36 -0
- data/lib/prawn/{font → fonts}/ttf.rb +142 -80
- data/lib/prawn/graphics/blend_mode.rb +65 -0
- data/lib/prawn/graphics/cap_style.rb +6 -5
- data/lib/prawn/graphics/color.rb +47 -44
- data/lib/prawn/graphics/dash.rb +30 -13
- data/lib/prawn/graphics/join_style.rb +13 -6
- data/lib/prawn/graphics/patterns.rb +221 -90
- data/lib/prawn/graphics/transformation.rb +21 -12
- data/lib/prawn/graphics/transparency.rb +21 -17
- data/lib/prawn/graphics.rb +155 -128
- data/lib/prawn/{layout/grid.rb → grid.rb} +110 -47
- data/lib/prawn/image_handler.rb +16 -2
- data/lib/prawn/images/image.rb +4 -2
- data/lib/prawn/images/jpg.rb +39 -30
- data/lib/prawn/images/png.rb +132 -169
- data/lib/prawn/images.rb +70 -62
- data/lib/prawn/measurement_extensions.rb +15 -10
- data/lib/prawn/measurements.rb +22 -23
- data/lib/prawn/outline.rb +301 -13
- data/lib/prawn/repeater.rb +19 -17
- data/lib/prawn/security/arcfour.rb +54 -0
- data/lib/prawn/security.rb +108 -86
- data/lib/prawn/soft_mask.rb +40 -41
- data/lib/prawn/stamp.rb +29 -12
- data/lib/prawn/text/box.rb +27 -29
- data/lib/prawn/text/formatted/arranger.rb +110 -67
- data/lib/prawn/text/formatted/box.rb +233 -165
- data/lib/prawn/text/formatted/fragment.rb +27 -27
- data/lib/prawn/text/formatted/line_wrap.rb +137 -97
- data/lib/prawn/text/formatted/parser.rb +149 -127
- data/lib/prawn/text/formatted/wrap.rb +57 -37
- data/lib/prawn/text/formatted.rb +6 -4
- data/lib/prawn/text.rb +105 -73
- data/lib/prawn/transformation_stack.rb +44 -0
- data/lib/prawn/utilities.rb +11 -21
- data/lib/prawn/version.rb +5 -0
- data/lib/prawn/view.rb +101 -0
- data/lib/prawn.rb +42 -68
- data/{data/images/fractal.jpg → manual/absolute_position.pdf} +0 -0
- data/manual/basic_concepts/adding_pages.rb +9 -10
- data/manual/basic_concepts/basic_concepts.rb +33 -24
- data/manual/basic_concepts/creation.rb +10 -11
- data/manual/basic_concepts/cursor.rb +9 -10
- data/manual/basic_concepts/measurement.rb +10 -11
- data/manual/basic_concepts/origin.rb +8 -9
- data/manual/basic_concepts/other_cursor_helpers.rb +17 -18
- data/manual/basic_concepts/view.rb +48 -0
- data/manual/bounding_box/bounding_box.rb +31 -29
- data/manual/bounding_box/bounds.rb +17 -18
- data/manual/bounding_box/canvas.rb +8 -9
- data/manual/bounding_box/creation.rb +8 -9
- data/manual/bounding_box/indentation.rb +22 -23
- data/manual/bounding_box/nesting.rb +32 -25
- data/manual/bounding_box/russian_boxes.rb +19 -19
- data/manual/bounding_box/stretchy.rb +18 -20
- data/manual/contents.rb +35 -0
- data/manual/cover.rb +43 -0
- data/manual/document_and_page_options/background.rb +16 -14
- data/manual/document_and_page_options/document_and_page_options.rb +26 -23
- data/manual/document_and_page_options/metadata.rb +21 -19
- data/manual/document_and_page_options/page_margins.rb +20 -22
- data/manual/document_and_page_options/page_size.rb +15 -15
- data/manual/document_and_page_options/print_scaling.rb +23 -0
- data/manual/example_helper.rb +5 -408
- data/manual/graphics/blend_mode.rb +52 -0
- data/manual/graphics/circle_and_ellipse.rb +8 -9
- data/manual/graphics/color.rb +11 -13
- data/manual/graphics/common_lines.rb +13 -12
- data/manual/graphics/fill_and_stroke.rb +10 -11
- data/manual/graphics/fill_rules.rb +13 -12
- data/manual/graphics/gradients.rb +28 -22
- data/manual/graphics/graphics.rb +52 -46
- data/manual/graphics/helper.rb +20 -10
- data/manual/graphics/line_width.rb +13 -12
- data/manual/graphics/lines_and_curves.rb +13 -14
- data/manual/graphics/polygon.rb +10 -12
- data/manual/graphics/rectangle.rb +7 -8
- data/manual/graphics/rotate.rb +9 -12
- data/manual/graphics/scale.rb +19 -18
- data/manual/graphics/soft_masks.rb +5 -7
- data/manual/graphics/stroke_cap.rb +10 -11
- data/manual/graphics/stroke_dash.rb +16 -17
- data/manual/graphics/stroke_join.rb +10 -11
- data/manual/graphics/translate.rb +13 -13
- data/manual/graphics/transparency.rb +11 -13
- data/manual/{manual/how_to_read_this_manual.rb → how_to_read_this_manual.rb} +23 -25
- data/manual/images/absolute_position.rb +9 -10
- data/manual/images/fit.rb +9 -10
- data/manual/images/horizontal.rb +13 -14
- data/manual/images/images.rb +31 -30
- data/manual/images/plain_image.rb +6 -7
- data/manual/images/scale.rb +12 -13
- data/manual/images/vertical.rb +19 -17
- data/manual/images/width_and_height.rb +13 -14
- data/manual/layout/boxes.rb +14 -15
- data/manual/layout/content.rb +12 -13
- data/manual/layout/layout.rb +19 -20
- data/manual/layout/simple_grid.rb +8 -9
- data/manual/outline/add_subsection_to.rb +26 -27
- data/manual/outline/insert_section_after.rb +19 -20
- data/manual/outline/outline.rb +23 -22
- data/manual/outline/sections_and_pages.rb +24 -25
- data/manual/repeatable_content/alternate_page_numbering.rb +36 -0
- data/manual/repeatable_content/page_numbering.rb +20 -19
- data/manual/repeatable_content/repeatable_content.rb +26 -22
- data/manual/repeatable_content/repeater.rb +18 -19
- data/manual/repeatable_content/stamp.rb +18 -19
- data/manual/security/encryption.rb +8 -11
- data/manual/security/permissions.rb +20 -15
- data/manual/security/security.rb +20 -20
- data/manual/table.rb +16 -0
- data/manual/text/alignment.rb +17 -18
- data/manual/text/color.rb +13 -13
- data/manual/text/column_box.rb +10 -12
- data/manual/text/fallback_fonts.rb +29 -25
- data/manual/text/font.rb +17 -18
- data/manual/text/font_size.rb +21 -22
- data/manual/text/font_style.rb +12 -10
- data/manual/text/formatted_callbacks.rb +36 -26
- data/manual/text/formatted_text.rb +41 -34
- data/manual/text/free_flowing_text.rb +28 -29
- data/manual/text/inline.rb +23 -26
- data/manual/text/kerning_and_character_spacing.rb +20 -21
- data/manual/text/leading.rb +10 -11
- data/manual/text/line_wrapping.rb +40 -21
- data/manual/text/paragraph_indentation.rb +17 -12
- data/manual/text/positioned_text.rb +19 -20
- data/manual/text/registering_families.rb +33 -30
- data/manual/text/rendering_and_color.rb +11 -12
- data/manual/text/right_to_left_text.rb +31 -20
- data/manual/text/rotation.rb +36 -27
- data/manual/text/single_usage.rb +13 -14
- data/manual/text/text.rb +62 -62
- data/manual/text/text_box_excess.rb +22 -19
- data/manual/text/text_box_extensions.rb +21 -18
- data/manual/text/text_box_overflow.rb +28 -21
- data/manual/text/utf8.rb +16 -17
- data/manual/text/win_ansi_charset.rb +29 -26
- data/prawn.gemspec +45 -43
- data/spec/extensions/encoding_helpers.rb +4 -3
- data/spec/prawn/document/bounding_box_spec.rb +550 -0
- data/spec/prawn/document/column_box_spec.rb +75 -0
- data/spec/prawn/document/security_spec.rb +176 -0
- data/spec/prawn/document_annotations_spec.rb +76 -0
- data/spec/prawn/document_destinations_spec.rb +15 -0
- data/spec/prawn/document_grid_spec.rb +99 -0
- data/spec/prawn/document_reference_spec.rb +27 -0
- data/spec/prawn/document_span_spec.rb +44 -0
- data/spec/prawn/document_spec.rb +805 -0
- data/spec/prawn/font_metric_cache_spec.rb +54 -0
- data/spec/prawn/font_spec.rb +544 -0
- data/spec/prawn/graphics/blend_mode_spec.rb +63 -0
- data/spec/prawn/graphics/transparency_spec.rb +81 -0
- data/spec/prawn/graphics_spec.rb +872 -0
- data/spec/prawn/graphics_stroke_styles_spec.rb +229 -0
- data/spec/prawn/image_handler_spec.rb +53 -0
- data/spec/prawn/images/jpg_spec.rb +20 -0
- data/spec/prawn/images/png_spec.rb +283 -0
- data/spec/prawn/images_spec.rb +229 -0
- data/spec/prawn/measurements_extensions_spec.rb +24 -0
- data/spec/prawn/outline_spec.rb +512 -0
- data/spec/prawn/repeater_spec.rb +166 -0
- data/spec/prawn/soft_mask_spec.rb +74 -0
- data/spec/prawn/stamp_spec.rb +173 -0
- data/spec/prawn/text/box_spec.rb +1110 -0
- data/spec/prawn/text/formatted/arranger_spec.rb +466 -0
- data/spec/prawn/text/formatted/box_spec.rb +849 -0
- data/spec/prawn/text/formatted/fragment_spec.rb +343 -0
- data/spec/prawn/text/formatted/line_wrap_spec.rb +495 -0
- data/spec/prawn/text/formatted/parser_spec.rb +697 -0
- data/spec/prawn/text_draw_text_spec.rb +150 -0
- data/spec/prawn/text_rendering_mode_spec.rb +48 -0
- data/spec/prawn/text_spacing_spec.rb +95 -0
- data/spec/prawn/text_spec.rb +603 -0
- data/spec/prawn/text_with_inline_formatting_spec.rb +35 -0
- data/spec/prawn/transformation_stack_spec.rb +66 -0
- data/spec/prawn/view_spec.rb +63 -0
- data/spec/prawn_manual_spec.rb +35 -0
- data/spec/spec_helper.rb +22 -21
- data.tar.gz.sig +0 -0
- metadata +168 -307
- metadata.gz.sig +0 -0
- data/README.md +0 -109
- data/data/encodings/win_ansi.txt +0 -29
- 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/indexed_color.dat +0 -0
- data/data/images/indexed_color.png +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/prawn.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 +0 -1
- 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/form.pdf +1 -819
- data/data/pdfs/hexagon.pdf +0 -61
- data/data/pdfs/indirect_reference.pdf +0 -86
- data/data/pdfs/multipage_template.pdf +0 -127
- data/data/pdfs/nested_pages.pdf +0 -118
- data/data/pdfs/page_without_mediabox.pdf +0 -193
- data/data/pdfs/resources_as_indirect_object.pdf +0 -83
- data/data/pdfs/two_hexagons.pdf +0 -90
- data/data/pdfs/version_1_6.pdf +0 -61
- data/data/shift_jis_text.txt +0 -1
- data/lib/pdf/core/annotations.rb +0 -60
- data/lib/pdf/core/byte_string.rb +0 -9
- data/lib/pdf/core/destinations.rb +0 -90
- data/lib/pdf/core/document_state.rb +0 -78
- data/lib/pdf/core/filter_list.rb +0 -51
- data/lib/pdf/core/filters.rb +0 -36
- data/lib/pdf/core/graphics_state.rb +0 -68
- data/lib/pdf/core/literal_string.rb +0 -16
- data/lib/pdf/core/name_tree.rb +0 -177
- data/lib/pdf/core/object_store.rb +0 -320
- data/lib/pdf/core/outline.rb +0 -315
- data/lib/pdf/core/page.rb +0 -212
- data/lib/pdf/core/page_geometry.rb +0 -126
- data/lib/pdf/core/pdf_object.rb +0 -124
- data/lib/pdf/core/reference.rb +0 -103
- data/lib/pdf/core/stream.rb +0 -98
- data/lib/pdf/core/text.rb +0 -275
- data/lib/pdf/core.rb +0 -35
- data/lib/prawn/compatibility.rb +0 -91
- data/lib/prawn/document/graphics_state.rb +0 -73
- data/lib/prawn/document/snapshot.rb +0 -89
- data/lib/prawn/font/afm.rb +0 -203
- data/lib/prawn/layout.rb +0 -20
- data/lib/prawn/table/cell/image.rb +0 -70
- data/lib/prawn/table/cell/in_table.rb +0 -27
- data/lib/prawn/table/cell/span_dummy.rb +0 -92
- data/lib/prawn/table/cell/subtable.rb +0 -65
- data/lib/prawn/table/cell/text.rb +0 -153
- data/lib/prawn/table/cell.rb +0 -770
- data/lib/prawn/table/cells.rb +0 -295
- data/lib/prawn/table.rb +0 -643
- data/manual/example_file.rb +0 -116
- data/manual/example_package.rb +0 -53
- data/manual/example_section.rb +0 -46
- data/manual/manual/cover.rb +0 -35
- data/manual/manual/foreword.rb +0 -85
- data/manual/manual/manual.rb +0 -35
- data/manual/syntax_highlight.rb +0 -52
- data/manual/table/basic_block.rb +0 -53
- data/manual/table/before_rendering_page.rb +0 -26
- data/manual/table/cell_border_lines.rb +0 -24
- data/manual/table/cell_borders_and_bg.rb +0 -31
- data/manual/table/cell_dimensions.rb +0 -30
- data/manual/table/cell_text.rb +0 -38
- data/manual/table/column_widths.rb +0 -30
- data/manual/table/content_and_subtables.rb +0 -39
- data/manual/table/creation.rb +0 -27
- data/manual/table/filtering.rb +0 -36
- data/manual/table/flow_and_header.rb +0 -17
- data/manual/table/image_cells.rb +0 -33
- data/manual/table/position.rb +0 -29
- data/manual/table/row_colors.rb +0 -20
- data/manual/table/span.rb +0 -30
- data/manual/table/style.rb +0 -22
- data/manual/table/table.rb +0 -52
- data/manual/table/width.rb +0 -27
- data/manual/templates/full_template.rb +0 -25
- data/manual/templates/page_template.rb +0 -48
- data/manual/templates/templates.rb +0 -27
- data/manual/text/group.rb +0 -29
- data/spec/acceptance/png.rb +0 -23
- data/spec/annotations_spec.rb +0 -74
- data/spec/bounding_box_spec.rb +0 -493
- data/spec/cell_spec.rb +0 -628
- data/spec/column_box_spec.rb +0 -33
- data/spec/destinations_spec.rb +0 -15
- data/spec/document_spec.rb +0 -761
- data/spec/extensions/mocha.rb +0 -44
- data/spec/filters_spec.rb +0 -34
- data/spec/font_metric_cache_spec.rb +0 -52
- data/spec/font_spec.rb +0 -464
- data/spec/formatted_text_arranger_spec.rb +0 -421
- data/spec/formatted_text_box_spec.rb +0 -650
- data/spec/formatted_text_fragment_spec.rb +0 -298
- data/spec/graphics_spec.rb +0 -651
- data/spec/grid_spec.rb +0 -85
- data/spec/image_handler_spec.rb +0 -42
- data/spec/images_spec.rb +0 -157
- data/spec/inline_formatted_text_parser_spec.rb +0 -564
- data/spec/jpg_spec.rb +0 -25
- data/spec/line_wrap_spec.rb +0 -333
- data/spec/measurement_units_spec.rb +0 -23
- data/spec/name_tree_spec.rb +0 -112
- data/spec/object_store_spec.rb +0 -170
- data/spec/outline_spec.rb +0 -448
- data/spec/pdf_object_spec.rb +0 -172
- data/spec/png_spec.rb +0 -240
- data/spec/reference_spec.rb +0 -82
- data/spec/repeater_spec.rb +0 -158
- data/spec/security_spec.rb +0 -158
- data/spec/snapshot_spec.rb +0 -186
- data/spec/soft_mask_spec.rb +0 -117
- data/spec/span_spec.rb +0 -44
- data/spec/stamp_spec.rb +0 -158
- data/spec/stream_spec.rb +0 -58
- data/spec/stroke_styles_spec.rb +0 -211
- data/spec/table/span_dummy_spec.rb +0 -17
- data/spec/table_spec.rb +0 -1355
- data/spec/template_spec.rb +0 -351
- data/spec/text_at_spec.rb +0 -130
- data/spec/text_box_spec.rb +0 -1030
- data/spec/text_rendering_mode_spec.rb +0 -45
- data/spec/text_spacing_spec.rb +0 -93
- data/spec/text_spec.rb +0 -425
- data/spec/text_with_inline_formatting_spec.rb +0 -35
- data/spec/transparency_spec.rb +0 -89
data/lib/prawn/compatibility.rb
DELETED
@@ -1,91 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
#
|
3
|
-
# Compatibility layer to smooth over differences between Ruby implementations
|
4
|
-
# The oldest version of Ruby which is supported is MRI 1.8.7
|
5
|
-
# Ideally, all version-specific or implementation-specific code should be
|
6
|
-
# kept in this file (but that ideal has not been attained yet)
|
7
|
-
|
8
|
-
class String #:nodoc:
|
9
|
-
def first_line
|
10
|
-
self.each_line { |line| return line }
|
11
|
-
end
|
12
|
-
|
13
|
-
unless "".respond_to?(:codepoints)
|
14
|
-
def codepoints(&block)
|
15
|
-
if block_given?
|
16
|
-
unpack("U*").each(&block)
|
17
|
-
else
|
18
|
-
unpack("U*")
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def each_codepoint(&block)
|
23
|
-
unpack("U*").each(&block)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
if "".respond_to?(:encode)
|
28
|
-
def normalize_to_utf8
|
29
|
-
begin
|
30
|
-
encode(Encoding::UTF_8)
|
31
|
-
rescue
|
32
|
-
raise Prawn::Errors::IncompatibleStringEncoding, "Encoding " +
|
33
|
-
"#{text.encoding} can not be transparently converted to UTF-8. " +
|
34
|
-
"Please ensure the encoding of the string you are attempting " +
|
35
|
-
"to use is set correctly"
|
36
|
-
end
|
37
|
-
end
|
38
|
-
alias :unicode_characters :each_char
|
39
|
-
alias :unicode_length :length
|
40
|
-
|
41
|
-
else
|
42
|
-
def normalize_to_utf8
|
43
|
-
begin
|
44
|
-
# use unpack as a hackish way to verify the string is valid utf-8
|
45
|
-
unpack("U*")
|
46
|
-
return dup
|
47
|
-
rescue
|
48
|
-
raise Prawn::Errors::IncompatibleStringEncoding, "The string you " +
|
49
|
-
"are attempting to render is not encoded in valid UTF-8."
|
50
|
-
end
|
51
|
-
end
|
52
|
-
def unicode_characters
|
53
|
-
if block_given?
|
54
|
-
unpack("U*").each { |c| yield [c].pack("U") }
|
55
|
-
else
|
56
|
-
unpack("U*").map { |c| [c].pack("U") }
|
57
|
-
end
|
58
|
-
end
|
59
|
-
def unicode_length
|
60
|
-
unpack("U*").length
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
unless File.respond_to?(:binread)
|
66
|
-
def File.binread(file) #:nodoc:
|
67
|
-
File.open(file,"rb") { |f| f.read }
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
if RUBY_VERSION < "1.9"
|
72
|
-
|
73
|
-
def ruby_18 #:nodoc:
|
74
|
-
yield
|
75
|
-
end
|
76
|
-
|
77
|
-
def ruby_19 #:nodoc:
|
78
|
-
false
|
79
|
-
end
|
80
|
-
|
81
|
-
else
|
82
|
-
|
83
|
-
def ruby_18 #:nodoc:
|
84
|
-
false
|
85
|
-
end
|
86
|
-
|
87
|
-
def ruby_19 #:nodoc:
|
88
|
-
yield
|
89
|
-
end
|
90
|
-
|
91
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
#
|
3
|
-
# graphics_state.rb: Implements graphics state saving and restoring
|
4
|
-
#
|
5
|
-
# Copyright January 2010, Michael Witrant. All Rights Reserved.
|
6
|
-
#
|
7
|
-
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
|
-
#
|
9
|
-
|
10
|
-
module Prawn
|
11
|
-
class Document
|
12
|
-
module GraphicsState
|
13
|
-
|
14
|
-
# Pushes the current graphics state on to the graphics state stack so we
|
15
|
-
# can restore it when finished with a change we want to isolate (such as
|
16
|
-
# modifying the transformation matrix). Used in pairs with
|
17
|
-
# restore_graphics_state or passed a block
|
18
|
-
#
|
19
|
-
# Example without a block:
|
20
|
-
#
|
21
|
-
# save_graphics_state
|
22
|
-
# rotate 30
|
23
|
-
# text "rotated text"
|
24
|
-
# restore_graphics_state
|
25
|
-
#
|
26
|
-
# Example with a block:
|
27
|
-
#
|
28
|
-
# save_graphics_state do
|
29
|
-
# rotate 30
|
30
|
-
# text "rotated text"
|
31
|
-
# end
|
32
|
-
#
|
33
|
-
|
34
|
-
def open_graphics_state
|
35
|
-
add_content "q"
|
36
|
-
end
|
37
|
-
|
38
|
-
def close_graphics_state
|
39
|
-
add_content "Q"
|
40
|
-
end
|
41
|
-
|
42
|
-
def save_graphics_state(graphic_state = nil)
|
43
|
-
graphic_stack.save_graphic_state(graphic_state)
|
44
|
-
open_graphics_state
|
45
|
-
if block_given?
|
46
|
-
yield
|
47
|
-
restore_graphics_state
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
# Pops the last saved graphics state off the graphics state stack and
|
52
|
-
# restores the state to those values
|
53
|
-
def restore_graphics_state
|
54
|
-
if graphic_stack.empty?
|
55
|
-
raise PDF::Core::Errors::EmptyGraphicStateStack,
|
56
|
-
"\n You have reached the end of the graphic state stack"
|
57
|
-
end
|
58
|
-
close_graphics_state
|
59
|
-
graphic_stack.restore_graphic_state
|
60
|
-
end
|
61
|
-
|
62
|
-
def graphic_stack
|
63
|
-
state.page.stack
|
64
|
-
end
|
65
|
-
|
66
|
-
def graphic_state
|
67
|
-
save_graphics_state unless graphic_stack.current_state
|
68
|
-
graphic_stack.current_state
|
69
|
-
end
|
70
|
-
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
@@ -1,89 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
# snapshot.rb : Implements transactional rendering for Prawn
|
4
|
-
#
|
5
|
-
# Copyright August 2009, Brad Ediger. All Rights Reserved.
|
6
|
-
#
|
7
|
-
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
|
-
|
9
|
-
require 'delegate'
|
10
|
-
|
11
|
-
module Prawn
|
12
|
-
class Document
|
13
|
-
module Snapshot
|
14
|
-
|
15
|
-
RollbackTransaction = Class.new(StandardError)
|
16
|
-
|
17
|
-
# Call this within a +transaction+ block to roll back the transaction and
|
18
|
-
# prevent any of its data from being rendered. You must reset the
|
19
|
-
# y-position yourself if you have performed any drawing operations that
|
20
|
-
# modify it.
|
21
|
-
#
|
22
|
-
def rollback
|
23
|
-
raise RollbackTransaction
|
24
|
-
end
|
25
|
-
|
26
|
-
# Run a block of drawing operations, to be completed atomically. If
|
27
|
-
# +rollback+ is called or a RollbackTransaction exception is raised
|
28
|
-
# inside the block, all actions taken inside the block will be rolled
|
29
|
-
# back (with the exception of y-position, which you must restore
|
30
|
-
# yourself).
|
31
|
-
#
|
32
|
-
# Returns true on success, or false if the transaction was rolled back.
|
33
|
-
#
|
34
|
-
def transaction
|
35
|
-
snap = take_snapshot
|
36
|
-
yield
|
37
|
-
true
|
38
|
-
rescue RollbackTransaction
|
39
|
-
restore_snapshot(snap)
|
40
|
-
false
|
41
|
-
end
|
42
|
-
|
43
|
-
private
|
44
|
-
|
45
|
-
# Takes a current snapshot of the document's state, sufficient to
|
46
|
-
# reconstruct it after it was amended.
|
47
|
-
#
|
48
|
-
def take_snapshot
|
49
|
-
# current_page holds a ref to the Pages dictionary which grows
|
50
|
-
# monotonically as data is added to the document, so we share that
|
51
|
-
# between the old and new copies.
|
52
|
-
{:page_content => state.page.content.deep_copy,
|
53
|
-
:current_page => state.page.dictionary.deep_copy([:Parent]),
|
54
|
-
:bounds => bounds.deep_copy,
|
55
|
-
:page_number => page_number,
|
56
|
-
:page_kids => state.store.pages.data[:Kids].compact.map{|kid| kid.identifier},
|
57
|
-
:dests => names? && names.data[:Dests].deep_copy}
|
58
|
-
end
|
59
|
-
|
60
|
-
# Rolls the page state back to the state of the given snapshot.
|
61
|
-
#
|
62
|
-
def restore_snapshot(shot)
|
63
|
-
page = state.page
|
64
|
-
# Because these objects are referenced by identifier from the Pages
|
65
|
-
# dictionary, we can't just restore them over the current refs in
|
66
|
-
# page_content and current_page. We have to restore them over the old
|
67
|
-
# ones.
|
68
|
-
page.content = shot[:page_content].identifier
|
69
|
-
page.content.replace shot[:page_content]
|
70
|
-
|
71
|
-
page.dictionary = shot[:current_page].identifier
|
72
|
-
page.dictionary.replace shot[:current_page]
|
73
|
-
page.dictionary.data[:Contents] = page.content
|
74
|
-
|
75
|
-
self.page_number = shot[:page_number]
|
76
|
-
|
77
|
-
state.store.pages.data[:Kids] = shot[:page_kids].map{|id| state.store[id]}
|
78
|
-
state.store.pages.data[:Count] = shot[:page_kids].size
|
79
|
-
|
80
|
-
self.bounds = BoundingBox.restore_deep_copy(shot[:bounds], self)
|
81
|
-
|
82
|
-
if shot[:dests]
|
83
|
-
names.data[:Dests] = shot[:dests]
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
data/lib/prawn/font/afm.rb
DELETED
@@ -1,203 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
# prawn/font/afm.rb : Implements AFM font support for Prawn
|
4
|
-
#
|
5
|
-
# Copyright May 2008, Gregory Brown / James Healy. All Rights Reserved.
|
6
|
-
#
|
7
|
-
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
|
-
|
9
|
-
require 'prawn/encoding'
|
10
|
-
require 'afm'
|
11
|
-
|
12
|
-
module Prawn
|
13
|
-
class Font
|
14
|
-
class AFM < Font
|
15
|
-
BUILT_INS = %w[ Courier Helvetica Times-Roman Symbol ZapfDingbats
|
16
|
-
Courier-Bold Courier-Oblique Courier-BoldOblique
|
17
|
-
Times-Bold Times-Italic Times-BoldItalic
|
18
|
-
Helvetica-Bold Helvetica-Oblique Helvetica-BoldOblique ]
|
19
|
-
|
20
|
-
def unicode?
|
21
|
-
false
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.metrics_path
|
25
|
-
if m = ENV['METRICS']
|
26
|
-
@metrics_path ||= m.split(':')
|
27
|
-
else
|
28
|
-
@metrics_path ||= [
|
29
|
-
".", "/usr/lib/afm",
|
30
|
-
"/usr/local/lib/afm",
|
31
|
-
"/usr/openwin/lib/fonts/afm",
|
32
|
-
Prawn::DATADIR+'/fonts']
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
attr_reader :attributes #:nodoc:
|
37
|
-
|
38
|
-
def initialize(document, name, options={}) #:nodoc:
|
39
|
-
unless BUILT_INS.include?(name)
|
40
|
-
raise Prawn::Errors::UnknownFont, "#{name} is not a known font."
|
41
|
-
end
|
42
|
-
|
43
|
-
super
|
44
|
-
|
45
|
-
@@winansi ||= Prawn::Encoding::WinAnsi.new # parse data/encodings/win_ansi.txt once only
|
46
|
-
@@font_data ||= SynchronizedCache.new # parse each ATM font file once only
|
47
|
-
|
48
|
-
file_name = @name.dup
|
49
|
-
file_name << ".afm" unless file_name =~ /\.afm$/
|
50
|
-
file_name = file_name[0] == ?/ ? file_name : find_font(file_name)
|
51
|
-
|
52
|
-
font_data = @@font_data[file_name] ||= ::AFM::Font.new(file_name)
|
53
|
-
@glyph_table = build_glyph_table(font_data)
|
54
|
-
@kern_pairs = font_data.kern_pairs
|
55
|
-
@kern_pair_table = build_kern_pair_table(@kern_pairs)
|
56
|
-
@attributes = font_data.metadata
|
57
|
-
|
58
|
-
@ascender = @attributes["Ascender"].to_i
|
59
|
-
@descender = @attributes["Descender"].to_i
|
60
|
-
@line_gap = Float(bbox[3] - bbox[1]) - (@ascender - @descender)
|
61
|
-
end
|
62
|
-
|
63
|
-
# The font bbox, as an array of integers
|
64
|
-
#
|
65
|
-
def bbox
|
66
|
-
@bbox ||= @attributes['FontBBox'].split(/\s+/).map { |e| Integer(e) }
|
67
|
-
end
|
68
|
-
|
69
|
-
# NOTE: String *must* be encoded as WinAnsi
|
70
|
-
def compute_width_of(string, options={}) #:nodoc:
|
71
|
-
scale = (options[:size] || size) / 1000.0
|
72
|
-
|
73
|
-
if options[:kerning]
|
74
|
-
strings, numbers = kern(string).partition { |e| e.is_a?(String) }
|
75
|
-
total_kerning_offset = numbers.inject(0.0) { |s,r| s + r }
|
76
|
-
(unscaled_width_of(strings.join) - total_kerning_offset) * scale
|
77
|
-
else
|
78
|
-
unscaled_width_of(string) * scale
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
# Returns true if the font has kerning data, false otherwise
|
83
|
-
#
|
84
|
-
def has_kerning_data?
|
85
|
-
@kern_pairs.any?
|
86
|
-
end
|
87
|
-
|
88
|
-
# built-in fonts only work with winansi encoding, so translate the
|
89
|
-
# string. Changes the encoding in-place, so the argument itself
|
90
|
-
# is replaced with a string in WinAnsi encoding.
|
91
|
-
#
|
92
|
-
def normalize_encoding(text)
|
93
|
-
enc = @@winansi
|
94
|
-
text.unpack("U*").collect { |i| enc[i] }.pack("C*")
|
95
|
-
rescue ArgumentError
|
96
|
-
raise Prawn::Errors::IncompatibleStringEncoding,
|
97
|
-
"Arguments to text methods must be UTF-8 encoded"
|
98
|
-
end
|
99
|
-
|
100
|
-
# Returns the number of characters in +str+ (a WinAnsi-encoded string).
|
101
|
-
#
|
102
|
-
def character_count(str)
|
103
|
-
str.length
|
104
|
-
end
|
105
|
-
|
106
|
-
# Perform any changes to the string that need to happen
|
107
|
-
# before it is rendered to the canvas. Returns an array of
|
108
|
-
# subset "chunks", where each chunk is an array of two elements.
|
109
|
-
# The first element is the font subset number, and the second
|
110
|
-
# is either a string or an array (for kerned text).
|
111
|
-
#
|
112
|
-
# For Adobe fonts, there is only ever a single subset, so
|
113
|
-
# the first element of the array is "0", and the second is
|
114
|
-
# the string itself (or an array, if kerning is performed).
|
115
|
-
#
|
116
|
-
# The +text+ parameter must be in WinAnsi encoding (cp1252).
|
117
|
-
#
|
118
|
-
def encode_text(text, options={})
|
119
|
-
[[0, options[:kerning] ? kern(text) : text]]
|
120
|
-
end
|
121
|
-
|
122
|
-
def glyph_present?(char)
|
123
|
-
if char == "_"
|
124
|
-
true
|
125
|
-
else
|
126
|
-
normalize_encoding(char) != "_"
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
private
|
131
|
-
|
132
|
-
def register(subset)
|
133
|
-
font_dict = {:Type => :Font,
|
134
|
-
:Subtype => :Type1,
|
135
|
-
:BaseFont => name.to_sym}
|
136
|
-
|
137
|
-
# Symbolic AFM fonts (Symbol, ZapfDingbats) have their own encodings
|
138
|
-
font_dict.merge!(:Encoding => :WinAnsiEncoding) unless symbolic?
|
139
|
-
|
140
|
-
@document.ref!(font_dict)
|
141
|
-
end
|
142
|
-
|
143
|
-
def symbolic?
|
144
|
-
attributes["CharacterSet"] == "Special"
|
145
|
-
end
|
146
|
-
|
147
|
-
def find_font(file)
|
148
|
-
self.class.metrics_path.find { |f| File.exist? "#{f}/#{file}" } + "/#{file}"
|
149
|
-
rescue NoMethodError
|
150
|
-
raise Prawn::Errors::UnknownFont,
|
151
|
-
"Couldn't find the font: #{file} in any of:\n" +
|
152
|
-
self.class.metrics_path.join("\n")
|
153
|
-
end
|
154
|
-
|
155
|
-
# converts a string into an array with spacing offsets
|
156
|
-
# bewteen characters that need to be kerned
|
157
|
-
#
|
158
|
-
# String *must* be encoded as WinAnsi
|
159
|
-
#
|
160
|
-
def kern(string)
|
161
|
-
kerned = [[]]
|
162
|
-
last_byte = nil
|
163
|
-
|
164
|
-
string.each_byte do |byte|
|
165
|
-
if k = last_byte && @kern_pair_table[[last_byte, byte]]
|
166
|
-
kerned << -k << [byte]
|
167
|
-
else
|
168
|
-
kerned.last << byte
|
169
|
-
end
|
170
|
-
last_byte = byte
|
171
|
-
end
|
172
|
-
|
173
|
-
kerned.map { |e|
|
174
|
-
e = (Array === e ? e.pack("C*") : e)
|
175
|
-
e.respond_to?(:force_encoding) ? e.force_encoding("Windows-1252") : e
|
176
|
-
}
|
177
|
-
end
|
178
|
-
|
179
|
-
def build_kern_pair_table(kern_pairs)
|
180
|
-
character_hash = Hash[Encoding::WinAnsi::CHARACTERS.zip((0..Encoding::WinAnsi::CHARACTERS.size).to_a)]
|
181
|
-
kern_pairs.inject({}) do |h,p|
|
182
|
-
h[
|
183
|
-
[character_hash[p[0]], character_hash[p[1]]]
|
184
|
-
] = p[2]
|
185
|
-
h
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
def build_glyph_table(font_data)
|
190
|
-
(0..255).map do |char|
|
191
|
-
metrics = font_data.metrics_for(char)
|
192
|
-
metrics ? metrics[:wx] : 0
|
193
|
-
end
|
194
|
-
end
|
195
|
-
|
196
|
-
def unscaled_width_of(string)
|
197
|
-
string.bytes.inject(0) do |s,r|
|
198
|
-
s + @glyph_table[r]
|
199
|
-
end
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end
|
203
|
-
end
|
data/lib/prawn/layout.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
require "prawn/table"
|
2
|
-
require 'prawn/layout/grid'
|
3
|
-
|
4
|
-
module Prawn
|
5
|
-
|
6
|
-
module Errors
|
7
|
-
|
8
|
-
# This error is raised when table data is malformed
|
9
|
-
#
|
10
|
-
InvalidTableData = Class.new(StandardError)
|
11
|
-
|
12
|
-
# This error is raised when an empty or nil table is rendered
|
13
|
-
#
|
14
|
-
EmptyTable = Class.new(StandardError)
|
15
|
-
end
|
16
|
-
|
17
|
-
module Layout
|
18
|
-
|
19
|
-
end
|
20
|
-
end
|
@@ -1,70 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
# image.rb: Table image cells.
|
4
|
-
#
|
5
|
-
# Copyright September 2010, Brad Ediger. All Rights Reserved.
|
6
|
-
#
|
7
|
-
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
|
-
module Prawn
|
9
|
-
class Table
|
10
|
-
class Cell
|
11
|
-
|
12
|
-
# A Cell that contains another table.
|
13
|
-
#
|
14
|
-
class Image < Cell
|
15
|
-
|
16
|
-
def initialize(pdf, point, options={})
|
17
|
-
@image_options = {}
|
18
|
-
super
|
19
|
-
|
20
|
-
@pdf_object, @image_info = @pdf.build_image_object(@file)
|
21
|
-
@natural_width, @natural_height = @image_info.calc_image_dimensions(
|
22
|
-
@image_options)
|
23
|
-
end
|
24
|
-
|
25
|
-
def image=(file)
|
26
|
-
@file = file
|
27
|
-
end
|
28
|
-
|
29
|
-
def scale=(s)
|
30
|
-
@image_options[:scale] = s
|
31
|
-
end
|
32
|
-
|
33
|
-
def fit=(f)
|
34
|
-
@image_options[:fit] = f
|
35
|
-
end
|
36
|
-
|
37
|
-
def image_height=(h)
|
38
|
-
@image_options[:height] = h
|
39
|
-
end
|
40
|
-
|
41
|
-
def image_width=(w)
|
42
|
-
@image_options[:width] = w
|
43
|
-
end
|
44
|
-
|
45
|
-
def position=(p)
|
46
|
-
@image_options[:position] = p
|
47
|
-
end
|
48
|
-
|
49
|
-
def vposition=(vp)
|
50
|
-
@image_options[:vposition] = vp
|
51
|
-
end
|
52
|
-
|
53
|
-
def natural_content_width
|
54
|
-
@natural_width
|
55
|
-
end
|
56
|
-
|
57
|
-
def natural_content_height
|
58
|
-
@natural_height
|
59
|
-
end
|
60
|
-
|
61
|
-
# Draw the image on the page.
|
62
|
-
#
|
63
|
-
def draw_content
|
64
|
-
@pdf.embed_image(@pdf_object, @image_info, @image_options)
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
# Accessors for using a Cell inside a Table.
|
4
|
-
|
5
|
-
module Prawn
|
6
|
-
class Table
|
7
|
-
class Cell
|
8
|
-
|
9
|
-
# This module extends Cell objects when they are used in a table (as
|
10
|
-
# opposed to standalone). Its properties apply to cells-in-tables but not
|
11
|
-
# cells themselves.
|
12
|
-
#
|
13
|
-
module InTable
|
14
|
-
|
15
|
-
# Row number (0-based).
|
16
|
-
#
|
17
|
-
attr_accessor :row
|
18
|
-
|
19
|
-
# Column number (0-based).
|
20
|
-
#
|
21
|
-
attr_accessor :column
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,92 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
# span_dummy.rb: Placeholder for non-master spanned cells.
|
4
|
-
#
|
5
|
-
# Copyright December 2011, Brad Ediger. All Rights Reserved.
|
6
|
-
#
|
7
|
-
# This is free software. Please see the LICENSE and COPYING files for details.
|
8
|
-
module Prawn
|
9
|
-
class Table
|
10
|
-
class Cell
|
11
|
-
|
12
|
-
# A Cell object used to represent all but the topmost cell in a span
|
13
|
-
# group.
|
14
|
-
#
|
15
|
-
class SpanDummy < Cell
|
16
|
-
def initialize(pdf, master_cell)
|
17
|
-
super(pdf, [0, pdf.cursor])
|
18
|
-
@master_cell = master_cell
|
19
|
-
@padding = [0, 0, 0, 0]
|
20
|
-
end
|
21
|
-
|
22
|
-
# By default, a span dummy will never increase the height demand.
|
23
|
-
#
|
24
|
-
def natural_content_height
|
25
|
-
0
|
26
|
-
end
|
27
|
-
|
28
|
-
# By default, a span dummy will never increase the width demand.
|
29
|
-
#
|
30
|
-
def natural_content_width
|
31
|
-
0
|
32
|
-
end
|
33
|
-
|
34
|
-
def avg_spanned_min_width
|
35
|
-
@master_cell.avg_spanned_min_width
|
36
|
-
end
|
37
|
-
|
38
|
-
# Dummy cells have nothing to draw.
|
39
|
-
#
|
40
|
-
def draw_borders(pt)
|
41
|
-
end
|
42
|
-
|
43
|
-
# Dummy cells have nothing to draw.
|
44
|
-
#
|
45
|
-
def draw_bounded_content(pt)
|
46
|
-
end
|
47
|
-
|
48
|
-
def padding_right=(val)
|
49
|
-
@master_cell.padding_right = val if rightmost?
|
50
|
-
end
|
51
|
-
|
52
|
-
def padding_bottom=(val)
|
53
|
-
@master_cell.padding_bottom = val if bottommost?
|
54
|
-
end
|
55
|
-
|
56
|
-
def border_right_color=(val)
|
57
|
-
@master_cell.border_right_color = val if rightmost?
|
58
|
-
end
|
59
|
-
|
60
|
-
def border_bottom_color=(val)
|
61
|
-
@master_cell.border_bottom_color = val if bottommost?
|
62
|
-
end
|
63
|
-
|
64
|
-
def border_right_width=(val)
|
65
|
-
@master_cell.border_right_width = val if rightmost?
|
66
|
-
end
|
67
|
-
|
68
|
-
def border_bottom_width=(val)
|
69
|
-
@master_cell.border_bottom_width = val if bottommost?
|
70
|
-
end
|
71
|
-
|
72
|
-
def background_color
|
73
|
-
@master_cell.background_color
|
74
|
-
end
|
75
|
-
|
76
|
-
private
|
77
|
-
|
78
|
-
# Are we on the right border of the span?
|
79
|
-
#
|
80
|
-
def rightmost?
|
81
|
-
@column == @master_cell.column + @master_cell.colspan - 1
|
82
|
-
end
|
83
|
-
|
84
|
-
# Are we on the bottom border of the span?
|
85
|
-
#
|
86
|
-
def bottommost?
|
87
|
-
@row == @master_cell.row + @master_cell.rowspan - 1
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|