hexapdf 1.7.0 → 1.9.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 (294) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +50 -1
  3. data/LICENSE +1 -1
  4. data/README.md +3 -0
  5. data/Rakefile +1 -1
  6. data/data/hexapdf/fonts/Inter-Bold.ttf +0 -0
  7. data/data/hexapdf/fonts/Inter-BoldItalic.ttf +0 -0
  8. data/data/hexapdf/fonts/Inter-Italic.ttf +0 -0
  9. data/data/hexapdf/fonts/Inter-Regular.ttf +0 -0
  10. data/data/hexapdf/fonts/OFL.txt +92 -0
  11. data/examples/005-merging.rb +2 -1
  12. data/examples/019-acro_form.rb +3 -1
  13. data/examples/030-pdfa.rb +9 -16
  14. data/examples/034-text_shaping.rb +37 -0
  15. data/lib/hexapdf/cli/batch.rb +1 -1
  16. data/lib/hexapdf/cli/command.rb +1 -1
  17. data/lib/hexapdf/cli/debug_info.rb +1 -1
  18. data/lib/hexapdf/cli/files.rb +1 -1
  19. data/lib/hexapdf/cli/fonts.rb +6 -4
  20. data/lib/hexapdf/cli/form.rb +1 -1
  21. data/lib/hexapdf/cli/image2pdf.rb +1 -1
  22. data/lib/hexapdf/cli/images.rb +17 -17
  23. data/lib/hexapdf/cli/info.rb +1 -1
  24. data/lib/hexapdf/cli/inspect.rb +1 -1
  25. data/lib/hexapdf/cli/merge.rb +14 -2
  26. data/lib/hexapdf/cli/modify.rb +1 -1
  27. data/lib/hexapdf/cli/optimize.rb +1 -1
  28. data/lib/hexapdf/cli/split.rb +1 -1
  29. data/lib/hexapdf/cli/usage.rb +1 -1
  30. data/lib/hexapdf/cli/watermark.rb +1 -1
  31. data/lib/hexapdf/cli.rb +1 -1
  32. data/lib/hexapdf/composer.rb +1 -1
  33. data/lib/hexapdf/configuration.rb +15 -2
  34. data/lib/hexapdf/content/canvas.rb +1 -1
  35. data/lib/hexapdf/content/canvas_composer.rb +1 -1
  36. data/lib/hexapdf/content/color_space.rb +1 -1
  37. data/lib/hexapdf/content/graphic_object/arc.rb +1 -1
  38. data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +1 -1
  39. data/lib/hexapdf/content/graphic_object/geom2d.rb +1 -1
  40. data/lib/hexapdf/content/graphic_object/solid_arc.rb +1 -1
  41. data/lib/hexapdf/content/graphic_object.rb +1 -1
  42. data/lib/hexapdf/content/graphics_state.rb +1 -1
  43. data/lib/hexapdf/content/operator.rb +1 -1
  44. data/lib/hexapdf/content/parser.rb +1 -1
  45. data/lib/hexapdf/content/processor.rb +1 -1
  46. data/lib/hexapdf/content/smart_text_extractor.rb +10 -4
  47. data/lib/hexapdf/content/transformation_matrix.rb +1 -1
  48. data/lib/hexapdf/content.rb +1 -1
  49. data/lib/hexapdf/data_dir.rb +1 -1
  50. data/lib/hexapdf/dictionary.rb +1 -1
  51. data/lib/hexapdf/dictionary_fields.rb +1 -1
  52. data/lib/hexapdf/digital_signature/cms_handler.rb +1 -1
  53. data/lib/hexapdf/digital_signature/handler.rb +1 -1
  54. data/lib/hexapdf/digital_signature/pkcs1_handler.rb +1 -1
  55. data/lib/hexapdf/digital_signature/signature.rb +1 -1
  56. data/lib/hexapdf/digital_signature/signatures.rb +1 -1
  57. data/lib/hexapdf/digital_signature/signing/default_handler.rb +1 -1
  58. data/lib/hexapdf/digital_signature/signing/signed_data_creator.rb +1 -1
  59. data/lib/hexapdf/digital_signature/signing/timestamp_handler.rb +1 -1
  60. data/lib/hexapdf/digital_signature/signing.rb +1 -1
  61. data/lib/hexapdf/digital_signature/verification_result.rb +1 -1
  62. data/lib/hexapdf/digital_signature.rb +1 -1
  63. data/lib/hexapdf/document/annotations.rb +26 -1
  64. data/lib/hexapdf/document/destinations.rb +1 -1
  65. data/lib/hexapdf/document/files.rb +1 -1
  66. data/lib/hexapdf/document/fonts.rb +1 -1
  67. data/lib/hexapdf/document/images.rb +1 -1
  68. data/lib/hexapdf/document/layout.rb +1 -1
  69. data/lib/hexapdf/document/metadata.rb +1 -1
  70. data/lib/hexapdf/document/pages.rb +1 -1
  71. data/lib/hexapdf/document.rb +1 -1
  72. data/lib/hexapdf/encryption/aes.rb +1 -1
  73. data/lib/hexapdf/encryption/arc4.rb +1 -1
  74. data/lib/hexapdf/encryption/fast_aes.rb +1 -1
  75. data/lib/hexapdf/encryption/fast_arc4.rb +1 -1
  76. data/lib/hexapdf/encryption/identity.rb +1 -1
  77. data/lib/hexapdf/encryption/ruby_aes.rb +1 -1
  78. data/lib/hexapdf/encryption/ruby_arc4.rb +1 -1
  79. data/lib/hexapdf/encryption/security_handler.rb +1 -1
  80. data/lib/hexapdf/encryption/standard_security_handler.rb +1 -1
  81. data/lib/hexapdf/encryption.rb +1 -1
  82. data/lib/hexapdf/error.rb +1 -1
  83. data/lib/hexapdf/filter/ascii85_decode.rb +1 -1
  84. data/lib/hexapdf/filter/ascii_hex_decode.rb +1 -1
  85. data/lib/hexapdf/filter/brotli_decode.rb +1 -1
  86. data/lib/hexapdf/filter/crypt.rb +1 -1
  87. data/lib/hexapdf/filter/encryption.rb +1 -1
  88. data/lib/hexapdf/filter/flate_decode.rb +1 -1
  89. data/lib/hexapdf/filter/lzw_decode.rb +1 -1
  90. data/lib/hexapdf/filter/pass_through.rb +1 -1
  91. data/lib/hexapdf/filter/predictor.rb +1 -1
  92. data/lib/hexapdf/filter/run_length_decode.rb +1 -1
  93. data/lib/hexapdf/filter.rb +1 -1
  94. data/lib/hexapdf/font/cmap/parser.rb +1 -1
  95. data/lib/hexapdf/font/cmap/writer.rb +16 -10
  96. data/lib/hexapdf/font/cmap.rb +1 -1
  97. data/lib/hexapdf/font/encoding/base.rb +1 -1
  98. data/lib/hexapdf/font/encoding/difference_encoding.rb +1 -1
  99. data/lib/hexapdf/font/encoding/glyph_list.rb +1 -1
  100. data/lib/hexapdf/font/encoding/mac_expert_encoding.rb +1 -1
  101. data/lib/hexapdf/font/encoding/mac_roman_encoding.rb +1 -1
  102. data/lib/hexapdf/font/encoding/standard_encoding.rb +1 -1
  103. data/lib/hexapdf/font/encoding/symbol_encoding.rb +1 -1
  104. data/lib/hexapdf/font/encoding/win_ansi_encoding.rb +1 -1
  105. data/lib/hexapdf/font/encoding/zapf_dingbats_encoding.rb +1 -1
  106. data/lib/hexapdf/font/encoding.rb +1 -1
  107. data/lib/hexapdf/font/invalid_glyph.rb +1 -1
  108. data/lib/hexapdf/font/true_type/builder.rb +1 -1
  109. data/lib/hexapdf/font/true_type/font.rb +1 -1
  110. data/lib/hexapdf/font/true_type/optimizer.rb +1 -1
  111. data/lib/hexapdf/font/true_type/subsetter.rb +4 -4
  112. data/lib/hexapdf/font/true_type/table/cmap.rb +1 -1
  113. data/lib/hexapdf/font/true_type/table/cmap_subtable.rb +1 -1
  114. data/lib/hexapdf/font/true_type/table/directory.rb +1 -1
  115. data/lib/hexapdf/font/true_type/table/glyf.rb +1 -1
  116. data/lib/hexapdf/font/true_type/table/head.rb +1 -1
  117. data/lib/hexapdf/font/true_type/table/hhea.rb +1 -1
  118. data/lib/hexapdf/font/true_type/table/hmtx.rb +1 -1
  119. data/lib/hexapdf/font/true_type/table/kern.rb +1 -1
  120. data/lib/hexapdf/font/true_type/table/loca.rb +1 -1
  121. data/lib/hexapdf/font/true_type/table/maxp.rb +1 -1
  122. data/lib/hexapdf/font/true_type/table/name.rb +1 -1
  123. data/lib/hexapdf/font/true_type/table/os2.rb +1 -1
  124. data/lib/hexapdf/font/true_type/table/post.rb +1 -1
  125. data/lib/hexapdf/font/true_type/table.rb +1 -1
  126. data/lib/hexapdf/font/true_type.rb +1 -1
  127. data/lib/hexapdf/font/true_type_wrapper.rb +9 -6
  128. data/lib/hexapdf/font/type1/afm_parser.rb +1 -1
  129. data/lib/hexapdf/font/type1/character_metrics.rb +1 -1
  130. data/lib/hexapdf/font/type1/font.rb +1 -1
  131. data/lib/hexapdf/font/type1/font_metrics.rb +1 -1
  132. data/lib/hexapdf/font/type1/pfb_parser.rb +1 -1
  133. data/lib/hexapdf/font/type1.rb +1 -1
  134. data/lib/hexapdf/font/type1_wrapper.rb +1 -1
  135. data/lib/hexapdf/font_loader/from_configuration.rb +1 -1
  136. data/lib/hexapdf/font_loader/from_file.rb +5 -1
  137. data/lib/hexapdf/font_loader/standard14.rb +1 -1
  138. data/lib/hexapdf/font_loader/variant_from_name.rb +1 -1
  139. data/lib/hexapdf/font_loader.rb +48 -1
  140. data/lib/hexapdf/image_loader/jpeg.rb +1 -1
  141. data/lib/hexapdf/image_loader/pdf.rb +1 -1
  142. data/lib/hexapdf/image_loader/png.rb +1 -1
  143. data/lib/hexapdf/image_loader.rb +1 -1
  144. data/lib/hexapdf/importer.rb +1 -1
  145. data/lib/hexapdf/layout/box.rb +1 -1
  146. data/lib/hexapdf/layout/box_fitter.rb +1 -1
  147. data/lib/hexapdf/layout/column_box.rb +1 -1
  148. data/lib/hexapdf/layout/container_box.rb +3 -5
  149. data/lib/hexapdf/layout/frame.rb +1 -1
  150. data/lib/hexapdf/layout/image_box.rb +1 -1
  151. data/lib/hexapdf/layout/inline_box.rb +1 -1
  152. data/lib/hexapdf/layout/line.rb +1 -1
  153. data/lib/hexapdf/layout/list_box.rb +1 -1
  154. data/lib/hexapdf/layout/numeric_refinements.rb +1 -1
  155. data/lib/hexapdf/layout/page_style.rb +1 -1
  156. data/lib/hexapdf/layout/style.rb +67 -5
  157. data/lib/hexapdf/layout/table_box.rb +97 -14
  158. data/lib/hexapdf/layout/text_box.rb +1 -1
  159. data/lib/hexapdf/layout/text_fragment.rb +14 -8
  160. data/lib/hexapdf/layout/text_layouter.rb +1 -1
  161. data/lib/hexapdf/layout/text_shaper.rb +163 -11
  162. data/lib/hexapdf/layout/width_from_polygon.rb +1 -1
  163. data/lib/hexapdf/layout.rb +1 -1
  164. data/lib/hexapdf/name_tree_node.rb +1 -1
  165. data/lib/hexapdf/number_tree_node.rb +1 -1
  166. data/lib/hexapdf/object.rb +1 -1
  167. data/lib/hexapdf/parser.rb +1 -1
  168. data/lib/hexapdf/pdf_array.rb +1 -1
  169. data/lib/hexapdf/rectangle.rb +1 -1
  170. data/lib/hexapdf/reference.rb +1 -1
  171. data/lib/hexapdf/revision.rb +1 -1
  172. data/lib/hexapdf/revisions.rb +1 -1
  173. data/lib/hexapdf/serializer.rb +3 -3
  174. data/lib/hexapdf/stream.rb +1 -1
  175. data/lib/hexapdf/task/dereference.rb +1 -1
  176. data/lib/hexapdf/task/import_pages.rb +185 -0
  177. data/lib/hexapdf/task/merge_acro_form.rb +1 -1
  178. data/lib/hexapdf/task/optimize.rb +1 -1
  179. data/lib/hexapdf/task/pdfa.rb +1 -1
  180. data/lib/hexapdf/task.rb +2 -1
  181. data/lib/hexapdf/test_utils.rb +1 -1
  182. data/lib/hexapdf/tokenizer.rb +1 -1
  183. data/lib/hexapdf/type/acro_form/appearance_generator.rb +1 -1
  184. data/lib/hexapdf/type/acro_form/button_field.rb +1 -1
  185. data/lib/hexapdf/type/acro_form/choice_field.rb +1 -1
  186. data/lib/hexapdf/type/acro_form/field.rb +1 -1
  187. data/lib/hexapdf/type/acro_form/form.rb +1 -1
  188. data/lib/hexapdf/type/acro_form/java_script_actions.rb +1 -1
  189. data/lib/hexapdf/type/acro_form/signature_field.rb +1 -1
  190. data/lib/hexapdf/type/acro_form/text_field.rb +1 -1
  191. data/lib/hexapdf/type/acro_form/variable_text_field.rb +1 -1
  192. data/lib/hexapdf/type/acro_form.rb +1 -1
  193. data/lib/hexapdf/type/action.rb +1 -1
  194. data/lib/hexapdf/type/actions/go_to.rb +1 -1
  195. data/lib/hexapdf/type/actions/go_to_r.rb +1 -1
  196. data/lib/hexapdf/type/actions/launch.rb +1 -1
  197. data/lib/hexapdf/type/actions/set_ocg_state.rb +1 -1
  198. data/lib/hexapdf/type/actions/uri.rb +1 -1
  199. data/lib/hexapdf/type/actions.rb +1 -1
  200. data/lib/hexapdf/type/annotation.rb +1 -1
  201. data/lib/hexapdf/type/annotations/appearance_generator.rb +43 -1
  202. data/lib/hexapdf/type/annotations/border_effect.rb +1 -1
  203. data/lib/hexapdf/type/annotations/border_styling.rb +1 -1
  204. data/lib/hexapdf/type/annotations/circle.rb +1 -1
  205. data/lib/hexapdf/type/annotations/ink.rb +107 -0
  206. data/lib/hexapdf/type/annotations/interior_color.rb +1 -1
  207. data/lib/hexapdf/type/annotations/line.rb +1 -1
  208. data/lib/hexapdf/type/annotations/line_ending_styling.rb +1 -1
  209. data/lib/hexapdf/type/annotations/link.rb +1 -1
  210. data/lib/hexapdf/type/annotations/markup_annotation.rb +1 -1
  211. data/lib/hexapdf/type/annotations/polygon.rb +1 -1
  212. data/lib/hexapdf/type/annotations/polygon_polyline.rb +1 -1
  213. data/lib/hexapdf/type/annotations/polyline.rb +1 -1
  214. data/lib/hexapdf/type/annotations/square.rb +1 -1
  215. data/lib/hexapdf/type/annotations/square_circle.rb +1 -1
  216. data/lib/hexapdf/type/annotations/text.rb +1 -1
  217. data/lib/hexapdf/type/annotations/widget.rb +1 -1
  218. data/lib/hexapdf/type/annotations.rb +2 -1
  219. data/lib/hexapdf/type/catalog.rb +1 -1
  220. data/lib/hexapdf/type/cid_font.rb +1 -1
  221. data/lib/hexapdf/type/cmap.rb +1 -1
  222. data/lib/hexapdf/type/document_security_store.rb +1 -1
  223. data/lib/hexapdf/type/embedded_file.rb +1 -1
  224. data/lib/hexapdf/type/file_specification.rb +1 -1
  225. data/lib/hexapdf/type/font.rb +4 -4
  226. data/lib/hexapdf/type/font_descriptor.rb +1 -1
  227. data/lib/hexapdf/type/font_simple.rb +1 -1
  228. data/lib/hexapdf/type/font_true_type.rb +1 -1
  229. data/lib/hexapdf/type/font_type0.rb +1 -1
  230. data/lib/hexapdf/type/font_type1.rb +1 -1
  231. data/lib/hexapdf/type/font_type3.rb +6 -1
  232. data/lib/hexapdf/type/form.rb +1 -1
  233. data/lib/hexapdf/type/graphics_state_parameter.rb +1 -1
  234. data/lib/hexapdf/type/icon_fit.rb +1 -1
  235. data/lib/hexapdf/type/image.rb +1 -1
  236. data/lib/hexapdf/type/info.rb +1 -1
  237. data/lib/hexapdf/type/mark_information.rb +1 -1
  238. data/lib/hexapdf/type/marked_content_reference.rb +1 -1
  239. data/lib/hexapdf/type/measure.rb +1 -1
  240. data/lib/hexapdf/type/metadata.rb +1 -1
  241. data/lib/hexapdf/type/names.rb +1 -1
  242. data/lib/hexapdf/type/namespace.rb +1 -1
  243. data/lib/hexapdf/type/object_reference.rb +1 -1
  244. data/lib/hexapdf/type/object_stream.rb +1 -1
  245. data/lib/hexapdf/type/optional_content_configuration.rb +1 -1
  246. data/lib/hexapdf/type/optional_content_group.rb +1 -1
  247. data/lib/hexapdf/type/optional_content_membership.rb +1 -1
  248. data/lib/hexapdf/type/optional_content_properties.rb +1 -1
  249. data/lib/hexapdf/type/outline.rb +1 -1
  250. data/lib/hexapdf/type/outline_item.rb +1 -1
  251. data/lib/hexapdf/type/output_intent.rb +1 -1
  252. data/lib/hexapdf/type/page.rb +1 -1
  253. data/lib/hexapdf/type/page_label.rb +1 -1
  254. data/lib/hexapdf/type/page_tree_node.rb +1 -1
  255. data/lib/hexapdf/type/resources.rb +1 -1
  256. data/lib/hexapdf/type/struct_elem.rb +1 -1
  257. data/lib/hexapdf/type/struct_tree_root.rb +1 -1
  258. data/lib/hexapdf/type/trailer.rb +1 -1
  259. data/lib/hexapdf/type/viewer_preferences.rb +1 -1
  260. data/lib/hexapdf/type/xref_stream.rb +1 -1
  261. data/lib/hexapdf/type.rb +1 -1
  262. data/lib/hexapdf/utils/bit_field.rb +1 -1
  263. data/lib/hexapdf/utils/bit_stream.rb +1 -1
  264. data/lib/hexapdf/utils/graphics_helpers.rb +1 -1
  265. data/lib/hexapdf/utils/lru_cache.rb +1 -1
  266. data/lib/hexapdf/utils/math_helpers.rb +1 -1
  267. data/lib/hexapdf/utils/object_hash.rb +1 -1
  268. data/lib/hexapdf/utils/pdf_doc_encoding.rb +1 -1
  269. data/lib/hexapdf/utils/sorted_tree_node.rb +1 -1
  270. data/lib/hexapdf/utils.rb +1 -1
  271. data/lib/hexapdf/version.rb +2 -2
  272. data/lib/hexapdf/writer.rb +1 -1
  273. data/lib/hexapdf/xref_section.rb +1 -1
  274. data/lib/hexapdf.rb +1 -1
  275. data/test/hexapdf/digital_signature/common.rb +5 -5
  276. data/test/hexapdf/digital_signature/test_cms_handler.rb +1 -1
  277. data/test/hexapdf/document/test_annotations.rb +10 -0
  278. data/test/hexapdf/document/test_layout.rb +6 -3
  279. data/test/hexapdf/filter/test_brotli_decode.rb +1 -1
  280. data/test/hexapdf/font/cmap/test_writer.rb +8 -6
  281. data/test/hexapdf/font/test_true_type_wrapper.rb +6 -2
  282. data/test/hexapdf/font/true_type/test_subsetter.rb +7 -6
  283. data/test/hexapdf/font_loader/test_from_file.rb +7 -0
  284. data/test/hexapdf/layout/test_container_box.rb +3 -1
  285. data/test/hexapdf/layout/test_style.rb +4 -0
  286. data/test/hexapdf/layout/test_table_box.rb +117 -1
  287. data/test/hexapdf/layout/test_text_fragment.rb +18 -8
  288. data/test/hexapdf/layout/test_text_shaper.rb +55 -5
  289. data/test/hexapdf/task/test_import_pages.rb +126 -0
  290. data/test/hexapdf/test_serializer.rb +1 -1
  291. data/test/hexapdf/type/annotations/test_appearance_generator.rb +63 -0
  292. data/test/hexapdf/type/annotations/test_ink.rb +31 -0
  293. data/test/hexapdf/type/test_font_type3.rb +4 -0
  294. metadata +26 -2
