hexapdf 1.0.2 → 1.1.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 (282) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -1
  3. data/LICENSE +1 -1
  4. data/examples/009-text_layouter_alignment.rb +4 -0
  5. data/examples/010-text_layouter_inline_boxes.rb +4 -0
  6. data/examples/011-text_layouter_line_wrapping.rb +4 -0
  7. data/examples/012-text_layouter_styling.rb +9 -4
  8. data/examples/013-text_layouter_shapes.rb +5 -0
  9. data/examples/015-boxes.rb +3 -0
  10. data/examples/016-frame_automatic_box_placement.rb +3 -0
  11. data/examples/017-frame_text_flow.rb +3 -0
  12. data/examples/{028-frame_mask_mode.rb → 028-composer_mask_mode.rb} +3 -3
  13. data/lib/hexapdf/cli/batch.rb +1 -1
  14. data/lib/hexapdf/cli/command.rb +2 -2
  15. data/lib/hexapdf/cli/files.rb +1 -1
  16. data/lib/hexapdf/cli/fonts.rb +1 -1
  17. data/lib/hexapdf/cli/form.rb +1 -1
  18. data/lib/hexapdf/cli/image2pdf.rb +1 -1
  19. data/lib/hexapdf/cli/images.rb +1 -1
  20. data/lib/hexapdf/cli/info.rb +1 -1
  21. data/lib/hexapdf/cli/inspect.rb +6 -3
  22. data/lib/hexapdf/cli/merge.rb +1 -1
  23. data/lib/hexapdf/cli/modify.rb +1 -1
  24. data/lib/hexapdf/cli/optimize.rb +1 -1
  25. data/lib/hexapdf/cli/split.rb +1 -1
  26. data/lib/hexapdf/cli/usage.rb +1 -1
  27. data/lib/hexapdf/cli/watermark.rb +1 -1
  28. data/lib/hexapdf/cli.rb +1 -1
  29. data/lib/hexapdf/composer.rb +1 -1
  30. data/lib/hexapdf/configuration.rb +6 -1
  31. data/lib/hexapdf/content/canvas.rb +1 -1
  32. data/lib/hexapdf/content/canvas_composer.rb +1 -1
  33. data/lib/hexapdf/content/color_space.rb +1 -1
  34. data/lib/hexapdf/content/graphic_object/arc.rb +1 -1
  35. data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +1 -1
  36. data/lib/hexapdf/content/graphic_object/geom2d.rb +1 -1
  37. data/lib/hexapdf/content/graphic_object/solid_arc.rb +1 -1
  38. data/lib/hexapdf/content/graphic_object.rb +1 -1
  39. data/lib/hexapdf/content/graphics_state.rb +1 -1
  40. data/lib/hexapdf/content/operator.rb +1 -1
  41. data/lib/hexapdf/content/parser.rb +22 -25
  42. data/lib/hexapdf/content/processor.rb +1 -1
  43. data/lib/hexapdf/content/transformation_matrix.rb +1 -1
  44. data/lib/hexapdf/content.rb +1 -1
  45. data/lib/hexapdf/data_dir.rb +1 -1
  46. data/lib/hexapdf/dictionary.rb +1 -1
  47. data/lib/hexapdf/dictionary_fields.rb +1 -1
  48. data/lib/hexapdf/digital_signature/cms_handler.rb +1 -1
  49. data/lib/hexapdf/digital_signature/handler.rb +1 -1
  50. data/lib/hexapdf/digital_signature/pkcs1_handler.rb +1 -1
  51. data/lib/hexapdf/digital_signature/signature.rb +1 -1
  52. data/lib/hexapdf/digital_signature/signatures.rb +1 -1
  53. data/lib/hexapdf/digital_signature/signing/default_handler.rb +1 -1
  54. data/lib/hexapdf/digital_signature/signing/signed_data_creator.rb +1 -1
  55. data/lib/hexapdf/digital_signature/signing/timestamp_handler.rb +1 -1
  56. data/lib/hexapdf/digital_signature/signing.rb +1 -1
  57. data/lib/hexapdf/digital_signature/verification_result.rb +1 -1
  58. data/lib/hexapdf/digital_signature.rb +1 -1
  59. data/lib/hexapdf/document/destinations.rb +1 -1
  60. data/lib/hexapdf/document/files.rb +1 -1
  61. data/lib/hexapdf/document/fonts.rb +1 -1
  62. data/lib/hexapdf/document/images.rb +1 -1
  63. data/lib/hexapdf/document/layout.rb +1 -1
  64. data/lib/hexapdf/document/metadata.rb +1 -1
  65. data/lib/hexapdf/document/pages.rb +1 -1
  66. data/lib/hexapdf/document.rb +1 -1
  67. data/lib/hexapdf/encryption/aes.rb +1 -1
  68. data/lib/hexapdf/encryption/arc4.rb +3 -3
  69. data/lib/hexapdf/encryption/fast_aes.rb +1 -1
  70. data/lib/hexapdf/encryption/fast_arc4.rb +1 -1
  71. data/lib/hexapdf/encryption/identity.rb +1 -1
  72. data/lib/hexapdf/encryption/ruby_aes.rb +1 -1
  73. data/lib/hexapdf/encryption/ruby_arc4.rb +1 -1
  74. data/lib/hexapdf/encryption/security_handler.rb +1 -1
  75. data/lib/hexapdf/encryption/standard_security_handler.rb +1 -1
  76. data/lib/hexapdf/encryption.rb +1 -1
  77. data/lib/hexapdf/error.rb +1 -1
  78. data/lib/hexapdf/filter/ascii85_decode.rb +1 -1
  79. data/lib/hexapdf/filter/ascii_hex_decode.rb +1 -1
  80. data/lib/hexapdf/filter/crypt.rb +1 -1
  81. data/lib/hexapdf/filter/encryption.rb +1 -1
  82. data/lib/hexapdf/filter/flate_decode.rb +1 -1
  83. data/lib/hexapdf/filter/lzw_decode.rb +1 -1
  84. data/lib/hexapdf/filter/pass_through.rb +1 -1
  85. data/lib/hexapdf/filter/predictor.rb +1 -1
  86. data/lib/hexapdf/filter/run_length_decode.rb +1 -1
  87. data/lib/hexapdf/filter.rb +1 -1
  88. data/lib/hexapdf/font/cmap/parser.rb +1 -1
  89. data/lib/hexapdf/font/cmap/writer.rb +1 -1
  90. data/lib/hexapdf/font/cmap.rb +1 -1
  91. data/lib/hexapdf/font/encoding/base.rb +1 -1
  92. data/lib/hexapdf/font/encoding/difference_encoding.rb +1 -1
  93. data/lib/hexapdf/font/encoding/glyph_list.rb +1 -1
  94. data/lib/hexapdf/font/encoding/mac_expert_encoding.rb +1 -1
  95. data/lib/hexapdf/font/encoding/mac_roman_encoding.rb +1 -1
  96. data/lib/hexapdf/font/encoding/standard_encoding.rb +1 -1
  97. data/lib/hexapdf/font/encoding/symbol_encoding.rb +1 -1
  98. data/lib/hexapdf/font/encoding/win_ansi_encoding.rb +1 -1
  99. data/lib/hexapdf/font/encoding/zapf_dingbats_encoding.rb +1 -1
  100. data/lib/hexapdf/font/encoding.rb +1 -1
  101. data/lib/hexapdf/font/invalid_glyph.rb +1 -1
  102. data/lib/hexapdf/font/true_type/builder.rb +1 -1
  103. data/lib/hexapdf/font/true_type/font.rb +1 -1
  104. data/lib/hexapdf/font/true_type/optimizer.rb +1 -1
  105. data/lib/hexapdf/font/true_type/subsetter.rb +1 -1
  106. data/lib/hexapdf/font/true_type/table/cmap.rb +1 -1
  107. data/lib/hexapdf/font/true_type/table/cmap_subtable.rb +1 -1
  108. data/lib/hexapdf/font/true_type/table/directory.rb +1 -1
  109. data/lib/hexapdf/font/true_type/table/glyf.rb +1 -1
  110. data/lib/hexapdf/font/true_type/table/head.rb +1 -1
  111. data/lib/hexapdf/font/true_type/table/hhea.rb +1 -1
  112. data/lib/hexapdf/font/true_type/table/hmtx.rb +1 -1
  113. data/lib/hexapdf/font/true_type/table/kern.rb +1 -1
  114. data/lib/hexapdf/font/true_type/table/loca.rb +1 -1
  115. data/lib/hexapdf/font/true_type/table/maxp.rb +1 -1
  116. data/lib/hexapdf/font/true_type/table/name.rb +1 -1
  117. data/lib/hexapdf/font/true_type/table/os2.rb +1 -1
  118. data/lib/hexapdf/font/true_type/table/post.rb +1 -1
  119. data/lib/hexapdf/font/true_type/table.rb +1 -1
  120. data/lib/hexapdf/font/true_type.rb +1 -1
  121. data/lib/hexapdf/font/true_type_wrapper.rb +1 -1
  122. data/lib/hexapdf/font/type1/afm_parser.rb +1 -1
  123. data/lib/hexapdf/font/type1/character_metrics.rb +1 -1
  124. data/lib/hexapdf/font/type1/font.rb +1 -1
  125. data/lib/hexapdf/font/type1/font_metrics.rb +1 -1
  126. data/lib/hexapdf/font/type1/pfb_parser.rb +1 -1
  127. data/lib/hexapdf/font/type1.rb +1 -1
  128. data/lib/hexapdf/font/type1_wrapper.rb +1 -1
  129. data/lib/hexapdf/font_loader/from_configuration.rb +1 -1
  130. data/lib/hexapdf/font_loader/from_file.rb +1 -1
  131. data/lib/hexapdf/font_loader/standard14.rb +1 -1
  132. data/lib/hexapdf/font_loader/variant_from_name.rb +1 -1
  133. data/lib/hexapdf/font_loader.rb +1 -1
  134. data/lib/hexapdf/image_loader/jpeg.rb +1 -1
  135. data/lib/hexapdf/image_loader/pdf.rb +1 -1
  136. data/lib/hexapdf/image_loader/png.rb +1 -1
  137. data/lib/hexapdf/image_loader.rb +1 -1
  138. data/lib/hexapdf/importer.rb +1 -1
  139. data/lib/hexapdf/layout/box.rb +1 -1
  140. data/lib/hexapdf/layout/box_fitter.rb +1 -1
  141. data/lib/hexapdf/layout/column_box.rb +1 -1
  142. data/lib/hexapdf/layout/container_box.rb +1 -1
  143. data/lib/hexapdf/layout/frame.rb +1 -1
  144. data/lib/hexapdf/layout/image_box.rb +1 -1
  145. data/lib/hexapdf/layout/inline_box.rb +1 -1
  146. data/lib/hexapdf/layout/line.rb +1 -1
  147. data/lib/hexapdf/layout/list_box.rb +1 -1
  148. data/lib/hexapdf/layout/numeric_refinements.rb +1 -1
  149. data/lib/hexapdf/layout/page_style.rb +1 -1
  150. data/lib/hexapdf/layout/style.rb +4 -2
  151. data/lib/hexapdf/layout/table_box.rb +9 -2
  152. data/lib/hexapdf/layout/text_box.rb +1 -1
  153. data/lib/hexapdf/layout/text_fragment.rb +11 -1
  154. data/lib/hexapdf/layout/text_layouter.rb +1 -1
  155. data/lib/hexapdf/layout/text_shaper.rb +1 -1
  156. data/lib/hexapdf/layout/width_from_polygon.rb +1 -1
  157. data/lib/hexapdf/layout.rb +1 -1
  158. data/lib/hexapdf/name_tree_node.rb +1 -1
  159. data/lib/hexapdf/number_tree_node.rb +1 -1
  160. data/lib/hexapdf/object.rb +1 -1
  161. data/lib/hexapdf/parser.rb +1 -1
  162. data/lib/hexapdf/pdf_array.rb +1 -1
  163. data/lib/hexapdf/rectangle.rb +1 -1
  164. data/lib/hexapdf/reference.rb +1 -1
  165. data/lib/hexapdf/revision.rb +1 -1
  166. data/lib/hexapdf/revisions.rb +1 -1
  167. data/lib/hexapdf/serializer.rb +1 -1
  168. data/lib/hexapdf/stream.rb +1 -1
  169. data/lib/hexapdf/task/dereference.rb +1 -1
  170. data/lib/hexapdf/task/merge_acro_form.rb +1 -1
  171. data/lib/hexapdf/task/optimize.rb +1 -1
  172. data/lib/hexapdf/task/pdfa.rb +1 -1
  173. data/lib/hexapdf/task.rb +1 -1
  174. data/lib/hexapdf/test_utils.rb +3 -2
  175. data/lib/hexapdf/tokenizer.rb +49 -46
  176. data/lib/hexapdf/type/acro_form/appearance_generator.rb +1 -1
  177. data/lib/hexapdf/type/acro_form/button_field.rb +1 -1
  178. data/lib/hexapdf/type/acro_form/choice_field.rb +1 -1
  179. data/lib/hexapdf/type/acro_form/field.rb +1 -1
  180. data/lib/hexapdf/type/acro_form/form.rb +2 -2
  181. data/lib/hexapdf/type/acro_form/java_script_actions.rb +1 -1
  182. data/lib/hexapdf/type/acro_form/signature_field.rb +1 -1
  183. data/lib/hexapdf/type/acro_form/text_field.rb +1 -1
  184. data/lib/hexapdf/type/acro_form/variable_text_field.rb +1 -1
  185. data/lib/hexapdf/type/acro_form.rb +1 -1
  186. data/lib/hexapdf/type/action.rb +1 -1
  187. data/lib/hexapdf/type/actions/go_to.rb +1 -1
  188. data/lib/hexapdf/type/actions/go_to_r.rb +1 -1
  189. data/lib/hexapdf/type/actions/launch.rb +1 -1
  190. data/lib/hexapdf/type/actions/set_ocg_state.rb +1 -1
  191. data/lib/hexapdf/type/actions/uri.rb +1 -1
  192. data/lib/hexapdf/type/actions.rb +1 -1
  193. data/lib/hexapdf/type/annotation.rb +1 -1
  194. data/lib/hexapdf/type/annotations/link.rb +1 -1
  195. data/lib/hexapdf/type/annotations/markup_annotation.rb +1 -1
  196. data/lib/hexapdf/type/annotations/text.rb +1 -1
  197. data/lib/hexapdf/type/annotations/widget.rb +1 -1
  198. data/lib/hexapdf/type/annotations.rb +1 -1
  199. data/lib/hexapdf/type/catalog.rb +2 -2
  200. data/lib/hexapdf/type/cid_font.rb +2 -2
  201. data/lib/hexapdf/type/cmap.rb +1 -1
  202. data/lib/hexapdf/type/embedded_file.rb +1 -1
  203. data/lib/hexapdf/type/file_specification.rb +1 -1
  204. data/lib/hexapdf/type/font.rb +1 -1
  205. data/lib/hexapdf/type/font_descriptor.rb +1 -1
  206. data/lib/hexapdf/type/font_simple.rb +1 -1
  207. data/lib/hexapdf/type/font_true_type.rb +1 -1
  208. data/lib/hexapdf/type/font_type0.rb +1 -1
  209. data/lib/hexapdf/type/font_type1.rb +1 -1
  210. data/lib/hexapdf/type/font_type3.rb +1 -1
  211. data/lib/hexapdf/type/form.rb +1 -1
  212. data/lib/hexapdf/type/graphics_state_parameter.rb +1 -1
  213. data/lib/hexapdf/type/icon_fit.rb +1 -1
  214. data/lib/hexapdf/type/image.rb +1 -1
  215. data/lib/hexapdf/type/info.rb +1 -1
  216. data/lib/hexapdf/type/mark_information.rb +1 -1
  217. data/lib/hexapdf/type/marked_content_reference.rb +59 -0
  218. data/lib/hexapdf/type/metadata.rb +1 -1
  219. data/lib/hexapdf/type/names.rb +1 -1
  220. data/lib/hexapdf/type/namespace.rb +57 -0
  221. data/lib/hexapdf/type/object_reference.rb +57 -0
  222. data/lib/hexapdf/type/object_stream.rb +1 -1
  223. data/lib/hexapdf/type/optional_content_configuration.rb +1 -1
  224. data/lib/hexapdf/type/optional_content_group.rb +1 -1
  225. data/lib/hexapdf/type/optional_content_membership.rb +1 -1
  226. data/lib/hexapdf/type/optional_content_properties.rb +1 -1
  227. data/lib/hexapdf/type/outline.rb +1 -1
  228. data/lib/hexapdf/type/outline_item.rb +1 -1
  229. data/lib/hexapdf/type/output_intent.rb +1 -1
  230. data/lib/hexapdf/type/page.rb +1 -1
  231. data/lib/hexapdf/type/page_label.rb +1 -1
  232. data/lib/hexapdf/type/page_tree_node.rb +1 -1
  233. data/lib/hexapdf/type/resources.rb +7 -3
  234. data/lib/hexapdf/type/struct_elem.rb +72 -0
  235. data/lib/hexapdf/type/struct_tree_root.rb +64 -0
  236. data/lib/hexapdf/type/trailer.rb +1 -1
  237. data/lib/hexapdf/type/viewer_preferences.rb +1 -1
  238. data/lib/hexapdf/type/xref_stream.rb +1 -1
  239. data/lib/hexapdf/type.rb +6 -1
  240. data/lib/hexapdf/utils/bit_field.rb +1 -1
  241. data/lib/hexapdf/utils/bit_stream.rb +1 -1
  242. data/lib/hexapdf/utils/graphics_helpers.rb +1 -1
  243. data/lib/hexapdf/utils/lru_cache.rb +1 -1
  244. data/lib/hexapdf/utils/math_helpers.rb +1 -1
  245. data/lib/hexapdf/utils/object_hash.rb +1 -1
  246. data/lib/hexapdf/utils/pdf_doc_encoding.rb +1 -1
  247. data/lib/hexapdf/utils/sorted_tree_node.rb +1 -1
  248. data/lib/hexapdf/utils.rb +1 -1
  249. data/lib/hexapdf/version.rb +2 -2
  250. data/lib/hexapdf/writer.rb +1 -1
  251. data/lib/hexapdf/xref_section.rb +1 -1
  252. data/lib/hexapdf.rb +1 -1
  253. data/test/hexapdf/common_tokenizer_tests.rb +2 -7
  254. data/test/hexapdf/encryption/common.rb +1 -1
  255. data/test/hexapdf/encryption/test_aes.rb +1 -1
  256. data/test/hexapdf/encryption/test_arc4.rb +2 -2
  257. data/test/hexapdf/encryption/test_security_handler.rb +1 -1
  258. data/test/hexapdf/filter/test_ascii85_decode.rb +1 -1
  259. data/test/hexapdf/filter/test_ascii_hex_decode.rb +1 -1
  260. data/test/hexapdf/filter/test_flate_decode.rb +2 -3
  261. data/test/hexapdf/font/cmap/test_writer.rb +2 -2
  262. data/test/hexapdf/font/encoding/test_glyph_list.rb +1 -1
  263. data/test/hexapdf/font/test_true_type_wrapper.rb +2 -2
  264. data/test/hexapdf/font/test_type1_wrapper.rb +1 -1
  265. data/test/hexapdf/layout/test_box.rb +0 -2
  266. data/test/hexapdf/layout/test_style.rb +0 -10
  267. data/test/hexapdf/layout/test_table_box.rb +0 -15
  268. data/test/hexapdf/layout/test_text_box.rb +0 -6
  269. data/test/hexapdf/task/test_merge_acro_form.rb +1 -1
  270. data/test/hexapdf/test_filter.rb +1 -1
  271. data/test/hexapdf/test_parser.rb +10 -10
  272. data/test/hexapdf/test_revisions.rb +1 -1
  273. data/test/hexapdf/test_serializer.rb +2 -3
  274. data/test/hexapdf/test_tokenizer.rb +1 -1
  275. data/test/hexapdf/test_writer.rb +2 -2
  276. data/test/hexapdf/type/acro_form/test_form.rb +8 -0
  277. data/test/hexapdf/type/test_font_type1.rb +1 -1
  278. data/test/hexapdf/type/test_image.rb +1 -1
  279. data/test/hexapdf/type/test_page_tree_node.rb +2 -2
  280. data/test/hexapdf/type/test_resources.rb +3 -1
  281. data/test/test_helper.rb +1 -0
  282. metadata +23 -7
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2024 Thomas Leitner
7
+ # Copyright (C) 2014-2025 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2024 Thomas Leitner
7
+ # Copyright (C) 2014-2025 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2024 Thomas Leitner
7
+ # Copyright (C) 2014-2025 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2024 Thomas Leitner
7
+ # Copyright (C) 2014-2025 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2024 Thomas Leitner
7
+ # Copyright (C) 2014-2025 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2024 Thomas Leitner
7
+ # Copyright (C) 2014-2025 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
data/lib/hexapdf/utils.rb CHANGED
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2024 Thomas Leitner
7
+ # Copyright (C) 2014-2025 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2024 Thomas Leitner
7
+ # Copyright (C) 2014-2025 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -37,6 +37,6 @@
37
37
  module HexaPDF
