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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 04f2a87f1aaa95513275432d718996b7d598fc15e476f6999f6b6fe9f29cd0f8
4
- data.tar.gz: 539d2b0e984db4ca4095bf0aad5208fbbdff5a08acc80d270a6b1c824f12c87e
3
+ metadata.gz: d51b41e4326a58a6c3d51e8ee0ee3ce1ee194199d9967817240dac81205ba573
4
+ data.tar.gz: ac3ca606173c2fad485bf5df8d5fb8947c33aab2fc28b970516adedf804de5eb
5
5
  SHA512:
6
- metadata.gz: c35f8b0267ef60c6392ae99d8c001e4d6b5e18ea1f5a62132d44bbf865d52cc8a9b08436e107c35a01d3a6edaeb7be9bcede20931a255416d4ea4d07778f8fc0
7
- data.tar.gz: bfdedefe99c534d62b11f406b447902ea6824758153448ebfba35d0e456850134ba36a6cb2c97d668983e8a5b5b96bf0ab0a03c6136f2478a7717a0e7bb0933b
6
+ metadata.gz: dea3e27895918e159dedb6b8ff44b5db055e886656d1439d8d927fab57e9b1039489d9234392109b52a881ae67a02716c48a12dba9534e4d7894ab5e4c93251f
7
+ data.tar.gz: bef1d2e5217562c4772e1dc16a1a38e8342c741a1bcc404cabe203ed07268e8e25c2f5476749a8712362cece9dada4ed91e6e989a88872f7c4d08c3e24298823
data/CHANGELOG.md CHANGED
@@ -1,3 +1,52 @@
1
+ ## 1.9.0 - 2026-06-07
2
+
3
+ ### Added
4
+
5
+ * Support for HarfBuzz based text shaping
6
+ * [HexaPDF::Layout::Style#shaping_engine] for specifying the used shaping engine
7
+ * [HexaPDF::Layout::Style#font_script] for specifying the script of text
8
+ * [HexaPDF::Layout::Style#language] for specifying the language of text
9
+ * [HexaPDF::Layout::Style#direction] for specifying the direction of text
10
+ * [HexaPDF::Font::TrueTypeWrapper#filename] for retrieving the filename from
11
+ which the wrapped font was created
12
+ * Inter as bundled font in variants regular, bold, italic and bold italic
13
+ * [HexaPDF::Type::Annotations::Ink] for ink annotations as well as
14
+ [HexaPDF::Document::Annotations#create_scribble]
15
+
16
+ ### Changed
17
+
18
+ * [HexaPDF::Layout::TableBox] to support splitting cells
19
+ * [HexaPDF::Font::CMap::Writer] to support ToUnicode CMaps with mappings from
20
+ one input code to multiple codepoints
21
+
22
+ ### Fixed
23
+
24
+ * [HexaPDF::Layout::ContainerBox] to correctly set width and height when
25
+ splitting
26
+
27
+
28
+ ## 1.8.0 - 2026-05-14
29
+
30
+ ### Added
31
+
32
+ * [HexaPDF::Task::ImportPages] for importing pages while preserving the optional
33
+ content configuration and interactive form fields
34
+ * [HexaPDF::Type::FontType3#embedded?] as Type 3 fonts are always embedded
35
+ * CLI options `--acro-form` and `--optional-content` to `hexapdf merge` for
36
+ specifying how interactive form fields and optional content are handled
37
+
38
+ ### Changed
39
+
40
+ * Serialization of strings to avoid problems with buggy Ghostscript versions
41
+ * [HexaPDF::FontLoader::FromFile] to raise an error when loading a non-TrueType
42
+ font
43
+
44
+ ### Fixed
45
+
46
+ * CLI command `hexapdf fonts` to work for Type 3 fonts
47
+ * CLI command `hexapdf images` to correctly show images nested in Form XObjects
48
+
49
+
1
50
  ## 1.7.0 - 2026-04-13
2
51
 
3
52
  ### Added
@@ -7,7 +56,7 @@
7
56
  * Support for digitally signing with DSA keys
8
57
  * Support for BrotliDecode filter
9
58
  * [HexaPDF::Type::DocumentSecurityStore] and
10
- [HexaPDF::Type::ValidationRelatedInformation]
59
+ [HexaPDF::Type::DocumentSecurityStore::ValidationRelatedInformation]
11
60
 
12
61
  ### Changed
13
62
 
data/LICENSE CHANGED
@@ -1,5 +1,5 @@
1
1
  HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
2
- Copyright (C) 2014-2025 Thomas Leitner
2
+ Copyright (C) 2014-2026 Thomas Leitner
3
3
 
4
4
  HexaPDF is free software: you can redistribute it and/or modify it
5
5
  under the terms of the GNU Affero General Public License version 3 as
data/README.md CHANGED
@@ -177,6 +177,9 @@ Some included files have a different license:
177
177
 
178
178
  * The file `test/data/fonts/Ubuntu-Title.ttf` is licensed under the SIL Open Font License.
179
179
 
180
+ * The files in `data/hexapdf/fonts` are licensed under SIL Open Font License, Version 1.1, see the
181
+ file `data/hexapdf/fonts/OFL.txt`.
182
+
180
183
  * The AES test vector files in `test/data/aes-test-vectors` have been created using the test vector
181
184
  file available from <http://csrc.nist.gov/groups/STM/cavp/block-ciphers.html#test-vectors>.
182
185
 
data/Rakefile CHANGED
@@ -47,7 +47,7 @@ namespace :dev do
47
47
  end
48
48
 
49
49
  task :test_all do
50
- versions = `rbenv versions --bare | grep -i ^3.`.split("\n")
50
+ versions = `rbenv versions --bare | grep -i '^3.[2-9]\\|^4.'`.split("\n")
51
51
  versions.each do |version|
52
52
  sh "eval \"$(rbenv init -)\"; rbenv shell #{version} && ruby -v && rake test"
53
53
  end
Binary file
Binary file
@@ -0,0 +1,92 @@
1
+ Copyright (c) 2016 The Inter Project Authors (https://github.com/rsms/inter)
2
+
3
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
4
+ This license is copied below, and is also available with a FAQ at:
5
+ http://scripts.sil.org/OFL
6
+
7
+ -----------------------------------------------------------
8
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
9
+ -----------------------------------------------------------
10
+
11
+ PREAMBLE
12
+ The goals of the Open Font License (OFL) are to stimulate worldwide
13
+ development of collaborative font projects, to support the font creation
14
+ efforts of academic and linguistic communities, and to provide a free and
15
+ open framework in which fonts may be shared and improved in partnership
16
+ with others.
17
+
18
+ The OFL allows the licensed fonts to be used, studied, modified and
19
+ redistributed freely as long as they are not sold by themselves. The
20
+ fonts, including any derivative works, can be bundled, embedded,
21
+ redistributed and/or sold with any software provided that any reserved
22
+ names are not used by derivative works. The fonts and derivatives,
23
+ however, cannot be released under any other type of license. The
24
+ requirement for fonts to remain under this license does not apply
25
+ to any document created using the fonts or their derivatives.
26
+
27
+ DEFINITIONS
28
+ "Font Software" refers to the set of files released by the Copyright
29
+ Holder(s) under this license and clearly marked as such. This may
30
+ include source files, build scripts and documentation.
31
+
32
+ "Reserved Font Name" refers to any names specified as such after the
33
+ copyright statement(s).
34
+
35
+ "Original Version" refers to the collection of Font Software components as
36
+ distributed by the Copyright Holder(s).
37
+
38
+ "Modified Version" refers to any derivative made by adding to, deleting,
39
+ or substituting -- in part or in whole -- any of the components of the
40
+ Original Version, by changing formats or by porting the Font Software to a
41
+ new environment.
42
+
43
+ "Author" refers to any designer, engineer, programmer, technical
44
+ writer or other person who contributed to the Font Software.
45
+
46
+ PERMISSION AND CONDITIONS
47
+ Permission is hereby granted, free of charge, to any person obtaining
48
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
49
+ redistribute, and sell modified and unmodified copies of the Font
50
+ Software, subject to the following conditions:
51
+
52
+ 1) Neither the Font Software nor any of its individual components,
53
+ in Original or Modified Versions, may be sold by itself.
54
+
55
+ 2) Original or Modified Versions of the Font Software may be bundled,
56
+ redistributed and/or sold with any software, provided that each copy
57
+ contains the above copyright notice and this license. These can be
58
+ included either as stand-alone text files, human-readable headers or
59
+ in the appropriate machine-readable metadata fields within text or
60
+ binary files as long as those fields can be easily viewed by the user.
61
+
62
+ 3) No Modified Version of the Font Software may use the Reserved Font
63
+ Name(s) unless explicit written permission is granted by the corresponding
64
+ Copyright Holder. This restriction only applies to the primary font name as
65
+ presented to the users.
66
+
67
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
68
+ Software shall not be used to promote, endorse or advertise any
69
+ Modified Version, except to acknowledge the contribution(s) of the
70
+ Copyright Holder(s) and the Author(s) or with their explicit written
71
+ permission.
72
+
73
+ 5) The Font Software, modified or unmodified, in part or in whole,
74
+ must be distributed entirely under this license, and must not be
75
+ distributed under any other license. The requirement for fonts to
76
+ remain under this license does not apply to any document created
77
+ using the Font Software.
78
+
79
+ TERMINATION
80
+ This license becomes null and void if any of the above conditions are
81
+ not met.
82
+
83
+ DISCLAIMER
84
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
85
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
86
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
87
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
88
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
89
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
90
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
91
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
92
+ OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -8,7 +8,8 @@
8
8
  #
9
9
  # For example, named destinations are not properly handled by the code.
10
10
  # Sometimes other things like attached files or a document outline
11
- # should also be preserved.
11
+ # should also be preserved. For more advanced importing of pages see
12
+ # [HexaPDF::Task::ImportPages].
12
13
  #
13
14
  # The hexapdf binary provides a command for merging files which does
14
15
  # the merging in a more sophisticated way.
@@ -4,7 +4,8 @@
4
4
  # fields. HexaPDF supports the creation and processing of these forms.
5
5
  #
6
6
  # This example show-cases how to create the various form field types and their
7
- # possible standard appearances.
7
+ # possible standard appearances (e.g. setting the background color and border
8
+ # style).
8
9
  #
9
10
  # The [HexaPDF::Type::AcroForm::Form] and [HexaPDF::Type::AcroForm::Field]
10
11
  # classes provide a plethora of convenience methods for working with forms, like
@@ -52,6 +53,7 @@ canvas.text("Text fields", at: [50, 480])
52
53
  canvas.text("Single line", at: [70, 450])
53
54
  tx = form.create_text_field("Single Line", font_size: 16)
54
55
  widget = tx.create_widget(page, Rect: [200, 445, 500, 465])
56
+ widget.background_color("lightyellow").border_style(color: "black", style: [2])
55
57
  tx.field_value = "A sample test string!"
56
58
 
57
59
  canvas.text("Multiline", at: [70, 420])
data/examples/030-pdfa.rb CHANGED
@@ -13,14 +13,6 @@ require 'hexapdf'
13
13
 
14
14
  HexaPDF::Composer.create('pdfa.pdf') do |composer|
15
15
  composer.document.task(:pdfa)
16
- composer.document.config['font.map'] = {
17
- 'Lato' => {
18
- none: '/usr/share/fonts/truetype/lato/Lato-Regular.ttf',
19
- bold: '/usr/share/fonts/truetype/lato/Lato-Bold.ttf',
20
- italic: '/usr/share/fonts/truetype/lato/Lato-Italic.ttf',
21
- bold_italic: '/usr/share/fonts/truetype/lato/Lato-BoldItalic.ttf',
22
- },
23
- }
24
16
 
25
17
  company = {
26
18
  name: 'Sample Corp Limited',
@@ -29,21 +21,21 @@ HexaPDF::Composer.create('pdfa.pdf') do |composer|
29
21
 
30
22
  # Define all styles
31
23
  composer.styles(
32
- base: {font: 'Lato', font_size: 10, line_spacing: 1.3},
24
+ base: {font: 'Inter', font_size: 10, line_spacing: 1.3},
33
25
  top: {font_size: 8},
34
26
  top_box: {padding: [100, 0, 0], margin: [0, 0, 10], border: {width: [0, 0, 1]}},
35
- header: {font: 'Lato bold', font_size: 20, margin: [50, 0, 20]},
27
+ header: {font: 'Inter bold', font_size: 20, margin: [50, 0, 20]},
36
28
  line_items: {border: {width: 1, color: "eee"}, margin: [20, 0]},
37
29
  line_item_cell: {font_size: 8},
38
30
  footer: {border: {width: [1, 0, 0], color: "darkgrey"}, padding: [5, 0, 0],
39
31
  valign: :bottom},
40
- footer_heading: {font: 'Lato bold', font_size: 8, padding: [0, 0, 8]},
32
+ footer_heading: {font: 'Inter bold', font_size: 8, padding: [0, 0, 8]},
41
33
  footer_text: {font_size: 8, fill_color: "darkgrey"},
42
34
  )
43
35
 
44
36
  # Top part
45
37
  composer.box(:container, style: :top_box) do |container|
46
- container.formatted_text([{text: company[:name], font: 'Lato bold'},
38
+ container.formatted_text([{text: company[:name], font: 'Inter bold'},
47
39
  " - " + company[:address].join(' - ')], style: :top)
48
40
  end
49
41
  composer.text("Mega Client\nSmall Lane 5\n67890 Noonestown", mask_mode: :box)
@@ -52,7 +44,7 @@ HexaPDF::Composer.create('pdfa.pdf') do |composer|
52
44
  ["Service date:", "2024-02-01"]]
53
45
  composer.table(cells, column_widths: [150, 80], style: {align: :right}) do |args|
54
46
  args[] = {cell: {border: {width: 0}, padding: 2}, text_align: :right}
55
- args[0..-1, 0] = {font: 'Lato bold'}
47
+ args[0..-1, 0] = {font: 'Inter bold'}
56
48
  end
57
49
 
58
50
  # Middle part
@@ -67,10 +59,11 @@ HexaPDF::Composer.create('pdfa.pdf') do |composer|
67
59
  cells << [nil, nil, nil, "€ #{250 * max * (max + 1) / 2},00"]
68
60
  composer.table(cells, column_widths: [250, 80], style: :line_items) do |args|
69
61
  args[] = {cell: {border: {width: 0}, padding: 8}, style: :line_item_cell}
70
- args[0] = {cell: {background_color: "eee"}, font: "Lato bold"}
62
+ args[0] = {cell: {background_color: "eee"}, font: "Inter bold"}
71
63
  args[-1] = {cell: {background_color: "eee", border: {width: [2, 0, 0]}},
72
- font: "Lato bold"}
73
- args[0..-1, 1..-1] = {text_align: :right}
64
+ font: "Inter bold"}
65
+ args[0..-1, 1..-1] = {text_align: :right, shaping_engine: :harfbuzz,
66
+ font_features: {tnum: true}}
74
67
  end
75
68
 
76
69
  composer.text("Please transfer the total amount via SEPA transfer to the bank " \
@@ -0,0 +1,37 @@
1
+ # # Text Shaping
2
+ #
3
+ # The built-in text shaping functionality is very limited. However, it is
4
+ # possible to switch to a HarfBuzz based implementation (using the
5
+ # `harfbuzz-ruby` gem) that supports many languages and scripts as well as
6
+ # OpenType features. Note that this only works with TrueType fonts!
7
+ #
8
+ # In general it is advised to use TrueType font files and enable HarfBuzz as the
9
+ # result is more correct and visually better. The disadvantage is that the
10
+ # additional processing requirements have a slight performance impact.
11
+ #
12
+ # By using the 'font_features' style property it is possible to selectively
13
+ # enable/disable OpenType features like discretionary ligatures. Note that fonts
14
+ # determine which features are on by default (like 'calt' for the Inter font
15
+ # used in this example).
16
+ #
17
+ # Usage:
18
+ # : `ruby text_shaping.rb`
19
+ #
20
+
21
+ require 'hexapdf'
22
+
23
+ sample_text = <<EOT.tr("\n", " ")
24
+ This sample shows some OpenType features, like contextual alternatives (2*3 and
25
+ -->), discretionary ligatures (difficult?!), fractions (15/157) or compositions
26
+ (5⃝ ×⃞ 3⃝ =⃞ 1⃝5⃝).
27
+ EOT
28
+
29
+ HexaPDF::Composer.create('text_shaping.pdf') do |composer|
30
+ composer.style(:base, font: 'Inter')
31
+ composer.style(:header, font_bold: true, margin: [10, 0, 0])
32
+ composer.text('Without HarfBuzz', style: :header)
33
+ composer.text(sample_text)
34
+ composer.text('With HarfBuzz', style: :header)
35
+ composer.text(sample_text, shaping_engine: :harfbuzz,
36
+ font_features: {dlig: true, frac: true})
37
+ 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
@@ -96,11 +96,13 @@ module HexaPDF
96
96
  else
97
97
  "Built-in"
98
98
  end
99
- size = human_readable_file_size(font.embedded? ? font.font_file[:Length] : 0)
99
+ size = human_readable_file_size(font.embedded? && font_type != 'Type 3' ?
100
+ font.font_file[:Length] : 0)
101
+ font_name = font[:BaseFont] || font[:FontDescriptor][:FontName]
100
102
  embedded = (font.embedded? ? "yes" : "no")
101
- subset = (font[:BaseFont].match?(/\A[A-Z]{6}\+/) ? "yes" : "no")
103
+ subset = font_name.match?(/\A[A-Z]{6}\+/) ? "yes" : "no"
102
104
  printf("%5s %-40s %-12s %-10s %-3s %-3s %8s %9s\n",
103
- pindex, font[:BaseFont], font_type, encoding,
105
+ pindex, font_name, font_type, encoding,
104
106
  embedded, subset, size, "#{font.oid},#{font.gen}")
105
107
  end
106
108
  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
@@ -52,11 +52,10 @@ module HexaPDF
52
52
  # The mapping of XObject name to [x_ppi, y_ppi].
53
53
  attr_reader :result
54
54
 
55
- # Initialize the processor with the names of the images for which the PPI should be
56
- # determined.
57
- def initialize(names, user_unit)
55
+ # Initialize the processor with the image XObjects for which the PPI should be determined.
56
+ def initialize(images, user_unit)
58
57
  super()
59
- @names = names
58
+ @images = images
60
59
  @user_unit = user_unit
61
60
  @result = {}
62
61
  end
@@ -64,9 +63,8 @@ module HexaPDF
64
63
  # Determine the PPI in x- and y-directions of the specified images.
65
64
  def paint_xobject(name)
66
65
  super
67
- return unless @names.delete(name)
68
66
  xobject = resources.xobject(name)
69
- return unless xobject[:Subtype] == :Image
67
+ return unless @images.delete(xobject) && xobject[:Subtype] == :Image
70
68
 
71
69
  w, h = xobject.width, xobject.height
72
70
  llx, lly = graphics_state.ctm.evaluate(0, 0).map {|i| i * @user_unit }
@@ -75,8 +73,8 @@ module HexaPDF
75
73
 
76
74
  x_ppi = 72.0 * w / Math.sqrt((lrx - llx)**2 + (lry - lly)**2)
77
75
  y_ppi = 72.0 * h / Math.sqrt((ulx - llx)**2 + (uly - lly)**2)
78
- @result[name] = [x_ppi.round, y_ppi.round]
79
- raise StopIteration if @names.empty?
76
+ @result[xobject] = [x_ppi.round, y_ppi.round]
77
+ raise StopIteration if @images.empty?
80
78
  end
81
79
 
82
80
  end
@@ -182,17 +180,19 @@ module HexaPDF
182
180
  seen = {}
183
181
 
184
182
  doc.pages.each_with_index do |page, pindex|
185
- image_names = []
186
- xobjects = page.resources[:XObject]
187
-
188
- xobjects&.each&.map do |name, xobject|
189
- image_names << name if xobject[:Subtype] == :Image && !xobject[:ImageMask]
183
+ images = []
184
+ process_xobject_entry = lambda do |name, xobject|
185
+ if xobject[:Subtype] == :Image && !xobject[:ImageMask]
186
+ images << xobject
187
+ elsif xobject[:Subtype] == :Form
188
+ xobject.resources[:XObject]&.each(&process_xobject_entry)
189
+ end
190
190
  end
191
+ page.resources[:XObject]&.each(&process_xobject_entry)
191
192
 
192
- processor = ImageLocationProcessor.new(image_names, page[:UserUnit] || 1)
193
+ processor = ImageLocationProcessor.new(images, page[:UserUnit] || 1)
193
194
  page.process_contents(processor)
194
- processor.result.each do |name, ppi|
195
- xobject = xobjects[name]
195
+ processor.result.each do |xobject, ppi|
196
196
  if seen[xobject]
197
197
  yield(xobject, seen[xobject], pindex + 1, ppi)
198
198
  else
@@ -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
@@ -80,6 +80,14 @@ module HexaPDF
80
80
  "false)") do |c|
81
81
  @interleave = c
82
82
  end
83
+ options.on("--acro-form MODE", [:merge, :ignore], "Handling of interactive forms (either " \
84
+ "merge or ignore; default: merge)") do |mode|
85
+ @acro_form_mode = mode
86
+ end
87
+ options.on("--optional-content MODE", [:preserve, :ignore], "Handling of optional " \
88
+ "content (either preserve or ignore; default: preserve)") do |mode|
89
+ @optional_content_mode = mode
90
+ end
83
91
 
84
92
  options.separator("")
85
93
  options.separator("Output related options")
@@ -89,6 +97,8 @@ module HexaPDF
89
97
  @files = []
90
98
  @initial_empty = false
91
99
  @interleave = false
100
+ @acro_form_mode = :merge
101
+ @optional_content_mode = :preserve
92
102
  end
93
103
 
94
104
  def execute #:nodoc:
@@ -179,7 +189,9 @@ module HexaPDF
179
189
  page.value.update(page.copy_inherited_values)
180
190
  page = page.deep_copy unless source_index == 0
181
191
  else
182
- page = page_tree.document.import(page).deep_copy
192
+ page = page_tree.document.task(:import_pages, source: page.document, append: false,
193
+ pages: [page], ocgs: @optional_content_mode,
194
+ acro_form: @acro_form_mode)[0].deep_copy
183
195
  end
184
196
  if rotation == :none
185
197
  page.delete(:Rotate)
@@ -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
data/lib/hexapdf/cli.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-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