@@ -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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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
@@ -77,6 +77,7 @@ module HexaPDF
77
77
  when :Circle then create_square_circle_appearance(:circle)
78
78
  when :Polygon then create_polygon_polyline_appearance(:polygon)
79
79
  when :PolyLine then create_polygon_polyline_appearance(:polyline)
80
+ when :Ink then create_ink_appearance
80
81
  else
81
82
  raise HexaPDF::Error, "Appearance regeneration for #{@annot[:Subtype]} not yet supported"
82
83
  end
@@ -362,6 +363,47 @@ module HexaPDF
362
363
 
363
364
  end
364
365
 
366
+ # Creates the appropriate appearance for an ink annotation.
367
+ #
368
+ # See: HexaPDF::Type::Annotations::Ink
369
+ def create_ink_appearance
370
+ # Prepare the annotation
371
+ form = (@annot[:AP] ||= {})[:N] ||=
372
+ @document.add({Type: :XObject, Subtype: :Form, BBox: [0, 0, 0, 0]})
373
+ form.contents = ""
374
+ @annot.flag(:print)
375
+ @annot.unflag(:hidden)
376
+
377
+ # Get all needed values from the annotation
378
+ paths = @annot.paths
379
+ border_style = @annot.border_style
380
+ opacity = @annot.opacity
381
+
382
+ # Calculate the annotation's rectangle as well as the form bounding box
383
+ x_coords = []
384
+ y_coords = []
385
+ paths.each do |path|
386
+ path.each_with_index {|coord, index| (index.even? ? x_coords : y_coords) << coord }
387
+ end
388
+ min_x, max_x = x_coords.minmax
389
+ min_y, max_y = y_coords.minmax
390
+ padding = 4 * border_style.width
391
+ rect = [min_x - padding, min_y - padding, max_x + padding, max_y + padding]
392
+ @annot[:Rect] = rect
393
+ form[:BBox] = rect.dup
394
+
395
+ # Set the appropriate graphics state
396
+ canvas = form.canvas(translate: false)
397
+ canvas.opacity(**opacity.to_h)
398
+ canvas.stroke_color(border_style.color) if border_style.color
399
+ canvas.line_width(border_style.width)
400
+ canvas.line_dash_pattern(border_style.style) if border_style.style.kind_of?(Array)
401
+
402
+ # Draw the polylines
403
+ paths.each {|path| canvas.polyline(*path) }
404
+ border_style.color ? canvas.stroke : canvas.end_path
405
+ end
406
+
365
407
  # Calculates the padding needed around the line endings based on the line ending +style+ and