38
38
 
39
39
  # The version of HexaPDF.
40
- VERSION = '1.0.2'
40
+ VERSION = '1.1.0'
41
41
 
42
42
  end
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2024 Thomas Leitner
7
+ # Copyright (C) 2014-2025 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2024 Thomas Leitner
7
+ # Copyright (C) 2014-2025 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
data/lib/hexapdf.rb CHANGED
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2024 Thomas Leitner
7
+ # Copyright (C) 2014-2025 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -65,7 +65,7 @@ module CommonTokenizerTests
65
65
  :'The_Key_of_F#_Minor', :AB, :"",
66
66
  '[', 5, 6, :Name, ']', '[', 5, 6, :Name, ']',
67
67
  '<<', :Name, 5, '>>'
68
- ].each {|t| t.force_encoding('BINARY') if t.respond_to?(:force_encoding) }
68
+ ].map {|t| t.respond_to?(:force_encoding) ? t.b : t }
69
69
 
70
70
  until expected_tokens.empty?
71
71
  expected_token = expected_tokens.shift
@@ -126,11 +126,6 @@ module CommonTokenizerTests
126
126
  assert(token.kind_of?(HexaPDF::Tokenizer::Token))
127
127
  end
128
128
 
129
- it "next_token: should not fail when reading super long numbers" do
130
- create_tokenizer("1" << "0" * 10_000)
131
- assert_equal(10**10_000, @tokenizer.next_token)
132
- end
133
-
134
129
  it "next_object: works for all PDF object types, including array and dictionary" do
