hexapdf 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +41 -0
  3. data/lib/hexapdf/cli/command.rb +63 -63
  4. data/lib/hexapdf/cli/inspect.rb +1 -1
  5. data/lib/hexapdf/cli/modify.rb +0 -1
  6. data/lib/hexapdf/cli/optimize.rb +5 -5
  7. data/lib/hexapdf/configuration.rb +21 -0
  8. data/lib/hexapdf/content/graphics_state.rb +1 -1
  9. data/lib/hexapdf/digital_signature/signing/signed_data_creator.rb +1 -1
  10. data/lib/hexapdf/document/annotations.rb +115 -0
  11. data/lib/hexapdf/document.rb +30 -7
  12. data/lib/hexapdf/font/true_type_wrapper.rb +1 -0
  13. data/lib/hexapdf/font/type1_wrapper.rb +1 -0
  14. data/lib/hexapdf/type/acro_form/java_script_actions.rb +9 -2
  15. data/lib/hexapdf/type/acro_form/text_field.rb +9 -2
  16. data/lib/hexapdf/type/annotation.rb +59 -1
  17. data/lib/hexapdf/type/annotations/appearance_generator.rb +273 -0
  18. data/lib/hexapdf/type/annotations/border_styling.rb +160 -0
  19. data/lib/hexapdf/type/annotations/line.rb +521 -0
  20. data/lib/hexapdf/type/annotations/widget.rb +2 -96
  21. data/lib/hexapdf/type/annotations.rb +3 -0
  22. data/lib/hexapdf/type/form.rb +2 -2
  23. data/lib/hexapdf/version.rb +1 -1
  24. data/lib/hexapdf/writer.rb +0 -1
  25. data/lib/hexapdf/xref_section.rb +7 -4
  26. data/test/hexapdf/content/test_graphics_state.rb +2 -3
  27. data/test/hexapdf/content/test_operator.rb +4 -5
  28. data/test/hexapdf/digital_signature/test_cms_handler.rb +7 -8
  29. data/test/hexapdf/digital_signature/test_handler.rb +2 -3
  30. data/test/hexapdf/digital_signature/test_pkcs1_handler.rb +1 -2
  31. data/test/hexapdf/document/test_annotations.rb +33 -0
  32. data/test/hexapdf/font/test_true_type_wrapper.rb +7 -0
  33. data/test/hexapdf/font/test_type1_wrapper.rb +7 -0
  34. data/test/hexapdf/task/test_optimize.rb +1 -1
  35. data/test/hexapdf/test_document.rb +11 -3
  36. data/test/hexapdf/test_stream.rb +1 -2
  37. data/test/hexapdf/test_xref_section.rb +1 -1
  38. data/test/hexapdf/type/acro_form/test_java_script_actions.rb +21 -0
  39. data/test/hexapdf/type/acro_form/test_text_field.rb +7 -1
  40. data/test/hexapdf/type/annotations/test_appearance_generator.rb +398 -0
  41. data/test/hexapdf/type/annotations/test_border_styling.rb +114 -0
  42. data/test/hexapdf/type/annotations/test_line.rb +189 -0
  43. data/test/hexapdf/type/annotations/test_widget.rb +0 -81
  44. data/test/hexapdf/type/test_annotation.rb +55 -0
  45. data/test/hexapdf/type/test_form.rb +6 -0
  46. metadata +10 -2
@@ -69,87 +69,6 @@ describe HexaPDF::Type::Annotations::Widget do
69
69
  end
70
70
  end
71
71
 
