hexapdf 0.32.2 → 0.33.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +63 -1
- data/README.md +9 -0
- data/examples/002-graphics.rb +15 -17
- data/examples/003-arcs.rb +9 -9
- data/examples/009-text_layouter_alignment.rb +1 -1
- data/examples/010-text_layouter_inline_boxes.rb +2 -2
- data/examples/011-text_layouter_line_wrapping.rb +1 -1
- data/examples/012-text_layouter_styling.rb +7 -7
- data/examples/013-text_layouter_shapes.rb +1 -1
- data/examples/014-text_in_polygon.rb +1 -1
- data/examples/015-boxes.rb +8 -7
- data/examples/016-frame_automatic_box_placement.rb +2 -2
- data/examples/017-frame_text_flow.rb +2 -1
- data/examples/018-composer.rb +1 -1
- data/examples/020-column_box.rb +2 -1
- data/examples/025-table_box.rb +46 -0
- data/lib/hexapdf/cli/command.rb +5 -2
- data/lib/hexapdf/cli/form.rb +5 -5
- data/lib/hexapdf/cli/inspect.rb +3 -3
- data/lib/hexapdf/composer.rb +104 -52
- data/lib/hexapdf/configuration.rb +44 -39
- data/lib/hexapdf/content/canvas.rb +393 -267
- data/lib/hexapdf/content/color_space.rb +72 -25
- data/lib/hexapdf/content/graphic_object/arc.rb +57 -24
- data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +66 -23
- data/lib/hexapdf/content/graphic_object/geom2d.rb +47 -6
- data/lib/hexapdf/content/graphic_object/solid_arc.rb +58 -36
- data/lib/hexapdf/content/graphic_object.rb +6 -7
- data/lib/hexapdf/content/graphics_state.rb +54 -45
- data/lib/hexapdf/content/operator.rb +52 -54
- data/lib/hexapdf/content/parser.rb +2 -2
- data/lib/hexapdf/content/processor.rb +15 -15
- data/lib/hexapdf/content/transformation_matrix.rb +1 -1
- data/lib/hexapdf/content.rb +5 -0
- data/lib/hexapdf/dictionary.rb +6 -5
- data/lib/hexapdf/dictionary_fields.rb +42 -14
- data/lib/hexapdf/digital_signature/cms_handler.rb +2 -2
- data/lib/hexapdf/digital_signature/handler.rb +1 -1
- data/lib/hexapdf/digital_signature/pkcs1_handler.rb +2 -3
- data/lib/hexapdf/digital_signature/signature.rb +6 -6
- data/lib/hexapdf/digital_signature/signatures.rb +13 -12
- data/lib/hexapdf/digital_signature/signing/default_handler.rb +14 -5
- data/lib/hexapdf/digital_signature/signing/signed_data_creator.rb +2 -4
- data/lib/hexapdf/digital_signature/signing/timestamp_handler.rb +4 -4
- data/lib/hexapdf/digital_signature/signing.rb +4 -0
- data/lib/hexapdf/digital_signature/verification_result.rb +2 -2
- data/lib/hexapdf/digital_signature.rb +7 -2
- data/lib/hexapdf/document/destinations.rb +12 -11
- data/lib/hexapdf/document/files.rb +1 -1
- data/lib/hexapdf/document/fonts.rb +1 -1
- data/lib/hexapdf/document/layout.rb +167 -39
- data/lib/hexapdf/document/pages.rb +3 -2
- data/lib/hexapdf/document.rb +89 -55
- data/lib/hexapdf/encryption/aes.rb +5 -5
- data/lib/hexapdf/encryption/arc4.rb +1 -1
- data/lib/hexapdf/encryption/fast_aes.rb +2 -2
- data/lib/hexapdf/encryption/fast_arc4.rb +1 -1
- data/lib/hexapdf/encryption/identity.rb +1 -1
- data/lib/hexapdf/encryption/ruby_aes.rb +1 -1
- data/lib/hexapdf/encryption/ruby_arc4.rb +1 -1
- data/lib/hexapdf/encryption/security_handler.rb +31 -24
- data/lib/hexapdf/encryption/standard_security_handler.rb +45 -36
- data/lib/hexapdf/encryption.rb +7 -2
- data/lib/hexapdf/error.rb +18 -0
- data/lib/hexapdf/filter/ascii85_decode.rb +1 -1
- data/lib/hexapdf/filter/ascii_hex_decode.rb +1 -1
- data/lib/hexapdf/filter/flate_decode.rb +1 -1
- data/lib/hexapdf/filter/lzw_decode.rb +1 -1
- data/lib/hexapdf/filter/pass_through.rb +1 -1
- data/lib/hexapdf/filter/predictor.rb +1 -1
- data/lib/hexapdf/filter/run_length_decode.rb +1 -1
- data/lib/hexapdf/filter.rb +55 -6
- data/lib/hexapdf/font/cmap/parser.rb +2 -2
- data/lib/hexapdf/font/cmap.rb +1 -1
- data/lib/hexapdf/font/encoding/difference_encoding.rb +1 -1
- data/lib/hexapdf/font/encoding/mac_expert_encoding.rb +1 -1
- data/lib/hexapdf/font/encoding/mac_roman_encoding.rb +2 -2
- data/lib/hexapdf/font/encoding/standard_encoding.rb +1 -1
- data/lib/hexapdf/font/encoding/symbol_encoding.rb +1 -1
- data/lib/hexapdf/font/encoding/win_ansi_encoding.rb +3 -3
- data/lib/hexapdf/font/encoding/zapf_dingbats_encoding.rb +1 -1
- data/lib/hexapdf/font/invalid_glyph.rb +3 -0
- data/lib/hexapdf/font/true_type_wrapper.rb +17 -4
- data/lib/hexapdf/font/type1_wrapper.rb +19 -4
- data/lib/hexapdf/font_loader/from_configuration.rb +5 -2
- data/lib/hexapdf/font_loader/from_file.rb +5 -5
- data/lib/hexapdf/font_loader/standard14.rb +3 -3
- data/lib/hexapdf/font_loader.rb +3 -0
- data/lib/hexapdf/image_loader/jpeg.rb +2 -2
- data/lib/hexapdf/image_loader/pdf.rb +1 -1
- data/lib/hexapdf/image_loader/png.rb +2 -2
- data/lib/hexapdf/image_loader.rb +1 -1
- data/lib/hexapdf/importer.rb +13 -0
- data/lib/hexapdf/layout/box.rb +9 -2
- data/lib/hexapdf/layout/box_fitter.rb +2 -2
- data/lib/hexapdf/layout/column_box.rb +18 -4
- data/lib/hexapdf/layout/frame.rb +30 -12
- data/lib/hexapdf/layout/image_box.rb +5 -0
- data/lib/hexapdf/layout/inline_box.rb +1 -0
- data/lib/hexapdf/layout/list_box.rb +17 -1
- data/lib/hexapdf/layout/page_style.rb +4 -4
- data/lib/hexapdf/layout/style.rb +18 -3
- data/lib/hexapdf/layout/table_box.rb +682 -0
- data/lib/hexapdf/layout/text_box.rb +5 -3
- data/lib/hexapdf/layout/text_fragment.rb +1 -1
- data/lib/hexapdf/layout/text_layouter.rb +12 -4
- data/lib/hexapdf/layout.rb +1 -0
- data/lib/hexapdf/name_tree_node.rb +1 -1
- data/lib/hexapdf/number_tree_node.rb +1 -1
- data/lib/hexapdf/object.rb +18 -7
- data/lib/hexapdf/parser.rb +7 -7
- data/lib/hexapdf/pdf_array.rb +1 -1
- data/lib/hexapdf/rectangle.rb +1 -1
- data/lib/hexapdf/reference.rb +1 -1
- data/lib/hexapdf/revision.rb +1 -1
- data/lib/hexapdf/revisions.rb +3 -3
- data/lib/hexapdf/serializer.rb +15 -15
- data/lib/hexapdf/stream.rb +4 -2
- data/lib/hexapdf/tokenizer.rb +14 -14
- data/lib/hexapdf/type/acro_form/appearance_generator.rb +22 -22
- data/lib/hexapdf/type/acro_form/button_field.rb +1 -1
- data/lib/hexapdf/type/acro_form/choice_field.rb +1 -1
- data/lib/hexapdf/type/acro_form/field.rb +2 -2
- data/lib/hexapdf/type/acro_form/form.rb +1 -1
- data/lib/hexapdf/type/acro_form/signature_field.rb +4 -4
- data/lib/hexapdf/type/acro_form/text_field.rb +1 -1
- data/lib/hexapdf/type/acro_form/variable_text_field.rb +1 -1
- data/lib/hexapdf/type/acro_form.rb +1 -1
- data/lib/hexapdf/type/action.rb +1 -1
- data/lib/hexapdf/type/actions/go_to.rb +1 -1
- data/lib/hexapdf/type/actions/go_to_r.rb +1 -1
- data/lib/hexapdf/type/actions/launch.rb +1 -1
- data/lib/hexapdf/type/actions/uri.rb +1 -1
- data/lib/hexapdf/type/actions.rb +1 -1
- data/lib/hexapdf/type/annotation.rb +3 -3
- data/lib/hexapdf/type/annotations/link.rb +1 -1
- data/lib/hexapdf/type/annotations/markup_annotation.rb +1 -1
- data/lib/hexapdf/type/annotations/text.rb +1 -1
- data/lib/hexapdf/type/annotations/widget.rb +2 -2
- data/lib/hexapdf/type/annotations.rb +1 -1
- data/lib/hexapdf/type/catalog.rb +1 -1
- data/lib/hexapdf/type/cid_font.rb +3 -3
- data/lib/hexapdf/type/embedded_file.rb +1 -1
- data/lib/hexapdf/type/file_specification.rb +2 -2
- data/lib/hexapdf/type/font_descriptor.rb +1 -1
- data/lib/hexapdf/type/font_simple.rb +2 -2
- data/lib/hexapdf/type/font_type0.rb +3 -3
- data/lib/hexapdf/type/font_type3.rb +1 -1
- data/lib/hexapdf/type/form.rb +1 -1
- data/lib/hexapdf/type/graphics_state_parameter.rb +1 -1
- data/lib/hexapdf/type/icon_fit.rb +1 -1
- data/lib/hexapdf/type/image.rb +1 -1
- data/lib/hexapdf/type/info.rb +1 -1
- data/lib/hexapdf/type/mark_information.rb +1 -1
- data/lib/hexapdf/type/names.rb +2 -2
- data/lib/hexapdf/type/object_stream.rb +2 -1
- data/lib/hexapdf/type/outline.rb +1 -1
- data/lib/hexapdf/type/outline_item.rb +1 -1
- data/lib/hexapdf/type/page.rb +19 -10
- data/lib/hexapdf/type/page_label.rb +1 -1
- data/lib/hexapdf/type/page_tree_node.rb +1 -1
- data/lib/hexapdf/type/resources.rb +1 -1
- data/lib/hexapdf/type/trailer.rb +2 -2
- data/lib/hexapdf/type/viewer_preferences.rb +1 -1
- data/lib/hexapdf/type/xref_stream.rb +2 -2
- data/lib/hexapdf/utils/pdf_doc_encoding.rb +1 -1
- data/lib/hexapdf/version.rb +1 -1
- data/lib/hexapdf/writer.rb +4 -4
- data/lib/hexapdf/xref_section.rb +2 -2
- data/test/hexapdf/content/graphic_object/test_endpoint_arc.rb +11 -1
- data/test/hexapdf/content/graphic_object/test_geom2d.rb +7 -0
- data/test/hexapdf/content/test_canvas.rb +0 -1
- data/test/hexapdf/digital_signature/test_signatures.rb +22 -0
- data/test/hexapdf/document/test_files.rb +2 -2
- data/test/hexapdf/document/test_layout.rb +98 -0
- data/test/hexapdf/encryption/test_security_handler.rb +12 -11
- data/test/hexapdf/encryption/test_standard_security_handler.rb +35 -23
- data/test/hexapdf/font/test_true_type_wrapper.rb +18 -1
- data/test/hexapdf/font/test_type1_wrapper.rb +15 -1
- data/test/hexapdf/layout/test_box.rb +1 -1
- data/test/hexapdf/layout/test_column_box.rb +65 -21
- data/test/hexapdf/layout/test_frame.rb +14 -14
- data/test/hexapdf/layout/test_image_box.rb +4 -0
- data/test/hexapdf/layout/test_inline_box.rb +5 -0
- data/test/hexapdf/layout/test_list_box.rb +40 -6
- data/test/hexapdf/layout/test_page_style.rb +3 -2
- data/test/hexapdf/layout/test_style.rb +50 -0
- data/test/hexapdf/layout/test_table_box.rb +722 -0
- data/test/hexapdf/layout/test_text_box.rb +18 -0
- data/test/hexapdf/layout/test_text_layouter.rb +4 -0
- data/test/hexapdf/test_dictionary_fields.rb +4 -1
- data/test/hexapdf/test_document.rb +1 -0
- data/test/hexapdf/test_filter.rb +8 -0
- data/test/hexapdf/test_importer.rb +9 -0
- data/test/hexapdf/test_object.rb +16 -5
- data/test/hexapdf/test_stream.rb +7 -0
- data/test/hexapdf/test_writer.rb +3 -3
- data/test/hexapdf/type/acro_form/test_appearance_generator.rb +13 -5
- data/test/hexapdf/type/acro_form/test_form.rb +4 -3
- data/test/hexapdf/type/test_page.rb +18 -4
- metadata +17 -8
@@ -43,6 +43,22 @@ module HexaPDF
|
|
43
43
|
|
44
44
|
# This class provides support for drawing Geom2D objects like line segments and polygons.
|
45
45
|
#
|
46
|
+
# By default, the paths for the objects are not only added to the canvas but are also stroked
|
47
|
+
# or filled (depending on the specific Geom2D object).
|
48
|
+
#
|
49
|
+
# Supported Geom2D objects are:
|
50
|
+
#
|
51
|
+
# * Geom2D::Point
|
52
|
+
# * Geom2D::Segment
|
53
|
+
# * Geom2D::Polygon
|
54
|
+
# * Geom2D::PolygonSet
|
55
|
+
#
|
56
|
+
# Examples:
|
57
|
+
#
|
58
|
+
# #>pdf-center
|
59
|
+
# canvas.draw(:geom2d, object: ::Geom2D::Point(-10, 10))
|
60
|
+
# canvas.draw(:geom2d, object: ::Geom2D::Polygon([10, 10], [30, 20], [0, 50]))
|
61
|
+
#
|
46
62
|
# See: Geom2D - https://github.com/gettalong/geom2d
|
47
63
|
class Geom2D
|
48
64
|
|
@@ -53,10 +69,12 @@ module HexaPDF
|
|
53
69
|
new.configure(**kwargs)
|
54
70
|
end
|
55
71
|
|
56
|
-
# The Geom2D object that should be drawn
|
72
|
+
# The Geom2D object that should be drawn.
|
73
|
+
#
|
74
|
+
# This attribute *must* be set before drawing.
|
57
75
|
attr_accessor :object
|
58
76
|
|
59
|
-
# The radius to use when drawing Geom2D::Point objects
|
77
|
+
# The radius to use when drawing Geom2D::Point objects, defaults to 1.
|
60
78
|
#
|
61
79
|
# Examples:
|
62
80
|
#
|
@@ -66,7 +84,7 @@ module HexaPDF
|
|
66
84
|
attr_accessor :point_radius
|
67
85
|
|
68
86
|
# Specifies whether only paths should be drawn or if they should be stroked/filled too
|
69
|
-
# (default).
|
87
|
+
# (the default).
|
70
88
|
#
|
71
89
|
# Examples:
|
72
90
|
#
|
@@ -76,6 +94,8 @@ module HexaPDF
|
|
76
94
|
attr_accessor :path_only
|
77
95
|
|
78
96
|
# Creates a Geom2D drawing support object.
|
97
|
+
#
|
98
|
+
# A call to #configure is mandatory afterwards to set the #object to be drawn.
|
79
99
|
def initialize
|
80
100
|
@object = nil
|
81
101
|
@point_radius = 1
|
@@ -84,7 +104,8 @@ module HexaPDF
|
|
84
104
|
|
85
105
|
# Configures the Geom2D drawing support object. The following arguments are allowed:
|
86
106
|
#
|
87
|
-
# :object:: The object that should be drawn.
|
107
|
+
# :object:: The object that should be drawn. If this argument has not been set before and is
|
108
|
+
# also not given, an error will be raised when calling #draw.
|
88
109
|
# :point_radius:: The radius of the points when drawing points.
|
89
110
|
# :path_only:: Whether only the path should be drawn.
|
90
111
|
#
|
@@ -92,18 +113,33 @@ module HexaPDF
|
|
92
113
|
# methods for the inital values.
|
93
114
|
#
|
94
115
|
# Returns self.
|
95
|
-
|
96
|
-
|
116
|
+
#
|
117
|
+
# Examples:
|
118
|
+
#
|
119
|
+
# #>pdf-center
|
120
|
+
# obj = canvas.graphic_object(:geom2d, object: ::Geom2D::Point(0, 0))
|
121
|
+
# canvas.draw(obj)
|
122
|
+
# canvas.opacity(fill_alpha: 0.5).fill_color("hp-blue").
|
123
|
+
# draw(obj, point_radius: 10)
|
124
|
+
def configure(object: nil, point_radius: nil, path_only: nil)
|
125
|
+
@object = object if object
|
97
126
|
@point_radius = point_radius if point_radius
|
98
127
|
@path_only = path_only if path_only
|
99
128
|
self
|
100
129
|
end
|
101
130
|
|
102
131
|
# Draws the Geom2D object onto the given Canvas.
|
132
|
+
#
|
133
|
+
# Examples:
|
134
|
+
#
|
135
|
+
# #>pdf-center
|
136
|
+
# obj = canvas.graphic_object(:geom2d, object: ::Geom2D::Point(0, 0))
|
137
|
+
# obj.draw(canvas)
|
103
138
|
def draw(canvas)
|
104
139
|
case @object
|
105
140
|
when ::Geom2D::Point then draw_point(canvas)
|
106
141
|
when ::Geom2D::Segment then draw_segment(canvas)
|
142
|
+
when ::Geom2D::Rectangle then draw_rectangle(canvas)
|
107
143
|
when ::Geom2D::Polygon then draw_polygon(canvas)
|
108
144
|
when ::Geom2D::PolygonSet then draw_polygon_set(canvas)
|
109
145
|
else
|
@@ -124,6 +160,11 @@ module HexaPDF
|
|
124
160
|
canvas.stroke unless @path_only
|
125
161
|
end
|
126
162
|
|
163
|
+
def draw_rectangle(canvas)
|
164
|
+
canvas.rectangle(@object.x, @object.y, @object.width, @object.height)
|
165
|
+
canvas.stroke unless @path_only
|
166
|
+
end
|
167
|
+
|
127
168
|
def draw_polygon(canvas)
|
128
169
|
return unless @object.nr_of_vertices > 1
|
129
170
|
canvas.move_to(@object[0].x, @object[0].y)
|
@@ -41,41 +41,43 @@ module HexaPDF
|
|
41
41
|
# This graphic object represents a solid elliptical arc, i.e. an arc that has an inner and
|
42
42
|
# an outer set of a/b values.
|
43
43
|
#
|
44
|
+
# Note that only the path itself is added to the canvas. So depending on the use-case the path
|
45
|
+
# itself still has to be, for example, stroked.
|
46
|
+
#
|
44
47
|
# This graphic object is registered under the :solid_arc key for use with the
|
45
48
|
# HexaPDF::Content::Canvas class.
|
46
49
|
#
|
47
|
-
#
|
50
|
+
# It can be used to create
|
48
51
|
#
|
49
52
|
# * an (*elliptical*) *disk* (when the inner a/b are zero and the difference between start and
|
50
53
|
# end angles is greater than or equal to 360),
|
51
54
|
#
|
52
55
|
# #>pdf-center
|
53
|
-
# canvas.fill_color("
|
54
|
-
# draw(:solid_arc, outer_a: 80, outer_b: 50
|
56
|
+
# canvas.fill_color("hp-blue").
|
57
|
+
# draw(:solid_arc, outer_a: 80, outer_b: 50).
|
55
58
|
# fill_stroke
|
56
59
|
#
|
57
60
|
# * an (*elliptical*) *sector* (when the inner a/b are zero and the difference between start
|
58
61
|
# and end angles is less than 360),
|
59
62
|
#
|
60
63
|
# #>pdf-center
|
61
|
-
# canvas.fill_color("
|
64
|
+
# canvas.fill_color("hp-blue").
|
62
65
|
# draw(:solid_arc, outer_a: 80, outer_b: 50, start_angle: 20, end_angle: 230).
|
63
66
|
# fill_stroke
|
64
67
|
#
|
65
68
|
# * an (*elliptical*) *annulus* (when the inner a/b are nonzero and the difference between
|
66
|
-
# start and end angles is greater than or equal to 360),
|
69
|
+
# start and end angles is greater than or equal to 360),
|
67
70
|
#
|
68
71
|
# #>pdf-center
|
69
|
-
# canvas.fill_color("
|
70
|
-
# draw(:solid_arc, outer_a: 80, outer_b: 50, inner_a: 70, inner_b: 30
|
71
|
-
# end_angle: 360).
|
72
|
+
# canvas.fill_color("hp-blue").
|
73
|
+
# draw(:solid_arc, outer_a: 80, outer_b: 50, inner_a: 70, inner_b: 30).
|
72
74
|
# fill_stroke
|
73
75
|
#
|
74
|
-
# * an (*elliptical*) *annular sector* (when the inner a/b are nonzero and the difference
|
76
|
+
# * and an (*elliptical*) *annular sector* (when the inner a/b are nonzero and the difference
|
75
77
|
# between start and end angles is less than 360)
|
76
78
|
#
|
77
79
|
# #>pdf-center
|
78
|
-
# canvas.fill_color("
|
80
|
+
# canvas.fill_color("hp-blue").
|
79
81
|
# draw(:solid_arc, outer_a: 80, outer_b: 50, inner_a: 70, inner_b: 30,
|
80
82
|
# start_angle: 20, end_angle: 230).
|
81
83
|
# fill_stroke
|
@@ -90,7 +92,7 @@ module HexaPDF
|
|
90
92
|
new.configure(**kwargs)
|
91
93
|
end
|
92
94
|
|
93
|
-
# x-coordinate of center point
|
95
|
+
# x-coordinate of center point, defaults to 0.
|
94
96
|
#
|
95
97
|
# Examples:
|
96
98
|
#
|
@@ -98,10 +100,10 @@ module HexaPDF
|
|
98
100
|
# solid_arc = canvas.graphic_object(:solid_arc, outer_a: 30, outer_b: 20,
|
99
101
|
# inner_a: 20, inner_b: 10)
|
100
102
|
# canvas.draw(solid_arc).stroke
|
101
|
-
# canvas.stroke_color("
|
103
|
+
# canvas.stroke_color("hp-blue").draw(solid_arc, cx: 50).stroke
|
102
104
|
attr_reader :cx
|
103
105
|
|
104
|
-
# y-coordinate of center point
|
106
|
+
# y-coordinate of center point, defaults to 0.
|
105
107
|
#
|
106
108
|
# Examples:
|
107
109
|
#
|
@@ -109,91 +111,96 @@ module HexaPDF
|
|
109
111
|
# solid_arc = canvas.graphic_object(:solid_arc, outer_a: 30, outer_b: 20,
|
110
112
|
# inner_a: 20, inner_b: 10)
|
111
113
|
# canvas.draw(solid_arc).stroke
|
112
|
-
# canvas.stroke_color("
|
114
|
+
# canvas.stroke_color("hp-blue").draw(solid_arc, cy: 50).stroke
|
113
115
|
attr_reader :cy
|
114
116
|
|
115
117
|
# Length of inner semi-major axis which (without altering the #inclination) is parallel to
|
116
|
-
# the x-axis
|
118
|
+
# the x-axis, defaults to 0.
|
117
119
|
#
|
118
120
|
# Examples:
|
119
121
|
#
|
120
122
|
# #>pdf-center
|
121
|
-
# solid_arc = canvas.graphic_object(:solid_arc, outer_a: 30, outer_b: 20,
|
123
|
+
# solid_arc = canvas.graphic_object(:solid_arc, cx: -50, outer_a: 30, outer_b: 20,
|
122
124
|
# inner_a: 20, inner_b: 10)
|
123
125
|
# canvas.draw(solid_arc).stroke
|
124
|
-
# canvas.stroke_color("
|
126
|
+
# canvas.stroke_color("hp-blue").draw(solid_arc, cx: 50, inner_a: 5).stroke
|
125
127
|
attr_reader :inner_a
|
126
128
|
|
127
|
-
# Length of inner semi-minor axis which (without altering the #inclination) is parallel to
|
128
|
-
# y-axis
|
129
|
+
# Length of inner semi-minor axis which (without altering the #inclination) is parallel to
|
130
|
+
# the y-axis, defaults to 0.
|
129
131
|
#
|
130
132
|
# Examples:
|
131
133
|
#
|
132
134
|
# #>pdf-center
|
133
|
-
# solid_arc = canvas.graphic_object(:solid_arc, outer_a: 30, outer_b: 20,
|
135
|
+
# solid_arc = canvas.graphic_object(:solid_arc, cx: -50, outer_a: 30, outer_b: 20,
|
134
136
|
# inner_a: 20, inner_b: 10)
|
135
137
|
# canvas.draw(solid_arc).stroke
|
136
|
-
# canvas.stroke_color("
|
138
|
+
# canvas.stroke_color("hp-blue").draw(solid_arc, cx: 50, inner_b: 20).stroke
|
137
139
|
attr_reader :inner_b
|
138
140
|
|
139
141
|
# Length of outer semi-major axis which (without altering the #inclination) is parallel to
|
140
|
-
# the x-axis
|
142
|
+
# the x-axis, defaults to 1.
|
141
143
|
#
|
142
144
|
# Examples:
|
143
145
|
#
|
144
146
|
# #>pdf-center
|
145
|
-
# solid_arc = canvas.graphic_object(:solid_arc, outer_a: 30, outer_b: 20,
|
147
|
+
# solid_arc = canvas.graphic_object(:solid_arc, cx: -50, outer_a: 30, outer_b: 20,
|
146
148
|
# inner_a: 20, inner_b: 10)
|
147
149
|
# canvas.draw(solid_arc).stroke
|
148
|
-
# canvas.stroke_color("
|
150
|
+
# canvas.stroke_color("hp-blue").draw(solid_arc, cx: 50, outer_a: 45).stroke
|
149
151
|
attr_reader :outer_a
|
150
152
|
|
151
153
|
# Length of outer semi-minor axis which (without altering the #inclination) is parallel to the
|
152
|
-
# y-axis
|
154
|
+
# y-axis, defaults to 1.
|
153
155
|
#
|
154
156
|
# Examples:
|
155
157
|
#
|
156
158
|
# #>pdf-center
|
157
|
-
# solid_arc = canvas.graphic_object(:solid_arc, outer_a: 30, outer_b: 20,
|
159
|
+
# solid_arc = canvas.graphic_object(:solid_arc, cx: -50, outer_a: 30, outer_b: 20,
|
158
160
|
# inner_a: 20, inner_b: 10)
|
159
161
|
# canvas.draw(solid_arc).stroke
|
160
|
-
# canvas.stroke_color("
|
162
|
+
# canvas.stroke_color("hp-blue").draw(solid_arc, cx: 50, outer_b: 40).stroke
|
161
163
|
attr_reader :outer_b
|
162
164
|
|
163
|
-
# Start angle of the solid arc in degrees
|
165
|
+
# Start angle of the solid arc in degrees, defaults to 0.
|
164
166
|
#
|
165
167
|
# Examples:
|
166
168
|
#
|
167
169
|
# #>pdf-center
|
168
|
-
# solid_arc = canvas.graphic_object(:solid_arc, outer_a: 30, outer_b: 20,
|
170
|
+
# solid_arc = canvas.graphic_object(:solid_arc, cx: -50, outer_a: 30, outer_b: 20,
|
169
171
|
# inner_a: 20, inner_b: 10)
|
170
172
|
# canvas.draw(solid_arc).stroke
|
171
|
-
# canvas.stroke_color("
|
173
|
+
# canvas.stroke_color("hp-blue").draw(solid_arc, cx: 50, start_angle: 60).stroke
|
172
174
|
attr_reader :start_angle
|
173
175
|
|
174
|
-
# End angle of the solid arc in degrees
|
176
|
+
# End angle of the solid arc in degrees, defaults to 0.
|
175
177
|
#
|
176
178
|
# Examples:
|
177
179
|
#
|
178
180
|
# #>pdf-center
|
179
|
-
# solid_arc = canvas.graphic_object(:solid_arc, outer_a: 30, outer_b: 20,
|
181
|
+
# solid_arc = canvas.graphic_object(:solid_arc, cx: -50, outer_a: 30, outer_b: 20,
|
180
182
|
# inner_a: 20, inner_b: 10)
|
181
183
|
# canvas.draw(solid_arc).stroke
|
182
|
-
# canvas.stroke_color("
|
184
|
+
# canvas.stroke_color("hp-blue").draw(solid_arc, cx: 50, end_angle: 120).stroke
|
183
185
|
attr_reader :end_angle
|
184
186
|
|
185
|
-
# Inclination in degrees of semi-major axis in respect to x-axis
|
187
|
+
# Inclination in degrees of semi-major axis in respect to x-axis, defaults to 0.
|
186
188
|
#
|
187
189
|
# Examples:
|
188
190
|
#
|
189
191
|
# #>pdf-center
|
190
|
-
# solid_arc = canvas.graphic_object(:solid_arc, outer_a: 30, outer_b: 20,
|
192
|
+
# solid_arc = canvas.graphic_object(:solid_arc, cx: -50, outer_a: 30, outer_b: 20,
|
191
193
|
# inner_a: 20, inner_b: 10)
|
192
194
|
# canvas.draw(solid_arc).stroke
|
193
|
-
# canvas.stroke_color("
|
195
|
+
# canvas.stroke_color("hp-blue").draw(solid_arc, cx: 50, inclination: 40).stroke
|
194
196
|
attr_reader :inclination
|
195
197
|
|
196
198
|
# Creates a solid arc with default values (a unit disk at the origin).
|
199
|
+
#
|
200
|
+
# Examples:
|
201
|
+
#
|
202
|
+
# #>pdf-center
|
203
|
+
# canvas.draw(:solid_arc).stroke
|
197
204
|
def initialize
|
198
205
|
@cx = @cy = 0
|
199
206
|
@inner_a = @inner_b = 0
|
@@ -218,6 +225,13 @@ module HexaPDF
|
|
218
225
|
# for the inital values.
|
219
226
|
#
|
220
227
|
# Returns self.
|
228
|
+
#
|
229
|
+
# Examples:
|
230
|
+
#
|
231
|
+
# #>pdf-center
|
232
|
+
# solid_arc = canvas.graphic_object(:solid_arc)
|
233
|
+
# solid_arc.configure(outer_a: 30, outer_b: 20, inner_a: 20, inner_b: 10)
|
234
|
+
# canvas.draw(solid_arc).stroke
|
221
235
|
def configure(cx: nil, cy: nil, inner_a: nil, inner_b: nil, outer_a: nil, outer_b: nil,
|
222
236
|
start_angle: nil, end_angle: nil, inclination: nil)
|
223
237
|
@cx = cx if cx
|
@@ -234,6 +248,14 @@ module HexaPDF
|
|
234
248
|
end
|
235
249
|
|
236
250
|
# Draws the solid arc on the given Canvas.
|
251
|
+
#
|
252
|
+
# Examples:
|
253
|
+
#
|
254
|
+
# #>pdf-center
|
255
|
+
# solid_arc = canvas.graphic_object(:solid_arc, outer_a: 30, outer_b: 20,
|
256
|
+
# inner_a: 20, inner_b: 10)
|
257
|
+
# solid_arc.draw(canvas)
|
258
|
+
# canvas.stroke
|
237
259
|
def draw(canvas)
|
238
260
|
angle_difference = (@end_angle - @start_angle).abs
|
239
261
|
if @inner_a == 0 && @inner_b == 0
|
@@ -49,16 +49,15 @@ module HexaPDF
|
|
49
49
|
# A graphic object should only use the path creation methods or other graphic objects when it
|
50
50
|
# is drawn. Stroking and filling, or optionally clipping, is left to the user.
|
51
51
|
#
|
52
|
-
# The
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
56
|
-
# configuration option.
|
52
|
+
# The Canvas class provides a Canvas#draw method that can be used to draw complex graphic
|
53
|
+
# objects as well as a Canvas#graphic_object method to retrieve an instance of a graphic object
|
54
|
+
# for custom use. The latter method uses graphic object factories that can be registered via a
|
55
|
+
# name using the document specific 'graphic_object.map' configuration option.
|
57
56
|
#
|
58
57
|
# == Implementation of a Graphic Object
|
59
58
|
#
|
60
|
-
# Graphic objects are
|
61
|
-
#
|
59
|
+
# Graphic objects are usually implemented as classes since this automatically allows using the
|
60
|
+
# class itself as the graphic object's factory.
|
62
61
|
#
|
63
62
|
# A graphic object factory is an object that responds to #configure(**kwargs) and returns a
|
64
63
|
# configured graphic object. When the factory is implemented as a class, the #configure method
|
@@ -43,6 +43,8 @@ module HexaPDF
|
|
43
43
|
module Content
|
44
44
|
|
45
45
|
# Associates a name with a value, used by various graphics state parameters.
|
46
|
+
#
|
47
|
+
# See LineCapStyle, LineJoinStyle, TextRenderingMode
|
46
48
|
class NamedValue
|
47
49
|
|
48
50
|
# The value itself.
|
@@ -73,12 +75,12 @@ module HexaPDF
|
|
73
75
|
end
|
74
76
|
|
75
77
|
# Defines all available line cap styles as constants. Each line cap style is an instance of
|
76
|
-
# NamedValue, see ::normalize. For use with e.g.
|
78
|
+
# NamedValue, see ::normalize. For use with e.g. Canvas#line_cap_style.
|
77
79
|
#
|
78
|
-
# See:
|
80
|
+
# See: PDF2.0 s8.4.3.3
|
79
81
|
module LineCapStyle
|
80
82
|
|
81
|
-
# Returns the argument normalized to a valid line cap style.
|
83
|
+
# Returns the argument normalized to a valid line cap style, i.e. a NamedValue instance.
|
82
84
|
#
|
83
85
|
# * 0 or +:butt+ can be used for the BUTT_CAP style.
|
84
86
|
# * 1 or +:round+ can be used for the ROUND_CAP style.
|
@@ -96,7 +98,7 @@ module HexaPDF
|
|
96
98
|
|
97
99
|
# Stroke is squared off at the endpoint of a path.
|
98
100
|
#
|
99
|
-
# Specify as 0 or
|
101
|
+
# Specify as 0 or +:butt+.
|
100
102
|
#
|
101
103
|
# #>pdf-small-hide
|
102
104
|
# canvas.line_cap_style(:butt)
|
@@ -106,7 +108,7 @@ module HexaPDF
|
|
106
108
|
|
107
109
|
# A semicircular arc is drawn at the endpoint of a path.
|
108
110
|
#
|
109
|
-
# Specify as 1 or
|
111
|
+
# Specify as 1 or +:round+.
|
110
112
|
#
|
111
113
|
# #>pdf-small-hide
|
112
114
|
# canvas.line_cap_style(:round)
|
@@ -116,7 +118,7 @@ module HexaPDF
|
|
116
118
|
|
117
119
|
# The stroke continues half the line width beyond the endpoint of a path.
|
118
120
|
#
|
119
|
-
# Specify as 2 or
|
121
|
+
# Specify as 2 or +:projecting_square+.
|
120
122
|
#
|
121
123
|
# #>pdf-small-hide
|
122
124
|
# canvas.line_cap_style(:projecting_square)
|
@@ -127,12 +129,12 @@ module HexaPDF
|
|
127
129
|
end
|
128
130
|
|
129
131
|
# Defines all available line join styles as constants. Each line join style is an instance of
|
130
|
-
# NamedValue, see ::normalize For use with e.g.
|
132
|
+
# NamedValue, see ::normalize For use with e.g. Canvas#line_join_style.
|
131
133
|
#
|
132
|
-
# See:
|
134
|
+
# See: PDF2.0 s8.4.3.4
|
133
135
|
module LineJoinStyle
|
134
136
|
|
135
|
-
# Returns the argument normalized to a valid line join style.
|
137
|
+
# Returns the argument normalized to a valid line join style, i.e. a NamedValue instance.
|
136
138
|
#
|
137
139
|
# * 0 or +:miter+ can be used for the MITER_JOIN style.
|
138
140
|
# * 1 or +:round+ can be used for the ROUND_JOIN style.
|
@@ -150,7 +152,7 @@ module HexaPDF
|
|
150
152
|
|
151
153
|
# The outer lines of the two segments continue until they meet at an angle.
|
152
154
|
#
|
153
|
-
# Specify as 0 or
|
155
|
+
# Specify as 0 or +:miter+.
|
154
156
|
#
|
155
157
|
# #>pdf-small-hide
|
156
158
|
# canvas.line_join_style(:miter)
|
@@ -162,7 +164,7 @@ module HexaPDF
|
|
162
164
|
|
163
165
|
# An arc of a circle is drawn around the point where the segments meet.
|
164
166
|
#
|
165
|
-
# Specify as 1 or
|
167
|
+
# Specify as 1 or +:round+.
|
166
168
|
#
|
167
169
|
# #>pdf-small-hide
|
168
170
|
# canvas.line_join_style(:round)
|
@@ -175,7 +177,7 @@ module HexaPDF
|
|
175
177
|
# The two segments are finished with butt caps and the space between the ends is filled with a
|
176
178
|
# triangle.
|
177
179
|
#
|
178
|
-
# Specify as 2 or
|
180
|
+
# Specify as 2 or +:bevel+.
|
179
181
|
#
|
180
182
|
# #>pdf-small-hide
|
181
183
|
# canvas.line_join_style(:bevel)
|
@@ -188,7 +190,7 @@ module HexaPDF
|
|
188
190
|
end
|
189
191
|
|
190
192
|
# The line dash pattern defines how a line should be dashed. For use with e.g.
|
191
|
-
#
|
193
|
+
# Canvas#line_dash_pattern.
|
192
194
|
#
|
193
195
|
# A dash pattern consists of two parts: the dash array and the dash phase. The dash array
|
194
196
|
# defines the length of alternating dashes and gaps (important: starting with dashes). And the
|
@@ -204,7 +206,17 @@ module HexaPDF
|
|
204
206
|
# [3 5] 6 2 unit gap, 3 unit dash, 5 unit gap, 3 unit dash, ...
|
205
207
|
# [2 3] 6 1 unit dash, 3 unit gap, 2 unit dash, 3 unit gap, ...
|
206
208
|
#
|
207
|
-
#
|
209
|
+
# And visualized it looks like this:
|
210
|
+
#
|
211
|
+
# #>pdf-canvas-hide
|
212
|
+
# canvas.line_width(2)
|
213
|
+
# [[[], 0], [[3], 0], [[3], 1], [[2, 1], 0],
|
214
|
+
# [[3, 5], 6], [[2, 3], 6]].each_with_index do |(arr, phase), index|
|
215
|
+
# canvas.line_dash_pattern(arr, phase)
|
216
|
+
# canvas.line(20, 180 - index * 30, 180, 180 - index * 30).stroke
|
217
|
+
# end
|
218
|
+
#
|
219
|
+
# See: PDF2.0 s8.4.3.6
|
208
220
|
class LineDashPattern
|
209
221
|
|
210
222
|
# :call-seq:
|
@@ -261,9 +273,9 @@ module HexaPDF
|
|
261
273
|
end
|
262
274
|
|
263
275
|
# Defines all available rendering intents as constants. For use with e.g.
|
264
|
-
#
|
276
|
+
# Canvas#rendering_intent.
|
265
277
|
#
|
266
|
-
# See:
|
278
|
+
# See: PDF2.0 s8.6.5.8
|
267
279
|
module RenderingIntent
|
268
280
|
|
269
281
|
# Returns the argument normalized to a valid rendering intent.
|
@@ -295,12 +307,12 @@ module HexaPDF
|
|
295
307
|
end
|
296
308
|
|
297
309
|
# Defines all available text rendering modes as constants. Each text rendering mode is an
|
298
|
-
# instance of NamedValue. For use with e.g.
|
310
|
+
# instance of NamedValue. For use with e.g. Canvas#text_rendering_mode.
|
299
311
|
#
|
300
|
-
# See:
|
312
|
+
# See: PDF2.0 s9.3.6
|
301
313
|
module TextRenderingMode
|
302
314
|
|
303
|
-
# Returns the argument normalized to a valid text rendering mode.
|
315
|
+
# Returns the argument normalized to a valid text rendering mode, i.e. a NamedValue instance.
|
304
316
|
#
|
305
317
|
# * 0 or +:fill+ can be used for the FILL mode.
|
306
318
|
# * 1 or +:stroke+ can be used for the STROKE mode.
|
@@ -328,95 +340,92 @@ module HexaPDF
|
|
328
340
|
|
329
341
|
# Fill text.
|
330
342
|
#
|
331
|
-
# Specify as 0 or
|
343
|
+
# Specify as 0 or +:fill+.
|
332
344
|
#
|
333
345
|
# #>pdf-small-hide
|
334
346
|
# canvas.font("Helvetica", size: 13)
|
335
|
-
# canvas.stroke_color("green").line_width(0.5)
|
336
347
|
# canvas.text_rendering_mode(:fill)
|
337
348
|
# canvas.text("#{canvas.text_rendering_mode.name}", at: [10, 50])
|
338
349
|
FILL = NamedValue.new(:fill, 0)
|
339
350
|
|
340
351
|
# Stroke text.
|
341
352
|
#
|
342
|
-
# Specify as 1 or
|
353
|
+
# Specify as 1 or +:stroke+.
|
343
354
|
#
|
344
355
|
# #>pdf-small-hide
|
345
356
|
# canvas.font("Helvetica", size: 13)
|
346
|
-
# canvas.stroke_color("
|
357
|
+
# canvas.stroke_color("hp-blue").line_width(0.5)
|
347
358
|
# canvas.text_rendering_mode(:stroke)
|
348
359
|
# canvas.text("#{canvas.text_rendering_mode.name}", at: [10, 50])
|
349
360
|
STROKE = NamedValue.new(:stroke, 1)
|
350
361
|
|
351
362
|
# Fill, then stroke text.
|
352
363
|
#
|
353
|
-
# Specify as 2 or
|
364
|
+
# Specify as 2 or +:fill_stroke+.
|
354
365
|
#
|
355
366
|
# #>pdf-small-hide
|
356
367
|
# canvas.font("Helvetica", size: 13)
|
357
|
-
# canvas.stroke_color("
|
368
|
+
# canvas.stroke_color("hp-blue").line_width(0.5)
|
358
369
|
# canvas.text_rendering_mode(:fill_stroke)
|
359
370
|
# canvas.text("#{canvas.text_rendering_mode.name}", at: [10, 50])
|
360
371
|
FILL_STROKE = NamedValue.new(:fill_stroke, 2)
|
361
372
|
|
362
373
|
# Neither fill nor stroke text (invisible).
|
363
374
|
#
|
364
|
-
# Specify as 3 or
|
375
|
+
# Specify as 3 or +:invisible+.
|
365
376
|
#
|
366
377
|
# #>pdf-small-hide
|
367
378
|
# canvas.font("Helvetica", size: 13)
|
368
|
-
# canvas.stroke_color("green").line_width(0.5)
|
369
379
|
# canvas.text_rendering_mode(:invisible)
|
370
380
|
# canvas.text("#{canvas.text_rendering_mode.name}", at: [10, 50])
|
371
|
-
# canvas.stroke_color("
|
381
|
+
# canvas.stroke_color("hp-blue").line_width(20).line(30, 20, 30, 80).stroke
|
372
382
|
INVISIBLE = NamedValue.new(:invisible, 3)
|
373
383
|
|
374
384
|
# Fill text and add to path for clipping.
|
375
385
|
#
|
376
|
-
# Specify as 4 or
|
386
|
+
# Specify as 4 or +:fill_clip+.
|
377
387
|
#
|
378
388
|
# #>pdf-small-hide
|
379
389
|
# canvas.font("Helvetica", size: 13)
|
380
|
-
# canvas.stroke_color("green").line_width(0.5)
|
381
390
|
# canvas.text_rendering_mode(:fill_clip)
|
382
391
|
# canvas.text("#{canvas.text_rendering_mode.name}", at: [10, 50])
|
383
|
-
# canvas.stroke_color("
|
392
|
+
# canvas.stroke_color("hp-orange").line_width(20).line(30, 20, 30, 80).stroke
|
384
393
|
FILL_CLIP = NamedValue.new(:fill_clip, 4)
|
385
394
|
|
386
395
|
# Stroke text and add to path for clipping.
|
387
396
|
#
|
388
|
-
# Specify as 5 or
|
397
|
+
# Specify as 5 or +:stroke_clip+.
|
389
398
|
#
|
390
399
|
# #>pdf-small-hide
|
391
400
|
# canvas.font("Helvetica", size: 13)
|
392
|
-
# canvas.stroke_color("
|
401
|
+
# canvas.stroke_color("hp-blue").line_width(0.5)
|
393
402
|
# canvas.text_rendering_mode(:stroke_clip)
|
394
403
|
# canvas.text("#{canvas.text_rendering_mode.name}", at: [10, 50])
|
395
|
-
# canvas.stroke_color("
|
404
|
+
# canvas.stroke_color("hp-orange").line_width(20).line(30, 20, 30, 80).stroke
|
396
405
|
STROKE_CLIP = NamedValue.new(:stroke_clip, 5)
|
397
406
|
|
398
407
|
# Fill, then stroke text and add to path for clipping.
|
399
408
|
#
|
400
|
-
# Specify as 6 or
|
409
|
+
# Specify as 6 or +:fill_stroke_clip+.
|
401
410
|
#
|
402
411
|
# #>pdf-small-hide
|
403
412
|
# canvas.font("Helvetica", size: 13)
|
404
|
-
# canvas.stroke_color("
|
413
|
+
# canvas.stroke_color("hp-blue").line_width(0.5)
|
405
414
|
# canvas.text_rendering_mode(:fill_stroke_clip)
|
406
415
|
# canvas.text("#{canvas.text_rendering_mode.name}", at: [10, 50])
|
407
|
-
# canvas.stroke_color("
|
416
|
+
# canvas.stroke_color("hp-orange").line_width(20).line(30, 20, 30, 80).stroke
|
408
417
|
FILL_STROKE_CLIP = NamedValue.new(:fill_stroke_clip, 6)
|
409
418
|
|
410
419
|
# Add text to path for clipping.
|
411
420
|
#
|
412
|
-
# Specify as 7 or
|
421
|
+
# Specify as 7 or +:clip+.
|
413
422
|
#
|
414
423
|
# #>pdf-small-hide
|
415
424
|
# canvas.font("Helvetica", size: 13)
|
416
|
-
# canvas.stroke_color("
|
425
|
+
# canvas.stroke_color("hp-blue").line_width(0.5)
|
417
426
|
# canvas.text_rendering_mode(:clip)
|
418
427
|
# canvas.text("#{canvas.text_rendering_mode.name}", at: [10, 50])
|
419
|
-
# canvas.stroke_color("
|
428
|
+
# canvas.stroke_color("hp-orange").line_width(20).line(30, 20, 30, 80).stroke
|
420
429
|
CLIP = NamedValue.new(:clip, 7)
|
421
430
|
|
422
431
|
end
|
@@ -429,7 +438,7 @@ module HexaPDF
|
|
429
438
|
#
|
430
439
|
# The device-dependent graphics state parameters have not been implemented!
|
431
440
|
#
|
432
|
-
# See:
|
441
|
+
# See: PDF2.0 s8.4.1
|
433
442
|
class GraphicsState
|
434
443
|
|
435
444
|
# The current transformation matrix.
|
@@ -540,14 +549,14 @@ module HexaPDF
|
|
540
549
|
#
|
541
550
|
# This returns the character spacing multiplied by #scaled_horizontal_scaling.
|
542
551
|
#
|
543
|
-
# See
|
552
|
+
# See PDF2.0 s9.4.4
|
544
553
|
attr_reader :scaled_character_spacing
|
545
554
|
|
546
555
|
# The scaled word spacing used in glyph displacement calculations.
|
547
556
|
#
|
548
557
|
# This returns the word spacing multiplied by #scaled_horizontal_scaling.
|
549
558
|
#
|
550
|
-
# See
|
559
|
+
# See PDF2.0 s9.4.4
|
551
560
|
attr_reader :scaled_word_spacing
|
552
561
|
|
553
562
|
# The scaled font size used in glyph displacement calculations.
|
@@ -556,7 +565,7 @@ module HexaPDF
|
|
556
565
|
# (0.001 for all fonts except Type3 fonts or the scaling specified in /FontMatrix for Type3
|
557
566
|
# fonts) and multiplied by #scaled_horizontal_scaling.
|
558
567
|
#
|
559
|
-
# See
|
568
|
+
# See PDF2.0 s9.4.4, HexaPDF::Type::FontType3
|
560
569
|
attr_reader :scaled_font_size
|
561
570
|
|
562
571
|
# The scaled horizontal scaling used in glyph displacement calculations.
|
@@ -564,7 +573,7 @@ module HexaPDF
|
|
564
573
|
# Since the horizontal scaling attribute is stored in percent of 100, this method returns the
|
565
574
|
# correct value for calculations.
|
566
575
|
#
|
567
|
-
# See
|
576
|
+
# See PDF2.0 s9.4.4
|
568
577
|
attr_reader :scaled_horizontal_scaling
|
569
578
|
|
570
579
|
# Initializes the graphics state parameters to their default values.
|