135
130
  create_tokenizer(<<-EOF.chomp.gsub(/^ {8}/, ''))
136
131
  true false null 123 34.5 (string) <4E6F76> /Name
@@ -182,7 +177,7 @@ module CommonTokenizerTests
182
177
  end
183
178
 
184
179
  it "returns the correct position on operations" do
185
- create_tokenizer("hallo du" << " " * 50000 << "hallo du")
180
+ create_tokenizer("hallo du" + " " * 50000 + "hallo du")
186
181
  @tokenizer.next_token
187
182
  assert_equal(5, @tokenizer.pos)
188
183
 
@@ -67,7 +67,7 @@ module ARC4EncryptionTests
67
67
  super
68
68
  @encrypted = ['BBF316E8D940AF0AD3', '1021BF0420', '45A01F645FC35B383552544B9BF5'].
69
69
  map {|c| [c].pack('H*') }
70
- @plain = ['Plaintext', 'pedia', 'Attack at dawn'].each {|s| s.force_encoding('BINARY') }
70
+ @plain = ['Plaintext'.b, 'pedia'.b, 'Attack at dawn'.b]
71
71
  @keys = ['Key', 'Wiki', 'Secret']
72
72
  end
73
73
 
@@ -141,7 +141,7 @@ describe HexaPDF::Encryption::AES do
141
141
  collector(@algorithm_class.decryption_fiber('some' * 4, Fiber.new { 'a' * 40 }))
