hexapdf 0.15.9 → 0.17.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (216) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +62 -0
  3. data/LICENSE +1 -1
  4. data/README.md +11 -2
  5. data/Rakefile +2 -1
  6. data/examples/002-graphics.rb +4 -4
  7. data/lib/hexapdf/cli/batch.rb +1 -1
  8. data/lib/hexapdf/cli/command.rb +10 -1
  9. data/lib/hexapdf/cli/files.rb +1 -1
  10. data/lib/hexapdf/cli/fonts.rb +145 -0
  11. data/lib/hexapdf/cli/form.rb +27 -26
  12. data/lib/hexapdf/cli/image2pdf.rb +1 -1
  13. data/lib/hexapdf/cli/images.rb +1 -10
  14. data/lib/hexapdf/cli/info.rb +1 -1
  15. data/lib/hexapdf/cli/inspect.rb +1 -1
  16. data/lib/hexapdf/cli/merge.rb +1 -1
  17. data/lib/hexapdf/cli/modify.rb +1 -1
  18. data/lib/hexapdf/cli/optimize.rb +1 -1
  19. data/lib/hexapdf/cli/split.rb +1 -1
  20. data/lib/hexapdf/cli/watermark.rb +1 -1
  21. data/lib/hexapdf/cli.rb +3 -1
  22. data/lib/hexapdf/composer.rb +1 -1
  23. data/lib/hexapdf/configuration.rb +11 -2
  24. data/lib/hexapdf/content/canvas.rb +658 -167
  25. data/lib/hexapdf/content/color_space.rb +185 -3
  26. data/lib/hexapdf/content/graphic_object/arc.rb +111 -12
  27. data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +67 -1
  28. data/lib/hexapdf/content/graphic_object/geom2d.rb +14 -1
  29. data/lib/hexapdf/content/graphic_object/solid_arc.rb +1 -1
  30. data/lib/hexapdf/content/graphic_object.rb +1 -1
  31. data/lib/hexapdf/content/graphics_state.rb +1 -1
  32. data/lib/hexapdf/content/operator.rb +1 -1
  33. data/lib/hexapdf/content/parser.rb +1 -1
  34. data/lib/hexapdf/content/processor.rb +1 -1
  35. data/lib/hexapdf/content/transformation_matrix.rb +1 -1
  36. data/lib/hexapdf/content.rb +1 -1
  37. data/lib/hexapdf/data_dir.rb +1 -1
  38. data/lib/hexapdf/dictionary.rb +1 -1
  39. data/lib/hexapdf/dictionary_fields.rb +30 -4
  40. data/lib/hexapdf/document/files.rb +3 -3
  41. data/lib/hexapdf/document/fonts.rb +1 -1
  42. data/lib/hexapdf/document/images.rb +1 -1
  43. data/lib/hexapdf/document/pages.rb +1 -1
  44. data/lib/hexapdf/document.rb +1 -1
  45. data/lib/hexapdf/encryption/aes.rb +1 -1
  46. data/lib/hexapdf/encryption/arc4.rb +1 -1
  47. data/lib/hexapdf/encryption/fast_aes.rb +1 -1
  48. data/lib/hexapdf/encryption/fast_arc4.rb +1 -1
  49. data/lib/hexapdf/encryption/identity.rb +1 -1
  50. data/lib/hexapdf/encryption/ruby_aes.rb +1 -1
  51. data/lib/hexapdf/encryption/ruby_arc4.rb +1 -1
  52. data/lib/hexapdf/encryption/security_handler.rb +1 -1
  53. data/lib/hexapdf/encryption/standard_security_handler.rb +1 -1
  54. data/lib/hexapdf/encryption.rb +1 -1
  55. data/lib/hexapdf/error.rb +1 -1
  56. data/lib/hexapdf/filter/ascii85_decode.rb +1 -1
  57. data/lib/hexapdf/filter/ascii_hex_decode.rb +1 -1
  58. data/lib/hexapdf/filter/crypt.rb +1 -1
  59. data/lib/hexapdf/filter/encryption.rb +1 -1
  60. data/lib/hexapdf/filter/flate_decode.rb +1 -1
  61. data/lib/hexapdf/filter/lzw_decode.rb +1 -1
  62. data/lib/hexapdf/filter/pass_through.rb +1 -1
  63. data/lib/hexapdf/filter/predictor.rb +1 -1
  64. data/lib/hexapdf/filter/run_length_decode.rb +1 -1
  65. data/lib/hexapdf/filter.rb +1 -1
  66. data/lib/hexapdf/font/cmap/parser.rb +1 -1
  67. data/lib/hexapdf/font/cmap/writer.rb +1 -1
  68. data/lib/hexapdf/font/cmap.rb +1 -1
  69. data/lib/hexapdf/font/encoding/base.rb +1 -1
  70. data/lib/hexapdf/font/encoding/difference_encoding.rb +1 -1
  71. data/lib/hexapdf/font/encoding/glyph_list.rb +1 -1
  72. data/lib/hexapdf/font/encoding/mac_expert_encoding.rb +1 -1
  73. data/lib/hexapdf/font/encoding/mac_roman_encoding.rb +1 -1
  74. data/lib/hexapdf/font/encoding/standard_encoding.rb +1 -1
  75. data/lib/hexapdf/font/encoding/symbol_encoding.rb +1 -1
  76. data/lib/hexapdf/font/encoding/win_ansi_encoding.rb +1 -1
  77. data/lib/hexapdf/font/encoding/zapf_dingbats_encoding.rb +1 -1
  78. data/lib/hexapdf/font/encoding.rb +1 -1
  79. data/lib/hexapdf/font/invalid_glyph.rb +1 -1
  80. data/lib/hexapdf/font/true_type/builder.rb +1 -1
  81. data/lib/hexapdf/font/true_type/font.rb +1 -1
  82. data/lib/hexapdf/font/true_type/optimizer.rb +1 -1
  83. data/lib/hexapdf/font/true_type/subsetter.rb +1 -1
  84. data/lib/hexapdf/font/true_type/table/cmap.rb +1 -1
  85. data/lib/hexapdf/font/true_type/table/cmap_subtable.rb +1 -1
  86. data/lib/hexapdf/font/true_type/table/directory.rb +1 -1
  87. data/lib/hexapdf/font/true_type/table/glyf.rb +1 -1
  88. data/lib/hexapdf/font/true_type/table/head.rb +1 -1
  89. data/lib/hexapdf/font/true_type/table/hhea.rb +1 -1
  90. data/lib/hexapdf/font/true_type/table/hmtx.rb +1 -1
  91. data/lib/hexapdf/font/true_type/table/kern.rb +1 -1
  92. data/lib/hexapdf/font/true_type/table/loca.rb +1 -1
  93. data/lib/hexapdf/font/true_type/table/maxp.rb +1 -1
  94. data/lib/hexapdf/font/true_type/table/name.rb +1 -1
  95. data/lib/hexapdf/font/true_type/table/os2.rb +1 -1
  96. data/lib/hexapdf/font/true_type/table/post.rb +1 -1
  97. data/lib/hexapdf/font/true_type/table.rb +1 -1
  98. data/lib/hexapdf/font/true_type.rb +1 -1
  99. data/lib/hexapdf/font/true_type_wrapper.rb +1 -1
  100. data/lib/hexapdf/font/type1/afm_parser.rb +1 -1
  101. data/lib/hexapdf/font/type1/character_metrics.rb +1 -1
  102. data/lib/hexapdf/font/type1/font.rb +1 -1
  103. data/lib/hexapdf/font/type1/font_metrics.rb +1 -1
  104. data/lib/hexapdf/font/type1/pfb_parser.rb +1 -1
  105. data/lib/hexapdf/font/type1.rb +1 -1
  106. data/lib/hexapdf/font/type1_wrapper.rb +1 -1
  107. data/lib/hexapdf/font_loader/from_configuration.rb +1 -1
  108. data/lib/hexapdf/font_loader/from_file.rb +1 -1
  109. data/lib/hexapdf/font_loader/standard14.rb +1 -1
  110. data/lib/hexapdf/font_loader.rb +1 -1
  111. data/lib/hexapdf/image_loader/jpeg.rb +1 -1
  112. data/lib/hexapdf/image_loader/pdf.rb +1 -1
  113. data/lib/hexapdf/image_loader/png.rb +1 -1
  114. data/lib/hexapdf/image_loader.rb +1 -1
  115. data/lib/hexapdf/importer.rb +1 -1
  116. data/lib/hexapdf/layout/box.rb +4 -2
  117. data/lib/hexapdf/layout/frame.rb +1 -1
  118. data/lib/hexapdf/layout/image_box.rb +1 -1
  119. data/lib/hexapdf/layout/inline_box.rb +1 -1
  120. data/lib/hexapdf/layout/line.rb +1 -1
  121. data/lib/hexapdf/layout/numeric_refinements.rb +1 -1
  122. data/lib/hexapdf/layout/style.rb +40 -2
  123. data/lib/hexapdf/layout/text_box.rb +1 -1
  124. data/lib/hexapdf/layout/text_fragment.rb +1 -1
  125. data/lib/hexapdf/layout/text_layouter.rb +1 -1
  126. data/lib/hexapdf/layout/text_shaper.rb +1 -1
  127. data/lib/hexapdf/layout/width_from_polygon.rb +2 -2
  128. data/lib/hexapdf/layout.rb +1 -1
  129. data/lib/hexapdf/name_tree_node.rb +1 -1
  130. data/lib/hexapdf/number_tree_node.rb +1 -1
  131. data/lib/hexapdf/object.rb +1 -1
  132. data/lib/hexapdf/parser.rb +1 -1
  133. data/lib/hexapdf/pdf_array.rb +1 -1
  134. data/lib/hexapdf/rectangle.rb +1 -1
  135. data/lib/hexapdf/reference.rb +1 -1
  136. data/lib/hexapdf/revision.rb +1 -1
  137. data/lib/hexapdf/revisions.rb +1 -1
  138. data/lib/hexapdf/serializer.rb +1 -1
  139. data/lib/hexapdf/stream.rb +1 -1
  140. data/lib/hexapdf/task/dereference.rb +1 -1
  141. data/lib/hexapdf/task/optimize.rb +1 -1
  142. data/lib/hexapdf/task.rb +1 -1
  143. data/lib/hexapdf/tokenizer.rb +1 -1
  144. data/lib/hexapdf/type/acro_form/appearance_generator.rb +14 -7
  145. data/lib/hexapdf/type/acro_form/button_field.rb +53 -28
  146. data/lib/hexapdf/type/acro_form/choice_field.rb +1 -1
  147. data/lib/hexapdf/type/acro_form/field.rb +21 -2
  148. data/lib/hexapdf/type/acro_form/form.rb +48 -29
  149. data/lib/hexapdf/type/acro_form/text_field.rb +2 -2
  150. data/lib/hexapdf/type/acro_form/variable_text_field.rb +17 -9
  151. data/lib/hexapdf/type/acro_form.rb +1 -1
  152. data/lib/hexapdf/type/action.rb +1 -1
  153. data/lib/hexapdf/type/actions/go_to.rb +1 -1
  154. data/lib/hexapdf/type/actions/go_to_r.rb +1 -1
  155. data/lib/hexapdf/type/actions/launch.rb +1 -1
  156. data/lib/hexapdf/type/actions/uri.rb +1 -1
  157. data/lib/hexapdf/type/actions.rb +1 -1
  158. data/lib/hexapdf/type/annotation.rb +1 -1
  159. data/lib/hexapdf/type/annotations/link.rb +1 -1
  160. data/lib/hexapdf/type/annotations/markup_annotation.rb +1 -1
  161. data/lib/hexapdf/type/annotations/text.rb +1 -1
  162. data/lib/hexapdf/type/annotations/widget.rb +2 -2
  163. data/lib/hexapdf/type/annotations.rb +1 -1
  164. data/lib/hexapdf/type/catalog.rb +1 -1
  165. data/lib/hexapdf/type/cid_font.rb +1 -1
  166. data/lib/hexapdf/type/embedded_file.rb +1 -1
  167. data/lib/hexapdf/type/file_specification.rb +1 -1
  168. data/lib/hexapdf/type/font.rb +1 -1
  169. data/lib/hexapdf/type/font_descriptor.rb +1 -1
  170. data/lib/hexapdf/type/font_simple.rb +1 -1
  171. data/lib/hexapdf/type/font_true_type.rb +1 -1
  172. data/lib/hexapdf/type/font_type0.rb +1 -1
  173. data/lib/hexapdf/type/font_type1.rb +1 -1
  174. data/lib/hexapdf/type/font_type3.rb +1 -1
  175. data/lib/hexapdf/type/form.rb +1 -1
  176. data/lib/hexapdf/type/graphics_state_parameter.rb +1 -1
  177. data/lib/hexapdf/type/icon_fit.rb +1 -1
  178. data/lib/hexapdf/type/image.rb +1 -1
  179. data/lib/hexapdf/type/info.rb +1 -1
  180. data/lib/hexapdf/type/names.rb +1 -1
  181. data/lib/hexapdf/type/object_stream.rb +1 -1
  182. data/lib/hexapdf/type/page.rb +15 -1
  183. data/lib/hexapdf/type/page_tree_node.rb +1 -1
  184. data/lib/hexapdf/type/resources.rb +1 -1
  185. data/lib/hexapdf/type/trailer.rb +1 -1
  186. data/lib/hexapdf/type/viewer_preferences.rb +1 -1
  187. data/lib/hexapdf/type/xref_stream.rb +1 -1
  188. data/lib/hexapdf/type.rb +1 -1
  189. data/lib/hexapdf/utils/bit_field.rb +1 -1
  190. data/lib/hexapdf/utils/bit_stream.rb +1 -1
  191. data/lib/hexapdf/utils/graphics_helpers.rb +1 -1
  192. data/lib/hexapdf/utils/lru_cache.rb +1 -1
  193. data/lib/hexapdf/utils/math_helpers.rb +1 -1
  194. data/lib/hexapdf/utils/object_hash.rb +1 -1
  195. data/lib/hexapdf/utils/pdf_doc_encoding.rb +1 -1
  196. data/lib/hexapdf/utils/sorted_tree_node.rb +1 -1
  197. data/lib/hexapdf/version.rb +2 -2
  198. data/lib/hexapdf/writer.rb +1 -1
  199. data/lib/hexapdf/xref_section.rb +1 -1
  200. data/lib/hexapdf.rb +1 -1
  201. data/test/hexapdf/content/graphic_object/test_arc.rb +16 -7
  202. data/test/hexapdf/content/test_canvas.rb +63 -0
  203. data/test/hexapdf/content/test_color_space.rb +13 -1
  204. data/test/hexapdf/layout/test_box.rb +2 -0
  205. data/test/hexapdf/layout/test_style.rb +11 -0
  206. data/test/hexapdf/layout/test_width_from_polygon.rb +1 -0
  207. data/test/hexapdf/test_dictionary_fields.rb +24 -0
  208. data/test/hexapdf/test_writer.rb +2 -2
  209. data/test/hexapdf/type/acro_form/test_appearance_generator.rb +2 -1
  210. data/test/hexapdf/type/acro_form/test_button_field.rb +19 -13
  211. data/test/hexapdf/type/acro_form/test_field.rb +12 -0
  212. data/test/hexapdf/type/acro_form/test_form.rb +4 -0
  213. data/test/hexapdf/type/acro_form/test_text_field.rb +6 -0
  214. data/test/hexapdf/type/acro_form/test_variable_text_field.rb +15 -4
  215. data/test/hexapdf/type/test_page.rb +11 -0
  216. metadata +4 -3
@@ -40,7 +40,7 @@ describe HexaPDF::Writer do
40
40
  219
41
41
  %%EOF
42
42
  3 0 obj
43
- <</Producer(HexaPDF version 0.15.9)>>
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.15.9)>>
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(:Off)
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
- assert(@field.field_value)
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(:Yes, @field[:V])
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(:Yes, widget[:AS])
102
+ assert_equal(:check, widget[:AS])
99
103
  end
100
104
 
101
- it "can determine the name of the on state" do
102
- assert_equal(:Yes, @field.check_box_on_name)
103
- widget = @field.create_widget(@doc.pages.add)
104
- assert_equal(:Yes, @field.check_box_on_name)
105
- widget[:AP][:N].delete(:Yes)
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 possible values" do
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.radio_button_values)
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 used font and font size" do
50
- @field.set_default_appearance_string(font: 'Times', font_size: 10)
51
- assert_equal("0 g /F2 10 Tf", @field[:DA])
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 /F1 20 Tf 5 w /F2 10 Tf"
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.15.9
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-09-04 00:00:00.000000000 Z
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.4'
649
+ version: '2.5'
649
650
  required_rubygems_version: !ruby/object:Gem::Requirement
650
651
  requirements:
651
652
  - - ">="