72
- describe "border_style" do
73
- before do
74
- @widget[:MK] = {BC: [1, 0, 1]}
75
- @color = HexaPDF::Content::ColorSpace.prenormalized_device_color([1, 0, 1])
76
- end
77
-
78
- describe "getter" do
79
- it "no /Border, /BS or /MK set" do
80
- @widget.delete(:MK)
81
- assert_equal([1, nil, :solid, 0, 0], @widget.border_style.to_a)
82
- end
83
-
84
- it "no /Border, /BS but with /MK empty" do
85
- @widget[:MK].delete(:BC)
86
- assert_equal([1, nil, :solid, 0, 0], @widget.border_style.to_a)
87
- end
88
-
89
- it "uses the color from /MK" do
90
- assert_equal([1, @color, :solid, 0, 0], @widget.border_style.to_a)
91
- @widget[:MK][:BC] = []
92
- assert_equal([1, nil, :solid, 0, 0], @widget.border_style.to_a)
93
- end
94
-
95
- it "uses the data from /Border" do
96
- @widget[:Border] = [1, 2, 3, [1, 2]]
97
- assert_equal([3, @color, [1, 2], 1, 2], @widget.border_style.to_a)
98
- end
99
-
100
- it "uses the data from /BS, overriding /Border values" do
101
- @widget[:Border] = [1, 2, 3, [1, 2]]
102
- @widget[:BS] = {W: 5, S: :D, D: [5, 6]}
103
- assert_equal([5, @color, [5, 6], 0, 0], @widget.border_style.to_a)
104
-
105
- [[:S, :solid], [:D, [5, 6]], [:B, :beveled], [:I, :inset],
106
- [:U, :underlined], [:Unknown, :solid]].each do |val, result|
107
- @widget[:BS] = {S: val, D: [5, 6]}
108
- assert_equal([1, @color, result, 0, 0], @widget.border_style.to_a)
109
- end
110
- end
111
- end
112
-
113
- describe "setter" do
114
- it "returns self" do
115
- assert_equal(@widget, @widget.border_style(width: 1))
116
- end
117
-
118
- it "sets the color" do
119
- @widget.border_style(color: [1.0, 51, 1.0])
120
- assert_equal([1, 0.2, 1], @widget[:MK][:BC].value)
121
-
122
- @widget.border_style(color: :transparent)
123
- assert_equal([], @widget[:MK][:BC].value)
124
- end
125
-
126
- it "sets the width" do
127
- @widget.border_style(width: 2)
128
- assert_equal(2, @widget[:BS][:W])
129
- end
130
-
131
- it "sets the style" do
132
- [[:solid, :S], [[5, 6], :D], [:beveled, :B], [:inset, :I], [:underlined, :U]].each do |val, r|
133
- @widget.border_style(style: val)
134
- assert_equal(r, @widget[:BS][:S])
135
- assert_equal(val, @widget[:BS][:D].value) if r == :D
136
- end
137
- end
138
-
139
- it "overrides all priorly set values" do
140
- @widget.border_style(width: 3, style: :inset, color: [1])
141
- @widget.border_style(width: 5)
142
- border_style = @widget.border_style
143
- assert_equal(:solid, border_style.style)
144
- assert_equal([0], border_style.color.components)
145
- end
146
-
147
- it "raises an error for an unknown style" do
148
- assert_raises(ArgumentError) { @widget.border_style(style: :unknown) }
149
- end
150
- end
151
- end
152
-
153
72
  describe "marker_style" do
154
73
  before do
155
74
  @chars = %w[4 l 8 u n H S]
@@ -113,6 +113,14 @@ describe HexaPDF::Type::Annotation do
113
113
  end
114
114
  end
115
115
 
116
+ describe "regenerate_appearance" do
117
+ it "regenerates the appearance using the data from the annotation object" do
118
+ @annot[:Subtype] = :Unknown
119
+ error = assert_raises(HexaPDF::Error) { @annot.regenerate_appearance }
120
+ assert_match(/Unknown.*not.*supported/, error.message)
121
+ end
122
+ end
123
+
116
124
  describe "flags" do
117
125
  it "returns all flags" do
118
126
  assert_equal([:invisible, :hidden, :no_view], @annot.flags)
@@ -139,6 +147,53 @@ describe HexaPDF::Type::Annotation do
139
147
  end
140
148
  end
141
149
 