142
142
  end
143
143
  assert_raises(HexaPDF::EncryptionError) do
144
- collector(@algorithm_class.decryption_fiber('some' * 4, Fiber.new { 'a' * 40 })) { true }
144
+ collector(@algorithm_class.decryption_fiber('some' * 4, Fiber.new { 'a' * 40 }) { true })
145
145
  end
146
146
  end
147
147
  end
@@ -11,13 +11,13 @@ describe HexaPDF::Encryption::ARC4 do
11
11
  prepend HexaPDF::Encryption::ARC4
12
12
 
13
13
  def initialize(key)
14
- @data = key
14
+ @data = +key
15
15
  end
16
16
 
17
17
  def process(data)
18
18
  raise if data.empty?
19
19
  result = @data << data
20
- @data = ''
20
+ @data = +''
21
21
  result
22
22
  end
23
23
  end
@@ -236,7 +236,7 @@ describe HexaPDF::Encryption::SecurityHandler do
236
236
  dict[:Filter] = :Test
237
237
  @enc.strf = alg
238
238
  @enc.set_up_encryption(key_length: length, algorithm: (alg == :identity ? :aes : alg))
239
- @obj[:X] = @enc.encrypt_string('data', @obj)
239
+ @obj[:X] = @enc.encrypt_string(+'data', @obj)
240
240
  @handler.set_up_decryption(dict)
