hexapdf 0.15.9 → 0.17.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +62 -0
- data/LICENSE +1 -1
- data/README.md +11 -2
- data/Rakefile +2 -1
- data/examples/002-graphics.rb +4 -4
- data/lib/hexapdf/cli/batch.rb +1 -1
- data/lib/hexapdf/cli/command.rb +10 -1
- data/lib/hexapdf/cli/files.rb +1 -1
- data/lib/hexapdf/cli/fonts.rb +145 -0
- data/lib/hexapdf/cli/form.rb +27 -26
- data/lib/hexapdf/cli/image2pdf.rb +1 -1
- data/lib/hexapdf/cli/images.rb +1 -10
- data/lib/hexapdf/cli/info.rb +1 -1
- data/lib/hexapdf/cli/inspect.rb +1 -1
- data/lib/hexapdf/cli/merge.rb +1 -1
- data/lib/hexapdf/cli/modify.rb +1 -1
- data/lib/hexapdf/cli/optimize.rb +1 -1
- data/lib/hexapdf/cli/split.rb +1 -1
- data/lib/hexapdf/cli/watermark.rb +1 -1
- data/lib/hexapdf/cli.rb +3 -1
- data/lib/hexapdf/composer.rb +1 -1
- data/lib/hexapdf/configuration.rb +11 -2
- data/lib/hexapdf/content/canvas.rb +658 -167
- data/lib/hexapdf/content/color_space.rb +185 -3
- data/lib/hexapdf/content/graphic_object/arc.rb +111 -12
- data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +67 -1
- data/lib/hexapdf/content/graphic_object/geom2d.rb +14 -1
- data/lib/hexapdf/content/graphic_object/solid_arc.rb +1 -1
- data/lib/hexapdf/content/graphic_object.rb +1 -1
- data/lib/hexapdf/content/graphics_state.rb +1 -1
- data/lib/hexapdf/content/operator.rb +1 -1
- data/lib/hexapdf/content/parser.rb +1 -1
- data/lib/hexapdf/content/processor.rb +1 -1
- data/lib/hexapdf/content/transformation_matrix.rb +1 -1
- data/lib/hexapdf/content.rb +1 -1
- data/lib/hexapdf/data_dir.rb +1 -1
- data/lib/hexapdf/dictionary.rb +1 -1
- data/lib/hexapdf/dictionary_fields.rb +30 -4
- data/lib/hexapdf/document/files.rb +3 -3
- data/lib/hexapdf/document/fonts.rb +1 -1
- data/lib/hexapdf/document/images.rb +1 -1
- data/lib/hexapdf/document/pages.rb +1 -1
- data/lib/hexapdf/document.rb +1 -1
- data/lib/hexapdf/encryption/aes.rb +1 -1
- data/lib/hexapdf/encryption/arc4.rb +1 -1
- data/lib/hexapdf/encryption/fast_aes.rb +1 -1
- 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 +1 -1
- data/lib/hexapdf/encryption/standard_security_handler.rb +1 -1
- data/lib/hexapdf/encryption.rb +1 -1
- data/lib/hexapdf/error.rb +1 -1
- data/lib/hexapdf/filter/ascii85_decode.rb +1 -1
- data/lib/hexapdf/filter/ascii_hex_decode.rb +1 -1
- data/lib/hexapdf/filter/crypt.rb +1 -1
- data/lib/hexapdf/filter/encryption.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 +1 -1
- data/lib/hexapdf/font/cmap/parser.rb +1 -1
- data/lib/hexapdf/font/cmap/writer.rb +1 -1
- data/lib/hexapdf/font/cmap.rb +1 -1
- data/lib/hexapdf/font/encoding/base.rb +1 -1
- data/lib/hexapdf/font/encoding/difference_encoding.rb +1 -1
- data/lib/hexapdf/font/encoding/glyph_list.rb +1 -1
- data/lib/hexapdf/font/encoding/mac_expert_encoding.rb +1 -1
- data/lib/hexapdf/font/encoding/mac_roman_encoding.rb +1 -1
- 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 +1 -1
- data/lib/hexapdf/font/encoding/zapf_dingbats_encoding.rb +1 -1
- data/lib/hexapdf/font/encoding.rb +1 -1
- data/lib/hexapdf/font/invalid_glyph.rb +1 -1
- data/lib/hexapdf/font/true_type/builder.rb +1 -1
- data/lib/hexapdf/font/true_type/font.rb +1 -1
- data/lib/hexapdf/font/true_type/optimizer.rb +1 -1
- data/lib/hexapdf/font/true_type/subsetter.rb +1 -1
- data/lib/hexapdf/font/true_type/table/cmap.rb +1 -1
- data/lib/hexapdf/font/true_type/table/cmap_subtable.rb +1 -1
- data/lib/hexapdf/font/true_type/table/directory.rb +1 -1
- data/lib/hexapdf/font/true_type/table/glyf.rb +1 -1
- data/lib/hexapdf/font/true_type/table/head.rb +1 -1
- data/lib/hexapdf/font/true_type/table/hhea.rb +1 -1
- data/lib/hexapdf/font/true_type/table/hmtx.rb +1 -1
- data/lib/hexapdf/font/true_type/table/kern.rb +1 -1
- data/lib/hexapdf/font/true_type/table/loca.rb +1 -1
- data/lib/hexapdf/font/true_type/table/maxp.rb +1 -1
- data/lib/hexapdf/font/true_type/table/name.rb +1 -1
- data/lib/hexapdf/font/true_type/table/os2.rb +1 -1
- data/lib/hexapdf/font/true_type/table/post.rb +1 -1
- data/lib/hexapdf/font/true_type/table.rb +1 -1
- data/lib/hexapdf/font/true_type.rb +1 -1
- data/lib/hexapdf/font/true_type_wrapper.rb +1 -1
- data/lib/hexapdf/font/type1/afm_parser.rb +1 -1
- data/lib/hexapdf/font/type1/character_metrics.rb +1 -1
- data/lib/hexapdf/font/type1/font.rb +1 -1
- data/lib/hexapdf/font/type1/font_metrics.rb +1 -1
- data/lib/hexapdf/font/type1/pfb_parser.rb +1 -1
- data/lib/hexapdf/font/type1.rb +1 -1
- data/lib/hexapdf/font/type1_wrapper.rb +1 -1
- data/lib/hexapdf/font_loader/from_configuration.rb +1 -1
- data/lib/hexapdf/font_loader/from_file.rb +1 -1
- data/lib/hexapdf/font_loader/standard14.rb +1 -1
- data/lib/hexapdf/font_loader.rb +1 -1
- data/lib/hexapdf/image_loader/jpeg.rb +1 -1
- data/lib/hexapdf/image_loader/pdf.rb +1 -1
- data/lib/hexapdf/image_loader/png.rb +1 -1
- data/lib/hexapdf/image_loader.rb +1 -1
- data/lib/hexapdf/importer.rb +1 -1
- data/lib/hexapdf/layout/box.rb +4 -2
- data/lib/hexapdf/layout/frame.rb +1 -1
- data/lib/hexapdf/layout/image_box.rb +1 -1
- data/lib/hexapdf/layout/inline_box.rb +1 -1
- data/lib/hexapdf/layout/line.rb +1 -1
- data/lib/hexapdf/layout/numeric_refinements.rb +1 -1
- data/lib/hexapdf/layout/style.rb +40 -2
- data/lib/hexapdf/layout/text_box.rb +1 -1
- data/lib/hexapdf/layout/text_fragment.rb +1 -1
- data/lib/hexapdf/layout/text_layouter.rb +1 -1
- data/lib/hexapdf/layout/text_shaper.rb +1 -1
- data/lib/hexapdf/layout/width_from_polygon.rb +2 -2
- data/lib/hexapdf/layout.rb +1 -1
- data/lib/hexapdf/name_tree_node.rb +1 -1
- data/lib/hexapdf/number_tree_node.rb +1 -1
- data/lib/hexapdf/object.rb +1 -1
- data/lib/hexapdf/parser.rb +1 -1
- 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 +1 -1
- data/lib/hexapdf/serializer.rb +1 -1
- data/lib/hexapdf/stream.rb +1 -1
- data/lib/hexapdf/task/dereference.rb +1 -1
- data/lib/hexapdf/task/optimize.rb +1 -1
- data/lib/hexapdf/task.rb +1 -1
- data/lib/hexapdf/tokenizer.rb +1 -1
- data/lib/hexapdf/type/acro_form/appearance_generator.rb +14 -7
- data/lib/hexapdf/type/acro_form/button_field.rb +53 -28
- data/lib/hexapdf/type/acro_form/choice_field.rb +1 -1
- data/lib/hexapdf/type/acro_form/field.rb +21 -2
- data/lib/hexapdf/type/acro_form/form.rb +48 -29
- data/lib/hexapdf/type/acro_form/text_field.rb +2 -2
- data/lib/hexapdf/type/acro_form/variable_text_field.rb +17 -9
- 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 +1 -1
- 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 +1 -1
- data/lib/hexapdf/type/embedded_file.rb +1 -1
- data/lib/hexapdf/type/file_specification.rb +1 -1
- data/lib/hexapdf/type/font.rb +1 -1
- data/lib/hexapdf/type/font_descriptor.rb +1 -1
- data/lib/hexapdf/type/font_simple.rb +1 -1
- data/lib/hexapdf/type/font_true_type.rb +1 -1
- data/lib/hexapdf/type/font_type0.rb +1 -1
- data/lib/hexapdf/type/font_type1.rb +1 -1
- 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/names.rb +1 -1
- data/lib/hexapdf/type/object_stream.rb +1 -1
- data/lib/hexapdf/type/page.rb +15 -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 +1 -1
- data/lib/hexapdf/type/viewer_preferences.rb +1 -1
- data/lib/hexapdf/type/xref_stream.rb +1 -1
- data/lib/hexapdf/type.rb +1 -1
- data/lib/hexapdf/utils/bit_field.rb +1 -1
- data/lib/hexapdf/utils/bit_stream.rb +1 -1
- data/lib/hexapdf/utils/graphics_helpers.rb +1 -1
- data/lib/hexapdf/utils/lru_cache.rb +1 -1
- data/lib/hexapdf/utils/math_helpers.rb +1 -1
- data/lib/hexapdf/utils/object_hash.rb +1 -1
- data/lib/hexapdf/utils/pdf_doc_encoding.rb +1 -1
- data/lib/hexapdf/utils/sorted_tree_node.rb +1 -1
- data/lib/hexapdf/version.rb +2 -2
- data/lib/hexapdf/writer.rb +1 -1
- data/lib/hexapdf/xref_section.rb +1 -1
- data/lib/hexapdf.rb +1 -1
- data/test/hexapdf/content/graphic_object/test_arc.rb +16 -7
- data/test/hexapdf/content/test_canvas.rb +63 -0
- data/test/hexapdf/content/test_color_space.rb +13 -1
- data/test/hexapdf/layout/test_box.rb +2 -0
- data/test/hexapdf/layout/test_style.rb +11 -0
- data/test/hexapdf/layout/test_width_from_polygon.rb +1 -0
- data/test/hexapdf/test_dictionary_fields.rb +24 -0
- data/test/hexapdf/test_writer.rb +2 -2
- data/test/hexapdf/type/acro_form/test_appearance_generator.rb +2 -1
- data/test/hexapdf/type/acro_form/test_button_field.rb +19 -13
- data/test/hexapdf/type/acro_form/test_field.rb +12 -0
- data/test/hexapdf/type/acro_form/test_form.rb +4 -0
- data/test/hexapdf/type/acro_form/test_text_field.rb +6 -0
- data/test/hexapdf/type/acro_form/test_variable_text_field.rb +15 -4
- data/test/hexapdf/type/test_page.rb +11 -0
- metadata +4 -3
data/test/hexapdf/test_writer.rb
CHANGED
@@ -40,7 +40,7 @@ describe HexaPDF::Writer do
|
|
40
40
|
219
|
41
41
|
%%EOF
|
42
42
|
3 0 obj
|
43
|
-
<</Producer(HexaPDF version 0.
|
43
|
+
<</Producer(HexaPDF version 0.17.2)>>
|
44
44
|
endobj
|
45
45
|
xref
|
46
46
|
3 1
|
@@ -72,7 +72,7 @@ describe HexaPDF::Writer do
|
|
72
72
|
141
|
73
73
|
%%EOF
|
74
74
|
6 0 obj
|
75
|
-
<</Producer(HexaPDF version 0.
|
75
|
+
<</Producer(HexaPDF version 0.17.2)>>
|
76
76
|
endobj
|
77
77
|
2 0 obj
|
78
78
|
<</Length 10>>stream
|
@@ -233,6 +233,7 @@ describe HexaPDF::Type::AcroForm::AppearanceGenerator do
|
|
233
233
|
end
|
234
234
|
|
235
235
|
it "creates the needed appearance streams" do
|
236
|
+
@widget[:AP][:N].delete(:Off)
|
236
237
|
@generator.create_appearances
|
237
238
|
assert_equal(:XObject, @widget[:AP][:N][:Off].type)
|
238
239
|
assert_equal(:XObject, @widget[:AP][:N][:Yes].type)
|
@@ -269,7 +270,7 @@ describe HexaPDF::Type::AcroForm::AppearanceGenerator do
|
|
269
270
|
end
|
270
271
|
|
271
272
|
it "fails if the appearance dictionaries are not set up" do
|
272
|
-
@widget[:AP][:N].delete(:
|
273
|
+
@widget[:AP][:N].delete(:Yes)
|
273
274
|
assert_raises(HexaPDF::Error) { @generator.create_appearances }
|
274
275
|
end
|
275
276
|
end
|
@@ -78,14 +78,18 @@ describe HexaPDF::Type::AcroForm::ButtonField do
|
|
78
78
|
@field[:V] = :Off
|
79
79
|
refute(@field.field_value)
|
80
80
|
@field[:V] = :Yes
|
81
|
-
|
81
|
+
assert_equal(:Yes, @field.field_value)
|
82
82
|
end
|
83
83
|
|
84
84
|
it "sets a correct field value" do
|
85
|
+
@field.create_widget(@doc.pages.add, value: :check)
|
85
86
|
@field.field_value = true
|
86
|
-
assert_equal(:
|
87
|
+
assert_equal(:check, @field[:V])
|
87
88
|
@field.field_value = false
|
88
89
|
assert_equal(:Off, @field[:V])
|
90
|
+
@field.field_value = "check"
|
91
|
+
assert_equal(:check, @field[:V])
|
92
|
+
assert_raises(HexaPDF::Error) { @field.field_value = :unknown }
|
89
93
|
end
|
90
94
|
|
91
95
|
it "returns the correct concrete field type" do
|
@@ -93,18 +97,16 @@ describe HexaPDF::Type::AcroForm::ButtonField do
|
|
93
97
|
end
|
94
98
|
|
95
99
|
it "updates the widgets after setting the field value" do
|
96
|
-
widget = @field.create_widget(@doc.pages.add)
|
100
|
+
widget = @field.create_widget(@doc.pages.add, value: :check)
|
97
101
|
@field.field_value = true
|
98
|
-
assert_equal(:
|
102
|
+
assert_equal(:check, widget[:AS])
|
99
103
|
end
|
100
104
|
|
101
|
-
it "
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
widget[:AP][:N][:On] = nil
|
107
|
-
assert_equal(:On, @field.check_box_on_name)
|
105
|
+
it "returns an array of allowed values" do
|
106
|
+
@field.create_widget(@doc.pages.add, value: "Test")
|
107
|
+
@field.create_widget(@doc.pages.add, value: "Test")
|
108
|
+
@field.create_widget(@doc.pages.add, value: :x)
|
109
|
+
assert_equal([:Test, :x], @field.allowed_values)
|
108
110
|
end
|
109
111
|
|
110
112
|
it "applies sensible default values when creating a widget" do
|
@@ -117,6 +119,10 @@ describe HexaPDF::Type::AcroForm::ButtonField do
|
|
117
119
|
assert_equal([1], widget.background_color.components)
|
118
120
|
assert_equal(:check, widget.marker_style.style)
|
119
121
|
end
|
122
|
+
|
123
|
+
it "fails if the value argument for create_widget doesn't respond to to_sym" do
|
124
|
+
assert_raises(ArgumentError) { @field.create_widget(@doc.pages.add, value: 5) }
|
125
|
+
end
|
120
126
|
end
|
121
127
|
|
122
128
|
describe "radio button" do
|
@@ -157,11 +163,11 @@ describe HexaPDF::Type::AcroForm::ButtonField do
|
|
157
163
|
assert_equal(:Test, widget[:AS])
|
158
164
|
end
|
159
165
|
|
160
|
-
it "returns an array of
|
166
|
+
it "returns an array of allowed values" do
|
161
167
|
@field.create_widget(@doc.pages.add, value: "Test")
|
162
168
|
@field.create_widget(@doc.pages.add, value: :x)
|
163
169
|
@field.create_widget(@doc.pages.add, value: :y)
|
164
|
-
assert_equal([:Test, :x, :y], @field.
|
170
|
+
assert_equal([:Test, :x, :y], @field.allowed_values)
|
165
171
|
end
|
166
172
|
|
167
173
|
it "applies sensible default values when creating a widget" do
|
@@ -17,6 +17,7 @@ describe HexaPDF::Type::AcroForm::Field do
|
|
17
17
|
before do
|
18
18
|
@doc = HexaPDF::Document.new
|
19
19
|
@field = @doc.add({}, type: :XXAcroFormField)
|
20
|
+
@doc.acro_form(create: true).root_fields << @field
|
20
21
|
end
|
21
22
|
|
22
23
|
it "must always be an indirect object" do
|
@@ -121,6 +122,17 @@ describe HexaPDF::Type::AcroForm::Field do
|
|
121
122
|
assert_equal(1, widgets.first[:X])
|
122
123
|
end
|
123
124
|
|
125
|
+
it "yields all widgets of other fields with the same full field name" do
|
126
|
+
@field[:T] = 'a'
|
127
|
+
@doc.acro_form.root_fields <<
|
128
|
+
@doc.add({T: "b", Subtype: :Widget, Rect: [0, 0, 0, 0]}, type: :XXAcroFormField) <<
|
129
|
+
@doc.add({T: "a", X: 1, Subtype: :Widget, Rect: [0, 0, 0, 0]}, type: :XXAcroFormField)
|
130
|
+
|
131
|
+
widgets = @field.each_widget.to_a
|
132
|
+
assert_kind_of(HexaPDF::Type::Annotations::Widget, *widgets)
|
133
|
+
assert_equal(1, widgets.first[:X])
|
134
|
+
end
|
135
|
+
|
124
136
|
it "yields nothing if no widgets are defined" do
|
125
137
|
assert_equal([], @field.each_widget.to_a)
|
126
138
|
end
|
@@ -144,6 +144,10 @@ describe HexaPDF::Type::AcroForm::Form do
|
|
144
144
|
assert_equal(:'Times-Roman', @acro_form.default_resources.font(font_name)[:BaseFont])
|
145
145
|
assert_equal(0, font_size)
|
146
146
|
|
147
|
+
field = @acro_form.send(method, "field", **args, font_options: {variant: :bold})
|
148
|
+
font_name, font_size = field.parse_default_appearance_string
|
149
|
+
assert_equal(:'Helvetica-Bold', @acro_form.default_resources.font(font_name)[:BaseFont])
|
150
|
+
|
147
151
|
field = @acro_form.send(method, "field", **args, font_size: 10)
|
148
152
|
font_name, font_size = field.parse_default_appearance_string
|
149
153
|
assert_equal(:Helvetica, @acro_form.default_resources.font(font_name)[:BaseFont])
|
@@ -98,6 +98,12 @@ describe HexaPDF::Type::AcroForm::TextField do
|
|
98
98
|
assert_equal('str ing', @field.field_value)
|
99
99
|
end
|
100
100
|
|
101
|
+
it "allows unsetting the value using +nil+" do
|
102
|
+
@field[:V] = "test"
|
103
|
+
@field.field_value = nil
|
104
|
+
assert_nil(@field.field_value)
|
105
|
+
end
|
106
|
+
|
101
107
|
it "updates the widgets to reflect the changed value" do
|
102
108
|
widget = @field.create_widget(@doc.pages.add, Rect: [0, 0, 0, 0])
|
103
109
|
@field.set_default_appearance_string
|
@@ -46,16 +46,27 @@ describe HexaPDF::Type::AcroForm::VariableTextField do
|
|
46
46
|
assert_equal(:Helvetica, font[:BaseFont])
|
47
47
|
end
|
48
48
|
|
49
|
-
it "allows specifying the
|
50
|
-
@field.set_default_appearance_string(font: 'Times'
|
51
|
-
assert_equal("0 g /F2
|
49
|
+
it "allows specifying the font" do
|
50
|
+
@field.set_default_appearance_string(font: 'Times')
|
51
|
+
assert_equal("0 g /F2 0 Tf", @field[:DA])
|
52
52
|
assert_equal(:'Times-Roman', @doc.acro_form.default_resources.font(:F2)[:BaseFont])
|
53
53
|
end
|
54
|
+
|
55
|
+
it "allows specifying the font options" do
|
56
|
+
@field.set_default_appearance_string(font_options: {variant: :italic})
|
57
|
+
assert_equal("0 g /F2 0 Tf", @field[:DA])
|
58
|
+
assert_equal(:'Helvetica-Oblique', @doc.acro_form.default_resources.font(:F2)[:BaseFont])
|
59
|
+
end
|
60
|
+
|
61
|
+
it "allows specifying the font size" do
|
62
|
+
@field.set_default_appearance_string(font_size: 10)
|
63
|
+
assert_equal("0 g /F1 10 Tf", @field[:DA])
|
64
|
+
end
|
54
65
|
end
|
55
66
|
|
56
67
|
describe "parse_default_appearance_string" do
|
57
68
|
it "parses the default appearance string of the field" do
|
58
|
-
@field[:DA] = "1 g
|
69
|
+
@field[:DA] = "1 g //F1 20 Tf 5 w /F2 10 Tf"
|
59
70
|
assert_equal([:F2, 10], @field.parse_default_appearance_string)
|
60
71
|
end
|
61
72
|
|
@@ -582,6 +582,17 @@ describe HexaPDF::Type::Page do
|
|
582
582
|
@page.flatten_annotations
|
583
583
|
assert_operators(@canvas.contents, [:concatenate_matrix, [0.5, 0, 0, 2, 110, 105]], range: 2)
|
584
584
|
end
|
585
|
+
end
|
586
|
+
|
587
|
+
it "yields each annotation" do
|
588
|
+
page = @doc.pages.add
|
589
|
+
annot1 = @doc.add({Type: :Annot, Subtype: :Text, Rect: [100, 100, 160, 125]})
|
590
|
+
annot2 = @doc.add({Rect: [10, 10, 70, 35]})
|
591
|
+
page[:Annots] = [annot1, nil, annot2]
|
585
592
|
|
593
|
+
annotations = page.each_annotation.to_a
|
594
|
+
assert_equal([100, 100, 160, 125], annotations[0][:Rect])
|
595
|
+
assert_equal(:Annot, annotations[0].type)
|
596
|
+
assert_equal(:Annot, annotations[1].type)
|
586
597
|
end
|
587
598
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hexapdf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.17.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Leitner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-10-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cmdparse
|
@@ -220,6 +220,7 @@ files:
|
|
220
220
|
- lib/hexapdf/cli/batch.rb
|
221
221
|
- lib/hexapdf/cli/command.rb
|
222
222
|
- lib/hexapdf/cli/files.rb
|
223
|
+
- lib/hexapdf/cli/fonts.rb
|
223
224
|
- lib/hexapdf/cli/form.rb
|
224
225
|
- lib/hexapdf/cli/image2pdf.rb
|
225
226
|
- lib/hexapdf/cli/images.rb
|
@@ -645,7 +646,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
645
646
|
requirements:
|
646
647
|
- - ">="
|
647
648
|
- !ruby/object:Gem::Version
|
648
|
-
version: '2.
|
649
|
+
version: '2.5'
|
649
650
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
650
651
|
requirements:
|
651
652
|
- - ">="
|