366
408
  # the +border_width+.
367
409
  def calculate_line_ending_padding(style, border_width)
@@ -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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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
@@ -0,0 +1,107 @@
1
+ # -*- encoding: utf-8; frozen_string_literal: true -*-
2
+ #
3
+ #--
4
+ # This file is part of HexaPDF.
5
+ #
6
+ # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
+ # Copyright (C) 2014-2026 Thomas Leitner
8
+ #
9
+ # HexaPDF is free software: you can redistribute it and/or modify it
10
+ # under the terms of the GNU Affero General Public License version 3 as
11
+ # published by the Free Software Foundation with the addition of the
12
+ # following permission added to Section 15 as permitted in Section 7(a):
13
+ # FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY
14
+ # THOMAS LEITNER, THOMAS LEITNER DISCLAIMS THE WARRANTY OF NON
15
+ # INFRINGEMENT OF THIRD PARTY RIGHTS.
16
+ #
17
+ # HexaPDF is distributed in the hope that it will be useful, but WITHOUT
18
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
19
+ # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
20
+ # License for more details.
21
+ #
22
+ # You should have received a copy of the GNU Affero General Public License
23
+ # along with HexaPDF. If not, see <http://www.gnu.org/licenses/>.
24
+ #
25
+ # The interactive user interfaces in modified source and object code
26
+ # versions of HexaPDF must display Appropriate Legal Notices, as required
27
+ # under Section 5 of the GNU Affero General Public License version 3.
28
+ #
29
+ # In accordance with Section 7(b) of the GNU Affero General Public
30
+ # License, a covered work must retain the producer line in every PDF that
31
+ # is created or manipulated using HexaPDF.
32
+ #
33
+ # If the GNU Affero General Public License doesn't fit your need,
34
+ # commercial licenses are available at <https://gettalong.at/hexapdf/>.
35
+ #++
36
+
37
+ require 'hexapdf/type/annotation'
38
+
39
+ module HexaPDF
40
+ module Type
41
+ module Annotations
42
+
43
+ # An ink annotation is a markup annotation that displays a freehand "scribble" composed of one
44
+ # or more disjoint paths.
45
+ #
46
+ # The convenience method #add_path can be used to add paths to the annotation.
47
+ #
48
+ # The style of the scribble can be customized using the convenience methods Annotation#opacity
49
+ # and BorderStyling#border_style (note that only a simple line dash pattern is supported).
50
+ #
51
+ # Example:
52
+ #
53
+ # #>pdf-small
54
+ # doc.annotations.create_scribble(doc.pages[0]).
55
+ # add_path(10, 10, 50, 40, 40, 80, 80, 60).
56
+ # add_path(5, 90, 20, 90, 15, 50, 80, 5).
57
+ # border_style(color: "hp-blue", width: 2, style: [3, 1]).
58
+ # regenerate_appearance
59
+ #
60
+ # See: PDF2.0 s12.5.6.13, HexaPDF::Type::MarkupAnnotation
61
+ class Ink < MarkupAnnotation
62
+
63
+ include BorderStyling
64
+
65
+ define_field :Subtype, type: Symbol, required: true, default: :Ink
66
+ define_field :InkList, type: PDFArray, required: true
67
+ define_field :BS, type: :Border
68
+ define_field :Path, type: PDFArray, version: '2.0'
69
+
70
+ # :call-seq:
71
+ # annot.paths => [[x00, y00, x01, y01, ...], [x10, y10, x11, y11, ...], ...]
72
+ #
73
+ # Returns an array with all the paths of this annotation.
74
+ def paths
75
+ self[:InkList].to_a
76
+ end
77
+
78
+ # :call-seq:
79
+ # annot.add_path => [x0, y0, x1, y1, ...]
80
+ # annot.add_path(*points) => annot
81
+ #
82
+ # Adds the path consisting of the given +points+ to the list of paths and returns self.
83
+ #
84
+ # Adding at least one path is required. Note, however, that without setting the appearance
85
+ # style through convenience methods like #border_style nothing will be shown.
86
+ #
87
+ # Example:
88
+ #
89
+ # #>pdf-small
90
+ # doc.annotations.create_scribble(doc.pages[0]).
91
+ # add_path(10, 10, 40, 60, 90, 90).
92
+ # regenerate_appearance
93
+ def add_path(*points)
94
+ if points.length % 2 != 0
95
+ raise ArgumentError, "An even number of arguments must be provided"
96
+ else
97
+ self[:InkList] ||= []
98
+ self[:InkList] << points
99
+ self
100
+ end
101
+ end
102
+
103
+ end
104
+
105
+ end
106
+ end
107
+ 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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
@@ -60,6 +60,7 @@ module HexaPDF
60
60
  autoload(:PolygonPolyline, 'hexapdf/type/annotations/polygon_polyline')
61
61
  autoload(:Polygon, 'hexapdf/type/annotations/polygon')
62
62
  autoload(:Polyline, 'hexapdf/type/annotations/polyline')
63
+ autoload(:Ink, 'hexapdf/type/annotations/ink')
63
64
 
64
65
  end
65
66
 
@@ -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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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
@@ -89,13 +89,13 @@ module HexaPDF
89
89
 
90
90
  # Returns +true+ if the font is embedded.
91
91
  def embedded?
92
- dict = self[:FontDescriptor]
93
- dict && (dict[:FontFile] || dict[:FontFile2] || dict[:FontFile3])
92
+ font_file
94
93
  end
95
94
 
96
95
  # Returns the embeeded font file object or +nil+ if the font is not embedded.
97
96
  def font_file
98
- embedded?
97
+ dict = self[:FontDescriptor]
98
+ dict && (dict[:FontFile] || dict[:FontFile2] || dict[:FontFile3])
99
99
  end
100
100
 
101
101
  # Returns the glyph scaling factor for transforming from glyph space to text space.
@@ -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-2025 Thomas Leitner
7
+ # Copyright (C) 2014-2026 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