241
241
  assert_equal('data', @handler.decrypt(@obj)[:X])
242
242
  end
@@ -33,7 +33,7 @@ describe HexaPDF::Filter::ASCII85Decode do
33
33
  end
34
34
 
35
35
  it "ignores data after the EOD marker" do
36
- assert_equal(@decoded, collector(@obj.decoder(feeder(@encoded << "~>abcdefg"))))
36
+ assert_equal(@decoded, collector(@obj.decoder(feeder(@encoded + "~>abcdefg"))))
37
37
  end
38
38
 
39
39
  it "fails if the input contains invalid characters" do
@@ -24,7 +24,7 @@ describe HexaPDF::Filter::ASCIIHexDecode do
24
24
  end
25
25
 
26
26
  it "ignores data after the EOD marker" do
27
- assert_equal(@decoded, collector(@obj.decoder(feeder(@encoded << '4e6f7gzz'))))
27
+ assert_equal(@decoded, collector(@obj.decoder(feeder(@encoded + '4e6f7gzz'))))
28
28
  end
29
29
 
30
30
  it "assumes the missing char is '0' if the input length is odd" do
@@ -8,11 +8,10 @@ describe HexaPDF::Filter::FlateDecode do
8
8
 
9
9
  before do
10
10
  @obj = HexaPDF::Filter::FlateDecode
11
- @all_test_cases = [["abcdefg".force_encoding(Encoding::BINARY),
12
- "x\xDAKLJNIMK\a\x00\n\xDB\x02\xBD".force_encoding(Encoding::BINARY)]]
11
+ @all_test_cases = [["abcdefg".b, "x\xDAKLJNIMK\a\x00\n\xDB\x02\xBD".b]]
13
12
  @decoded = @all_test_cases[0][0]
14
13
  @encoded = @all_test_cases[0][1]
15
- @encoded_predictor = "x\xDAcJdbD@\x00\x05\x8F\x00v".force_encoding(Encoding::BINARY)
14
+ @encoded_predictor = "x\xDAcJdbD@\x00\x05\x8F\x00v".b
16
15
  @predictor_opts = {Predictor: 12}
17
16
  end
18
17
 
@@ -5,7 +5,7 @@ require 'hexapdf/font/cmap/writer'
5
5
 
6
6
  describe HexaPDF::Font::CMap::Writer do
7
7
  before do
8
- @to_unicode_cmap_data = <<~EOF
8
+ @to_unicode_cmap_data = +<<~EOF
9
9
  /CIDInit /ProcSet findresource begin
10
10
  12 dict begin
11
11
  begincmap
@@ -32,7 +32,7 @@ describe HexaPDF::Font::CMap::Writer do
32
32
  end
33
33
  end
34
34
  EOF
35
- @cid_cmap_data = <<~EOF
35
+ @cid_cmap_data = +<<~EOF
36
36
  %!PS-Adobe-3.0 Resource-CMap
37
37
  %%DocumentNeededResources: ProcSet (CIDInit)
38
38
  %%IncludeResource: ProcSet (CIDInit)
@@ -32,7 +32,7 @@ describe HexaPDF::Font::Encoding::GlyphList do
32
32
 
33
33
  it "maps special uXXXX[XX] names to unicode values" do
34
34
  assert_equal("A", @list.name_to_unicode(:u0041))
35
- assert_equal("" << "1F000".hex, @list.name_to_unicode(:u1F000))
35
+ assert_equal(+'' << "1F000".hex, @list.name_to_unicode(:u1F000))
36
36
  end
37
37
 
38
38
  it "maps Zapf Dingbats glyph names to their unicode" do
@@ -51,7 +51,7 @@ describe HexaPDF::Font::TrueTypeWrapper do
51
51
  glyphs = @font_wrapper.decode_utf8("😁")
52
52
  assert_equal(1, glyphs.length)
53
53
  assert_kind_of(HexaPDF::Font::InvalidGlyph, glyphs.first)
54
- assert_equal('' << 128_513, glyphs.first.str)
54
+ assert_equal(+'' << 128_513, glyphs.first.str)
55
55
  end
56
56
  end
57
57
 
@@ -81,7 +81,7 @@ describe HexaPDF::Font::TrueTypeWrapper do
81
81
  glyph = @font_wrapper.glyph(9999)
82
82
  assert_kind_of(HexaPDF::Font::InvalidGlyph, glyph)
83
83
  assert_equal(0, glyph.id)
84
- assert_equal('' << 0xFFFD, glyph.str)
84
+ assert_equal(+'' << 0xFFFD, glyph.str)
85
85
  end
86
86
  end
87
87
 
@@ -56,7 +56,7 @@ describe HexaPDF::Font::Type1Wrapper do
56
56
  glyphs = @times_wrapper.decode_utf8("😁")
57
57
  assert_equal(1, glyphs.length)
58
58
  assert_kind_of(HexaPDF::Font::InvalidGlyph, glyphs.first)
59
- assert_equal('' << 128_513, glyphs.first.str)
59
+ assert_equal(+'' << 128_513, glyphs.first.str)
60
60
  end
61
61
  end
62
62
 
@@ -270,8 +270,6 @@ describe HexaPDF::Layout::Box do
270
270
  [:restore_graphics_state],
271
271
  [:save_graphics_state],
272
272
  [:set_line_width, [5]],