150
+ describe "contents" do
151
+ it "returns the contents value" do
152
+ assert_nil(@annot.contents)
153
+ @annot[:Contents] = "test"
154
+ assert_equal("test", @annot.contents)
155
+ end
156
+
157
+ it "sets the contents value" do
158
+ assert_same(@annot, @annot.contents("Test"))
159
+ assert_equal("Test", @annot[:Contents])
160
+ @annot.contents(nil)
161
+ assert_nil(@annot[:Contents])
162
+ end
163
+ end
164
+
165
+ describe "opacity" do
166
+ it "returns the opacity values" do
167
+ opacity = @annot.opacity
168
+ assert_equal(1, opacity.fill_alpha)
169
+ assert_equal(1, opacity.stroke_alpha)
170
+
171
+ @annot[:CA] = 0.5
172
+ opacity = @annot.opacity
173
+ assert_equal(0.5, opacity.fill_alpha)
174
+ assert_equal(0.5, opacity.stroke_alpha)
175
+
176
+ @annot[:ca] = 0.3
177
+ opacity = @annot.opacity
178
+ assert_equal(0.3, opacity.fill_alpha)
179
+ assert_equal(0.5, opacity.stroke_alpha)
180
+ end
181
+
182
+ it "sets the opacity values" do
183
+ @annot.opacity(fill_alpha: 0.3)
184
+ refute(@annot.key?(:CA))
185
+ assert_equal(0.3, @annot[:ca])
186
+
187
+ @annot.opacity(stroke_alpha: 0.5)
188
+ assert_equal(0.3, @annot[:ca])
189
+ assert_equal(0.5, @annot[:CA])
190
+
191
+ @annot.opacity(stroke_alpha: 0.1, fill_alpha: 0.2)
192
+ assert_equal(0.1, @annot[:CA])
193
+ assert_equal(0.2, @annot[:ca])
194
+ end
195
+ end
196
+
142
197
  describe "validation" do
143
198
  it "makes sure that empty appearance stream dictionaries don't cause validation errors" do
144
199
  assert(@annot.validate)
@@ -125,6 +125,12 @@ describe HexaPDF::Type::Form do
125
125
  [:restore_graphics_state]])
126
126
  end
127
127
 
128
+ it "doesn't move the origin if translate is false" do
129
+ @form[:BBox] = [-10, -5, 100, 300]
130
+ @form.canvas(translate: false).line_width = 5
131
+ assert_operators(@form, [[:set_line_width, [5]]])
132
+ end
133
+
128
134
  it "fails if the form XObject already has data" do
129
135
  @form.stream = '10 w'
130
136
  assert_raises(HexaPDF::Error) { @form.canvas }
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hexapdf
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Leitner
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-01-08 00:00:00.000000000 Z
10
+ date: 2025-02-10 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: cmdparse
@@ -371,6 +371,7 @@ files:
371
371
  - lib/hexapdf/digital_signature/signing/timestamp_handler.rb
372
372
  - lib/hexapdf/digital_signature/verification_result.rb
373
373
  - lib/hexapdf/document.rb
374
+ - lib/hexapdf/document/annotations.rb
374
375
  - lib/hexapdf/document/destinations.rb
375
376
  - lib/hexapdf/document/files.rb
376
377
  - lib/hexapdf/document/fonts.rb
@@ -507,6 +508,9 @@ files:
507
508
  - lib/hexapdf/type/actions/uri.rb
508
509
  - lib/hexapdf/type/annotation.rb
509
510
  - lib/hexapdf/type/annotations.rb
511
+ - lib/hexapdf/type/annotations/appearance_generator.rb
512
+ - lib/hexapdf/type/annotations/border_styling.rb
513
+ - lib/hexapdf/type/annotations/line.rb
510
514
  - lib/hexapdf/type/annotations/link.rb
511
515
  - lib/hexapdf/type/annotations/markup_annotation.rb
512
516
  - lib/hexapdf/type/annotations/text.rb
@@ -661,6 +665,7 @@ files:
661
665
  - test/hexapdf/digital_signature/test_signatures.rb
662
666
  - test/hexapdf/digital_signature/test_signing.rb
663
667
  - test/hexapdf/digital_signature/test_verification_result.rb
668
+ - test/hexapdf/document/test_annotations.rb
664
669
  - test/hexapdf/document/test_destinations.rb
665
670
  - test/hexapdf/document/test_files.rb
666
671
  - test/hexapdf/document/test_fonts.rb
@@ -785,6 +790,9 @@ files:
785
790
  - test/hexapdf/type/actions/test_launch.rb
786
791
  - test/hexapdf/type/actions/test_set_ocg_state.rb
787
792
  - test/hexapdf/type/actions/test_uri.rb
793
+ - test/hexapdf/type/annotations/test_appearance_generator.rb
794
+ - test/hexapdf/type/annotations/test_border_styling.rb
795
+ - test/hexapdf/type/annotations/test_line.rb
788
796
  - test/hexapdf/type/annotations/test_markup_annotation.rb
789
797
  - test/hexapdf/type/annotations/test_text.rb
790
798
  - test/hexapdf/type/annotations/test_widget.rb