273
- [:append_rectangle, [5, 5, 150, 130]],
274
- [:clip_path_non_zero], [:end_path],
275
273
  [:append_rectangle, [7.5, 7.5, 145, 125]],
276
274
  [:stroke_path],
277
275
  [:restore_graphics_state],
@@ -199,8 +199,6 @@ describe HexaPDF::Layout::Style::Border do
199
199
  assert_operators(@canvas.contents, [[:save_graphics_state],
200
200
  [:set_device_gray_stroking_color, [0.5]],
201
201
  [:set_line_width, [10]],
202
- [:append_rectangle, [0, 0, 100, 100]],
203
- [:clip_path_non_zero], [:end_path],
204
202
  [:append_rectangle, [5, 5, 90, 90]],
205
203
  [:stroke_path],
206
204
  [:restore_graphics_state]])
@@ -213,8 +211,6 @@ describe HexaPDF::Layout::Style::Border do
213
211
  [:set_device_gray_stroking_color, [0.5]],
214
212
  [:set_line_width, [10]],
215
213
  [:set_line_cap_style, [2]],
216
- [:append_rectangle, [0, 0, 200, 300]],
217
- [:clip_path_non_zero], [:end_path],
218
214
  [:set_line_dash_pattern, [[10, 20], 25]],
219
215
  [:move_to, [0, 295]], [:line_to, [200, 295]],
220
216
  [:move_to, [200, 5]], [:line_to, [0, 5]],
@@ -234,8 +230,6 @@ describe HexaPDF::Layout::Style::Border do
234
230
  [:set_device_gray_stroking_color, [0.5]],
235
231
  [:set_line_width, [10]],
236
232
  [:set_line_cap_style, [1]],
237
- [:append_rectangle, [0, 0, 200, 300]],
238
- [:clip_path_non_zero], [:end_path],
239
233
  [:set_line_dash_pattern, [[10, 20], 25]],
240
234
  [:move_to, [0, 295]], [:line_to, [200, 295]],
241
235
  [:move_to, [200, 5]], [:line_to, [0, 5]],
@@ -255,8 +249,6 @@ describe HexaPDF::Layout::Style::Border do
255
249
  [:set_device_gray_stroking_color, [0.5]],
256
250
  [:set_line_width, [10]],
257
251
  [:set_line_cap_style, [1]],
258
- [:append_rectangle, [0, 0, 100, 200]],
259
- [:clip_path_non_zero], [:end_path],
260
252
  [:set_line_dash_pattern, [[0, 18], 13]],
261
253
  [:move_to, [0, 195]], [:line_to, [100, 195]],
262
254
  [:move_to, [100, 5]], [:line_to, [0, 5]],
@@ -275,8 +267,6 @@ describe HexaPDF::Layout::Style::Border do
275
267
  assert_operators(@canvas.contents, [[:save_graphics_state],
276
268
  [:set_device_gray_stroking_color, [0.5]],
277
269
  [:set_line_width, [10]],
278
- [:append_rectangle, [-5, -5, 110, 110]],
279
- [:clip_path_non_zero], [:end_path],
280
270
  [:append_rectangle, [0, 0, 100, 100]],
281
271
  [:stroke_path],
282
272
  [:restore_graphics_state]])
@@ -143,9 +143,6 @@ describe HexaPDF::Layout::TableBox::Cell do
143
143
  box.fit(100, 100, @frame)
144
144
  box.draw(@canvas, 10, 75)
145
145
  operators = [[:save_graphics_state],
146
- [:append_rectangle, [9.5, 74.5, 101.0, 38.0]],
147
- [:clip_path_non_zero],
148
- [:end_path],
149
146
  [:append_rectangle, [10.0, 75.0, 100.0, 37.0]],
150
147
  [:stroke_path],
151
148
  [:restore_graphics_state],
@@ -674,9 +671,6 @@ describe HexaPDF::Layout::TableBox do
674
671
  box.fit(100, 100, @frame)
675
672
  box.draw(@canvas, 20, 10)
676
673
  operators = [[:save_graphics_state],
677
- [:append_rectangle, [20.0, 32.0, 50.5, 23.0]],
678
- [:clip_path_non_zero],
679
- [:end_path],
680
674
  [:append_rectangle, [20.5, 32.5, 49.5, 22.0]],
681
675
  [:stroke_path],
682
676
  [:restore_graphics_state],
@@ -686,9 +680,6 @@ describe HexaPDF::Layout::TableBox do
686
680
  [:end_path],
687
681
  [:restore_graphics_state],
688
682
  [:save_graphics_state],
689
- [:append_rectangle, [69.5, 32.0, 50.5, 23.0]],
690
- [:clip_path_non_zero],
691
- [:end_path],
692
683
  [:append_rectangle, [70.0, 32.5, 49.5, 22.0]],
693
684
  [:stroke_path],
694
685
  [:restore_graphics_state],
@@ -698,9 +689,6 @@ describe HexaPDF::Layout::TableBox do
698
689
  [:end_path],
699
690
  [:restore_graphics_state],
700
691
  [:save_graphics_state],
701
- [:append_rectangle, [20.0, 10.0, 50.5, 23.0]],
702
- [:clip_path_non_zero],
703
- [:end_path],
704
692
  [:append_rectangle, [20.5, 10.5, 49.5, 22.0]],
705
693
  [:stroke_path],
706
694
  [:restore_graphics_state],
@@ -710,9 +698,6 @@ describe HexaPDF::Layout::TableBox do
710
698
  [:end_path],
711
699
  [:restore_graphics_state],
712
700
  [:save_graphics_state],
713
- [:append_rectangle, [69.5, 10.0, 50.5, 23.0]],
714
- [:clip_path_non_zero],
715
- [:end_path],
716
701
  [:append_rectangle, [70.0, 10.5, 49.5, 22.0]],
717
702
  [:stroke_path],
718
703
  [:restore_graphics_state],
@@ -178,9 +178,6 @@ describe HexaPDF::Layout::TextBox do
178
178
  assert_operators(@canvas.contents, [[:save_graphics_state],
179
179
  [:restore_graphics_state],
180
180
  [:save_graphics_state],
181
- [:append_rectangle, [5, 10, 10, 10]],
182
- [:clip_path_non_zero],
183
- [:end_path],
184
181
  [:append_rectangle, [5.5, 10.5, 9.0, 9.0]],
185
182
  [:stroke_path],
186
183
  [:restore_graphics_state],
@@ -194,9 +191,6 @@ describe HexaPDF::Layout::TextBox do
194
191
  box.fit(60, 100, @frame)
195
192
  box.draw(@canvas, 40, 88)
196
193
  assert_operators(@canvas.contents, [[:save_graphics_state],
197
- [:append_rectangle, [40, 88, 12, 12]],
198
- [:clip_path_non_zero],
199
- [:end_path],
200
194
  [:append_rectangle, [40.5, 88.5, 11.0, 11.0]],
201
195
  [:stroke_path],
202
196
  [:restore_graphics_state],
@@ -81,7 +81,7 @@ describe HexaPDF::Task::MergeAcroForm do
81
81
  end
82
82
 
83
83
  it "updates the /DA entries of widgets and fields" do
84
- @pages[0][:Annots][0][:DA] = '/F1 10 Tf'
84
+ @pages[0][:Annots][0][:DA] = +'/F1 10 Tf'
85
85
  @doc.task(:merge_acro_form, source: @doc1, pages: @pages)
86
86
  field = @doc.acro_form.field_by_name('merged_1.Text')
87
87
  assert_equal('0.0 g /F2 0 Tf', field[:DA])
@@ -8,7 +8,7 @@ require 'tempfile'
8
8
  describe HexaPDF::Filter do
9
9
  before do
10
10
  @obj = HexaPDF::Filter
11
- @str = ''
11
+ @str = +''
12
12
  40.times { @str << [rand(2**32)].pack('N') }
13
13
  end
14
14
 
@@ -11,7 +11,7 @@ describe HexaPDF::Parser do
11
11
  @document.config['parser.try_xref_reconstruction'] = false
12
12
  @document.add(@document.wrap(10, oid: 1, gen: 0))
13
13
 
14
- create_parser(<<~EOF)
14
+ create_parser(+<<~EOF)
15
15
  %PDF-1.7
16
16
 
17
17
  1 0 obj
@@ -354,7 +354,7 @@ describe HexaPDF::Parser do
354
354
  describe "startxref_offset" do
355
355
  it "caches the offset value" do
356
356
  assert_equal(330, @parser.startxref_offset)
357
- @parser.instance_eval { @io }.string.sub!(/330\n/, "309\n")
357
+ @parser.instance_eval { @io.string = @io.string.sub(/330\n/, "309\n") }
358
358
  assert_equal(330, @parser.startxref_offset)
359
359
  end
360
360
 
@@ -363,7 +363,7 @@ describe HexaPDF::Parser do
363
363
  end
364
364
 
365
365
  it "ignores garbage at the end of the file" do
366
- create_parser("startxref\n5\n%%EOF" << "\nhallo" * 150)
366
+ create_parser("startxref\n5\n%%EOF" + "\nhallo" * 150)
367
367
  assert_equal(5, @parser.startxref_offset)
368
368
  end
369
369
 
@@ -373,17 +373,17 @@ describe HexaPDF::Parser do
373
373
  end
374
374
 
375
375
  it "finds the startxref anywhere in file" do
376
- create_parser("startxref\n5\n%%EOF" << "\nhallo" * 5000)
376
+ create_parser("startxref\n5\n%%EOF" + "\nhallo" * 5000)
377
377
  assert_equal(5, @parser.startxref_offset)
378
378
  end
379
379
 
380
380
  it "handles the case where %%EOF is the on the 1. line of the 1024 byte search block" do
381
- create_parser("startxref\n5\n%%EOF\n" << "h" * 1018)
381
+ create_parser("startxref\n5\n%%EOF\n" + "h" * 1018)
382
382
  assert_equal(5, @parser.startxref_offset)
383
383
  end
384
384
 
385
385
  it "handles the case where %%EOF is the on the 2. line of the 1024 byte search block" do
386
- create_parser("startxref\n5\n%%EOF\n" << "h" * 1017)
386
+ create_parser("startxref\n5\n%%EOF\n" + "h" * 1017)
387
387
  assert_equal(5, @parser.startxref_offset)
388
388
  end
389
389
 
@@ -421,7 +421,7 @@ describe HexaPDF::Parser do
421
421
 
422
422
  it "fails on strict parsing if the startxref is not in the last part of the file" do
423
423
  @document.config['parser.on_correctable_error'] = proc { true }
424
- create_parser("startxref\n5\n%%EOF" << "\nhallo" * 5000)
424
+ create_parser("startxref\n5\n%%EOF" + "\nhallo" * 5000)
425
425
  exp = assert_raises(HexaPDF::MalformedPDFError) { @parser.startxref_offset }
426
426
  assert_match(/end-of-file marker not found/, exp.message)
427
427
  end
@@ -459,7 +459,7 @@ describe HexaPDF::Parser do
459
459
  end
460
460
 
461
461
  it "ignores junk at the beginning of the file and correctly calculates offset" do
462
- create_parser("junk" * 200 << "\n%PDF-1.4\n")
462
+ create_parser("junk" * 200 + "\n%PDF-1.4\n")
463
463
  assert_equal('1.4', @parser.file_header_version)
464
464
  assert_equal(801, @parser.instance_variable_get(:@header_offset))
465
465
  end
@@ -670,13 +670,13 @@ describe HexaPDF::Parser do
670
670
  end
671
671
 
672
672
  it "handles cases where the line contains an invalid string that exceeds the read buffer" do
673
- create_parser("(1" << "(abc" * 32188 << "\n1 0 obj\n6\nendobj\ntrailer\n<</Size 1>>")
673
+ create_parser("(1" + "(abc" * 32188 + "\n1 0 obj\n6\nendobj\ntrailer\n<</Size 1>>")
674
674
  assert_equal(6, @parser.load_object(@xref).value)
675
675
  end
676
676
 
677
677
  it "handles pathalogical cases which contain many opened literal strings" do
678
678
  time = Time.now
679
- create_parser("(1" << "(abc\n" * 10000 << "\n1 0 obj\n6\nendobj\ntrailer\n<</Size 1>>")
679
+ create_parser("(1" + "(abc\n" * 10000 + "\n1 0 obj\n6\nendobj\ntrailer\n<</Size 1>>")
680
680
  assert_equal(6, @parser.load_object(@xref).value)
681
681
  assert(Time.now - time < 0.5, "Xref reconstruction takes too long")
682
682
  end
@@ -359,7 +359,7 @@ describe HexaPDF::Revisions do
359
359
 
360
360
  describe "linearzied PDFs" do
361
361
  before do
362
- @io = StringIO.new(<<~EOF)
362
+ @io = StringIO.new(+<<~EOF)
363
363
  %PDF-1.2
364
364
  5 0 obj
365
365
  <</Linearized 1>>
@@ -88,7 +88,7 @@ describe HexaPDF::Serializer do
88
88
  assert_serialized('/The_Key_of_F#23_Minor', :'The_Key_of_F#_Minor')
89
89
  assert_serialized('/ ', :"")
90
90
  assert_serialized('/H#c3#b6#c3#9fgang', :Hößgang)
91
- assert_serialized('/H#e8lp', "H\xE8lp".force_encoding('BINARY').intern)
91
+ assert_serialized('/H#e8lp', "H\xE8lp".b.intern)
92
92
  assert_serialized('/#00#09#0a#0c#0d#20', :"\x00\t\n\f\r ")
93
93
  end
94
94
 
@@ -105,8 +105,7 @@ describe HexaPDF::Serializer do
105
105
  it "serializes strings" do
106
106
  assert_serialized("(Hallo)", "Hallo")
107
107
  assert_serialized("(Hallo\\r\n\t\\(\\)\\\\)", "Hallo\r\n\t()\\")
108
- assert_serialized("(\xFE\xFF\x00H\x00a\x00l\x00\f\x00\b\x00\\()".force_encoding('BINARY'),
109
- "Hal\f\b(")
108
+ assert_serialized("(\xFE\xFF\x00H\x00a\x00l\x00\f\x00\b\x00\\()".b, "Hal\f\b(")
110
109
  end
111
110
 
112
111
  it "serializes time like objects" do
@@ -38,7 +38,7 @@ describe HexaPDF::Tokenizer do
38
38
  end
39
39
 
40
40
  it "next_token: should not fail for strings due to use of an internal buffer" do
41
- create_tokenizer("(" << ("a" * 8189) << "\\006)")
41
+ create_tokenizer("(" + ("a" * 8189) + "\\006)")
42
42
  assert_equal("a" * 8189 << "\x06", @tokenizer.next_token)
43
43
  end
44
44
 
@@ -98,7 +98,7 @@ describe HexaPDF::Writer do
98
98
  def assert_document_conversion(input_io)
99
99
  document = HexaPDF::Document.new(io: input_io)
100
100
  document.trailer.info[:Producer] = "unknown"
101
- output_io = StringIO.new(''.force_encoding(Encoding::BINARY))
101
+ output_io = StringIO.new(''.b)
102
102
  start_xref_offset, xref_section = HexaPDF::Writer.write(document, output_io)
103
103
  assert_kind_of(HexaPDF::XRefSection, xref_section)
104
104
  assert_kind_of(Integer, start_xref_offset)
@@ -206,7 +206,7 @@ describe HexaPDF::Writer do
206
206
 
207
207
  it "doesn't create an xref stream if one was just used for an XRefStm entry" do
208
208
  # The following document's structure is built like a typical MS Word created PDF
209
- input = StringIO.new(<<~EOF.force_encoding(Encoding::BINARY))
209
+ input = StringIO.new(<<~EOF.b)
210
210
  %PDF-1.2
211
211
  %\xCF\xEC\xFF\xE8\xD7\xCB\xCD
212
212
  1 0 obj
@@ -494,6 +494,14 @@ describe HexaPDF::Type::AcroForm::Form do
494
494
  @acro_form.recalculate_fields
495
495
  assert_equal("10", @text3.field_value)
496
496
  end
497
+
498
+ it "ensures that only entries in /CO that are actually fields are used" do
499
+ @text1.field_value = "10"
500
+ @text3.set_calculate_action(:sfn, fields: 'text1')
501
+ @acro_form[:CO] = [nil, 5, [:some, :array], @doc.pages.root, @text3]
502
+ @acro_form.recalculate_fields
503
+ assert_equal("10", @text3.field_value)
504
+ end
497
505
  end
498
506
 
499
507
  describe "perform_validation" do
@@ -31,7 +31,7 @@ describe HexaPDF::Type::FontType1::StandardFonts do
31
31
  end
32
32
 
33
33
  it "returns nil if the given name doesn't belong to a standard font" do
34
- refute_nil(@obj.font(:TimesNewRoman))
34
+ assert_nil(@obj.font(:SomeOtherFont))
35
35
  end
36
36
  end
37
37
  end
@@ -171,7 +171,7 @@ describe HexaPDF::Type::Image do
171
171
 
172
172
  def assert_valid_png(filename, original = nil)
173
173
  if PNG_CHECK_AVAILABLE
174
- result = `pngcheck -q #{filename}`
174
+ result = `pngcheck -q #{filename} 2>/dev/null`
175
175
  assert(result.empty?, "pngcheck error: #{result}")
176
176
  else
177
177
  skip("Skipping PNG output validity check because pngcheck executable is missing")
@@ -326,9 +326,9 @@ describe HexaPDF::Type::PageTreeNode do
326
326
  assert(@root.validate(auto_correct: false) {|m, _| p m })
327
327
 
328
328
  @doc.delete(@pages[3])
329
- refute(@root.validate(auto_correct: false)) do |msg, _|
329
+ refute(@root.validate(auto_correct: false) do |msg, _|
330
330
  assert_match(/invalid object/i, msg)
331
- end
331
+ end)
332
332
  assert(@root.validate)
333
333
  assert_equal(2, @kid12[:Count])
334
334
  assert_equal([@pages[2], @pages[4]], @kid12[:Kids].value)
@@ -196,7 +196,9 @@ describe HexaPDF::Type::Resources do
196
196
  describe "validation" do
197
197
  it "handles an invalid ProcSet containing a single value instead of an array" do
198
198
  @res[:ProcSet] = :PDF
199
- @res.validate
199
+ msg = nil
200
+ @res.validate {|message, *| msg = message unless msg }
201
+ assert_match(/single value instead of an Array/, msg)
200
202
  assert_equal([:PDF], @res[:ProcSet].value)
201
203
  end
202
204