hexapdf 0.30.0 → 0.32.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (241) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +54 -1
  3. data/LICENSE +1 -1
  4. data/examples/020-column_box.rb +10 -11
  5. data/examples/021-list_box.rb +5 -5
  6. data/lib/hexapdf/cli/batch.rb +1 -1
  7. data/lib/hexapdf/cli/command.rb +17 -2
  8. data/lib/hexapdf/cli/files.rb +1 -1
  9. data/lib/hexapdf/cli/fonts.rb +1 -1
  10. data/lib/hexapdf/cli/form.rb +1 -1
  11. data/lib/hexapdf/cli/image2pdf.rb +1 -1
  12. data/lib/hexapdf/cli/images.rb +1 -1
  13. data/lib/hexapdf/cli/info.rb +10 -2
  14. data/lib/hexapdf/cli/inspect.rb +3 -3
  15. data/lib/hexapdf/cli/merge.rb +1 -1
  16. data/lib/hexapdf/cli/modify.rb +1 -1
  17. data/lib/hexapdf/cli/optimize.rb +1 -1
  18. data/lib/hexapdf/cli/split.rb +1 -1
  19. data/lib/hexapdf/cli/watermark.rb +1 -1
  20. data/lib/hexapdf/cli.rb +1 -1
  21. data/lib/hexapdf/composer.rb +97 -29
  22. data/lib/hexapdf/configuration.rb +18 -5
  23. data/lib/hexapdf/content/canvas.rb +1 -1
  24. data/lib/hexapdf/content/color_space.rb +1 -1
  25. data/lib/hexapdf/content/graphic_object/arc.rb +1 -1
  26. data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +1 -1
  27. data/lib/hexapdf/content/graphic_object/geom2d.rb +1 -1
  28. data/lib/hexapdf/content/graphic_object/solid_arc.rb +1 -1
  29. data/lib/hexapdf/content/graphic_object.rb +1 -1
  30. data/lib/hexapdf/content/graphics_state.rb +1 -1
  31. data/lib/hexapdf/content/operator.rb +1 -1
  32. data/lib/hexapdf/content/parser.rb +1 -1
  33. data/lib/hexapdf/content/processor.rb +1 -1
  34. data/lib/hexapdf/content/transformation_matrix.rb +1 -1
  35. data/lib/hexapdf/content.rb +1 -1
  36. data/lib/hexapdf/data_dir.rb +1 -1
  37. data/lib/hexapdf/dictionary.rb +1 -1
  38. data/lib/hexapdf/dictionary_fields.rb +1 -1
  39. data/lib/hexapdf/digital_signature/cms_handler.rb +1 -1
  40. data/lib/hexapdf/digital_signature/handler.rb +1 -1
  41. data/lib/hexapdf/digital_signature/pkcs1_handler.rb +1 -1
  42. data/lib/hexapdf/digital_signature/signature.rb +1 -1
  43. data/lib/hexapdf/digital_signature/signatures.rb +1 -1
  44. data/lib/hexapdf/digital_signature/signing/default_handler.rb +1 -1
  45. data/lib/hexapdf/digital_signature/signing/signed_data_creator.rb +1 -1
  46. data/lib/hexapdf/digital_signature/signing/timestamp_handler.rb +1 -1
  47. data/lib/hexapdf/digital_signature/signing.rb +1 -1
  48. data/lib/hexapdf/digital_signature/verification_result.rb +1 -1
  49. data/lib/hexapdf/digital_signature.rb +1 -1
  50. data/lib/hexapdf/document/destinations.rb +1 -1
  51. data/lib/hexapdf/document/files.rb +1 -1
  52. data/lib/hexapdf/document/fonts.rb +1 -1
  53. data/lib/hexapdf/document/images.rb +1 -1
  54. data/lib/hexapdf/document/layout.rb +122 -39
  55. data/lib/hexapdf/document/pages.rb +2 -6
  56. data/lib/hexapdf/document.rb +9 -2
  57. data/lib/hexapdf/encryption/aes.rb +3 -1
  58. data/lib/hexapdf/encryption/arc4.rb +1 -1
  59. data/lib/hexapdf/encryption/fast_aes.rb +1 -1
  60. data/lib/hexapdf/encryption/fast_arc4.rb +1 -1
  61. data/lib/hexapdf/encryption/identity.rb +1 -1
  62. data/lib/hexapdf/encryption/ruby_aes.rb +1 -1
  63. data/lib/hexapdf/encryption/ruby_arc4.rb +1 -1
  64. data/lib/hexapdf/encryption/security_handler.rb +4 -1
  65. data/lib/hexapdf/encryption/standard_security_handler.rb +1 -1
  66. data/lib/hexapdf/encryption.rb +1 -1
  67. data/lib/hexapdf/error.rb +12 -2
  68. data/lib/hexapdf/filter/ascii85_decode.rb +1 -1
  69. data/lib/hexapdf/filter/ascii_hex_decode.rb +1 -1
  70. data/lib/hexapdf/filter/crypt.rb +1 -1
  71. data/lib/hexapdf/filter/encryption.rb +1 -1
  72. data/lib/hexapdf/filter/flate_decode.rb +21 -9
  73. data/lib/hexapdf/filter/lzw_decode.rb +1 -1
  74. data/lib/hexapdf/filter/pass_through.rb +1 -1
  75. data/lib/hexapdf/filter/predictor.rb +1 -1
  76. data/lib/hexapdf/filter/run_length_decode.rb +1 -1
  77. data/lib/hexapdf/filter.rb +1 -1
  78. data/lib/hexapdf/font/cmap/parser.rb +1 -1
  79. data/lib/hexapdf/font/cmap/writer.rb +1 -1
  80. data/lib/hexapdf/font/cmap.rb +1 -1
  81. data/lib/hexapdf/font/encoding/base.rb +1 -1
  82. data/lib/hexapdf/font/encoding/difference_encoding.rb +1 -1
  83. data/lib/hexapdf/font/encoding/glyph_list.rb +1 -1
  84. data/lib/hexapdf/font/encoding/mac_expert_encoding.rb +1 -1
  85. data/lib/hexapdf/font/encoding/mac_roman_encoding.rb +1 -1
  86. data/lib/hexapdf/font/encoding/standard_encoding.rb +1 -1
  87. data/lib/hexapdf/font/encoding/symbol_encoding.rb +1 -1
  88. data/lib/hexapdf/font/encoding/win_ansi_encoding.rb +1 -1
  89. data/lib/hexapdf/font/encoding/zapf_dingbats_encoding.rb +1 -1
  90. data/lib/hexapdf/font/encoding.rb +1 -1
  91. data/lib/hexapdf/font/invalid_glyph.rb +1 -1
  92. data/lib/hexapdf/font/true_type/builder.rb +1 -1
  93. data/lib/hexapdf/font/true_type/font.rb +1 -1
  94. data/lib/hexapdf/font/true_type/optimizer.rb +1 -1
  95. data/lib/hexapdf/font/true_type/subsetter.rb +1 -1
  96. data/lib/hexapdf/font/true_type/table/cmap.rb +1 -1
  97. data/lib/hexapdf/font/true_type/table/cmap_subtable.rb +1 -1
  98. data/lib/hexapdf/font/true_type/table/directory.rb +1 -1
  99. data/lib/hexapdf/font/true_type/table/glyf.rb +1 -1
  100. data/lib/hexapdf/font/true_type/table/head.rb +1 -1
  101. data/lib/hexapdf/font/true_type/table/hhea.rb +1 -1
  102. data/lib/hexapdf/font/true_type/table/hmtx.rb +1 -1
  103. data/lib/hexapdf/font/true_type/table/kern.rb +1 -1
  104. data/lib/hexapdf/font/true_type/table/loca.rb +1 -1
  105. data/lib/hexapdf/font/true_type/table/maxp.rb +1 -1
  106. data/lib/hexapdf/font/true_type/table/name.rb +1 -1
  107. data/lib/hexapdf/font/true_type/table/os2.rb +1 -1
  108. data/lib/hexapdf/font/true_type/table/post.rb +1 -1
  109. data/lib/hexapdf/font/true_type/table.rb +1 -1
  110. data/lib/hexapdf/font/true_type.rb +1 -1
  111. data/lib/hexapdf/font/true_type_wrapper.rb +1 -1
  112. data/lib/hexapdf/font/type1/afm_parser.rb +1 -1
  113. data/lib/hexapdf/font/type1/character_metrics.rb +1 -1
  114. data/lib/hexapdf/font/type1/font.rb +1 -1
  115. data/lib/hexapdf/font/type1/font_metrics.rb +1 -1
  116. data/lib/hexapdf/font/type1/pfb_parser.rb +1 -1
  117. data/lib/hexapdf/font/type1.rb +1 -1
  118. data/lib/hexapdf/font/type1_wrapper.rb +1 -1
  119. data/lib/hexapdf/font_loader/from_configuration.rb +1 -1
  120. data/lib/hexapdf/font_loader/from_file.rb +1 -1
  121. data/lib/hexapdf/font_loader/standard14.rb +1 -1
  122. data/lib/hexapdf/font_loader.rb +1 -1
  123. data/lib/hexapdf/image_loader/jpeg.rb +1 -1
  124. data/lib/hexapdf/image_loader/pdf.rb +1 -1
  125. data/lib/hexapdf/image_loader/png.rb +1 -1
  126. data/lib/hexapdf/image_loader.rb +1 -1
  127. data/lib/hexapdf/importer.rb +1 -1
  128. data/lib/hexapdf/layout/box.rb +1 -1
  129. data/lib/hexapdf/layout/box_fitter.rb +1 -1
  130. data/lib/hexapdf/layout/column_box.rb +1 -1
  131. data/lib/hexapdf/layout/frame.rb +1 -1
  132. data/lib/hexapdf/layout/image_box.rb +1 -1
  133. data/lib/hexapdf/layout/inline_box.rb +17 -3
  134. data/lib/hexapdf/layout/line.rb +1 -1
  135. data/lib/hexapdf/layout/list_box.rb +1 -1
  136. data/lib/hexapdf/layout/numeric_refinements.rb +1 -1
  137. data/lib/hexapdf/layout/page_style.rb +144 -0
  138. data/lib/hexapdf/layout/style.rb +1 -1
  139. data/lib/hexapdf/layout/text_box.rb +1 -1
  140. data/lib/hexapdf/layout/text_fragment.rb +1 -1
  141. data/lib/hexapdf/layout/text_layouter.rb +4 -7
  142. data/lib/hexapdf/layout/text_shaper.rb +1 -1
  143. data/lib/hexapdf/layout/width_from_polygon.rb +1 -1
  144. data/lib/hexapdf/layout.rb +2 -1
  145. data/lib/hexapdf/name_tree_node.rb +1 -1
  146. data/lib/hexapdf/number_tree_node.rb +1 -1
  147. data/lib/hexapdf/object.rb +1 -1
  148. data/lib/hexapdf/parser.rb +1 -1
  149. data/lib/hexapdf/pdf_array.rb +1 -1
  150. data/lib/hexapdf/rectangle.rb +1 -1
  151. data/lib/hexapdf/reference.rb +1 -1
  152. data/lib/hexapdf/revision.rb +1 -1
  153. data/lib/hexapdf/revisions.rb +1 -1
  154. data/lib/hexapdf/serializer.rb +1 -1
  155. data/lib/hexapdf/stream.rb +1 -1
  156. data/lib/hexapdf/task/dereference.rb +1 -1
  157. data/lib/hexapdf/task/optimize.rb +9 -7
  158. data/lib/hexapdf/task.rb +1 -1
  159. data/lib/hexapdf/test_utils.rb +1 -1
  160. data/lib/hexapdf/tokenizer.rb +2 -1
  161. data/lib/hexapdf/type/acro_form/appearance_generator.rb +1 -1
  162. data/lib/hexapdf/type/acro_form/button_field.rb +1 -1
  163. data/lib/hexapdf/type/acro_form/choice_field.rb +1 -1
  164. data/lib/hexapdf/type/acro_form/field.rb +1 -1
  165. data/lib/hexapdf/type/acro_form/form.rb +1 -1
  166. data/lib/hexapdf/type/acro_form/signature_field.rb +1 -1
  167. data/lib/hexapdf/type/acro_form/text_field.rb +1 -1
  168. data/lib/hexapdf/type/acro_form/variable_text_field.rb +1 -1
  169. data/lib/hexapdf/type/acro_form.rb +1 -1
  170. data/lib/hexapdf/type/action.rb +1 -1
  171. data/lib/hexapdf/type/actions/go_to.rb +1 -1
  172. data/lib/hexapdf/type/actions/go_to_r.rb +1 -1
  173. data/lib/hexapdf/type/actions/launch.rb +1 -1
  174. data/lib/hexapdf/type/actions/uri.rb +1 -1
  175. data/lib/hexapdf/type/actions.rb +1 -1
  176. data/lib/hexapdf/type/annotation.rb +1 -1
  177. data/lib/hexapdf/type/annotations/link.rb +1 -1
  178. data/lib/hexapdf/type/annotations/markup_annotation.rb +1 -1
  179. data/lib/hexapdf/type/annotations/text.rb +1 -1
  180. data/lib/hexapdf/type/annotations/widget.rb +1 -1
  181. data/lib/hexapdf/type/annotations.rb +1 -1
  182. data/lib/hexapdf/type/catalog.rb +1 -1
  183. data/lib/hexapdf/type/cid_font.rb +1 -1
  184. data/lib/hexapdf/type/embedded_file.rb +1 -1
  185. data/lib/hexapdf/type/file_specification.rb +1 -1
  186. data/lib/hexapdf/type/font.rb +1 -1
  187. data/lib/hexapdf/type/font_descriptor.rb +1 -1
  188. data/lib/hexapdf/type/font_simple.rb +1 -1
  189. data/lib/hexapdf/type/font_true_type.rb +1 -1
  190. data/lib/hexapdf/type/font_type0.rb +1 -1
  191. data/lib/hexapdf/type/font_type1.rb +1 -1
  192. data/lib/hexapdf/type/font_type3.rb +1 -1
  193. data/lib/hexapdf/type/form.rb +1 -1
  194. data/lib/hexapdf/type/graphics_state_parameter.rb +1 -1
  195. data/lib/hexapdf/type/icon_fit.rb +1 -1
  196. data/lib/hexapdf/type/image.rb +1 -1
  197. data/lib/hexapdf/type/info.rb +1 -1
  198. data/lib/hexapdf/type/mark_information.rb +1 -1
  199. data/lib/hexapdf/type/names.rb +1 -1
  200. data/lib/hexapdf/type/object_stream.rb +8 -3
  201. data/lib/hexapdf/type/outline.rb +2 -2
  202. data/lib/hexapdf/type/outline_item.rb +11 -2
  203. data/lib/hexapdf/type/page.rb +36 -9
  204. data/lib/hexapdf/type/page_label.rb +1 -1
  205. data/lib/hexapdf/type/page_tree_node.rb +1 -1
  206. data/lib/hexapdf/type/resources.rb +1 -1
  207. data/lib/hexapdf/type/trailer.rb +1 -1
  208. data/lib/hexapdf/type/viewer_preferences.rb +1 -1
  209. data/lib/hexapdf/type/xref_stream.rb +12 -5
  210. data/lib/hexapdf/type.rb +1 -1
  211. data/lib/hexapdf/utils/bit_field.rb +1 -1
  212. data/lib/hexapdf/utils/bit_stream.rb +1 -1
  213. data/lib/hexapdf/utils/graphics_helpers.rb +1 -1
  214. data/lib/hexapdf/utils/lru_cache.rb +1 -1
  215. data/lib/hexapdf/utils/math_helpers.rb +1 -1
  216. data/lib/hexapdf/utils/object_hash.rb +1 -1
  217. data/lib/hexapdf/utils/pdf_doc_encoding.rb +1 -1
  218. data/lib/hexapdf/utils/sorted_tree_node.rb +1 -1
  219. data/lib/hexapdf/version.rb +2 -2
  220. data/lib/hexapdf/writer.rb +2 -2
  221. data/lib/hexapdf/xref_section.rb +1 -1
  222. data/lib/hexapdf.rb +1 -1
  223. data/test/hexapdf/document/test_layout.rb +80 -17
  224. data/test/hexapdf/encryption/common.rb +4 -0
  225. data/test/hexapdf/encryption/test_aes.rb +8 -0
  226. data/test/hexapdf/encryption/test_security_handler.rb +6 -0
  227. data/test/hexapdf/filter/test_flate_decode.rb +19 -5
  228. data/test/hexapdf/layout/test_inline_box.rb +35 -15
  229. data/test/hexapdf/layout/test_page_style.rb +70 -0
  230. data/test/hexapdf/layout/test_text_box.rb +5 -2
  231. data/test/hexapdf/layout/test_text_layouter.rb +6 -11
  232. data/test/hexapdf/task/test_optimize.rb +11 -9
  233. data/test/hexapdf/test_composer.rb +49 -11
  234. data/test/hexapdf/test_tokenizer.rb +5 -0
  235. data/test/hexapdf/test_writer.rb +5 -5
  236. data/test/hexapdf/type/test_object_stream.rb +16 -7
  237. data/test/hexapdf/type/test_outline.rb +3 -1
  238. data/test/hexapdf/type/test_outline_item.rb +21 -1
  239. data/test/hexapdf/type/test_page.rb +58 -11
  240. data/test/hexapdf/type/test_xref_stream.rb +6 -1
  241. metadata +4 -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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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
@@ -35,6 +35,7 @@
35
35
  #++
36
36
 
37
37
  require 'hexapdf/layout/box'
38
+ require 'hexapdf/layout/frame'
38
39
 
39
40
  module HexaPDF
40
41
  module Layout
@@ -42,7 +43,13 @@ module HexaPDF
42
43
  # An InlineBox wraps a regular Box so that it can be used as an item for a Line. This enables
43
44
  # inline graphics.
44
45
  #
45
- # The wrapped box *must* have a fixed size!
46
+ # Complete box auto-sizing is not possible since the available space cannot be determined
47
+ # beforehand! This means the box *must* have at least its width set. The height may either also
48
+ # be set or determined during fitting.
49
+ #
50
+ # Fitting of the wrapped box is done immediately after creating a InlineBox instance. For this,
51
+ # a frame is used that has the width of the wrapped box and its height, or if not set, a
52
+ # practically infinite height. In the latter case the height *must* be set during fitting.
46
53
  class InlineBox
47
54
 
48
55
  # Creates an InlineBox that wraps a basic Box. All arguments (except +valign+) and the block
@@ -68,6 +75,12 @@ module HexaPDF
68
75
  def initialize(box, valign: :baseline)
69
76
  @box = box
70
77
  @valign = valign
78
+ @fit_result = Frame.new(0, 0, box.width, box.height == 0 ? 100_000 : box.height).fit(box)
79
+ if !@fit_result.success?
80
+ raise HexaPDF::Error, "Box for inline use could not be fit"
81
+ elsif box.height > 99_000
82
+ raise HexaPDF::Error, "Box for inline use has no valid height set after fitting"
83
+ end
71
84
  end
72
85
 
73
86
  # Returns +true+ if this inline box is just a placeholder without drawing operations.
@@ -88,7 +101,8 @@ module HexaPDF
88
101
  # Draws the wrapped box. If the box has margins specified, the x and y offsets are correctly
89
102
  # adjusted.
90
103
  def draw(canvas, x, y)
91
- box.draw(canvas, x + box.style.margin.left, y + box.style.margin.bottom)
104
+ canvas.translate(x - @fit_result.x + box.style.margin.left,
105
+ y - @fit_result.y + box.style.margin.bottom) { @fit_result.draw(canvas) }
92
106
  end
93
107
 
94
108
  # The minimum x-coordinate which is always 0.
@@ -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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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,144 @@
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-2023 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/error'
38
+ require 'hexapdf/layout/style'
39
+ require 'hexapdf/layout/frame'
40
+
41
+ module HexaPDF
42
+ module Layout
43
+
44
+ # A PageStyle defines the initial look of a page and the placement of one or more frames.
45
+ class PageStyle
46
+
47
+ # The page size.
48
+ #
49
+ # Can be any valid predefined page size (see HexaPDF::Type::Page::PAPER_SIZE) or an array
50
+ # [llx, lly, urx, ury] specifying a custom page size.
51
+ #
52
+ # Example:
53
+ #
54
+ # style.page_size = :A4
55
+ # style.page_size = [0, 0, 200, 200]
56
+ attr_accessor :page_size
57
+
58
+ # The page orientation, either +:portrait+ or +:landscape+.
59
+ #
60
+ # Only used if #page_size is one of the predefined page sizes and not an array.
61
+ attr_accessor :orientation
62
+
63
+ # A callable object that defines the initial content of a page created with #create_page.
64
+ #
65
+ # The callable object is given a canvas and the page style as arguments. It needs to draw the
66
+ # initial content of the page. Note that the graphics state of the canvas is *not* saved
67
+ # before executing the template code and restored afterwards. If this is needed, the object
68
+ # needs to do it itself.
69
+ #
70
+ # Furthermore it should set the #frame and #next_style attributes appropriately, if not done
71
+ # beforehand. The #create_frame method can be used for easily creating a rectangular frame.
72
+ #
73
+ # Example:
74
+ #
75
+ # page_style.template = lambda do |canvas, style
76
+ # box = canvas.context.box
77
+ # canvas.fill_color("fd0") do
78
+ # canvas.rectangle(0, 0, box.width, box.height).fill
79
+ # end
80
+ # style.frame = style.create_frame(canvas.context, 72)
81
+ # end
82
+ attr_accessor :template
83
+
84
+ # The HexaPDF::Layout::Frame object that defines the area on the page where content should be
85
+ # placed.
86
+ #
87
+ # This can either be set beforehand or during execution of the #template.
88
+ #
89
+ # If no frame has been set, a frame covering the page except for a default margin on all sides
90
+ # is set during #create_page.
91
+ attr_accessor :frame
92
+
93
+ # Defines the name of the page style that should be used for the next page.
94
+ #
95
+ # If this attribute is +nil+ (the default), it means that this style should be used again.
96
+ attr_accessor :next_style
97
+
98
+ # Creates a new page style instance for the given page size and orientation. If a block is
99
+ # given, it is used as template for defining the initial content.
100
+ #
101
+ # Example:
102
+ #
103
+ # PageStyle.new(page_size: :Letter) do |canvas, style|
104
+ # style.frame = style.create_frame(canvas.context, 72)
105
+ # style.next_style = :other
106
+ # canvas.fill_color("fd0") { canvas.circle(100, 100, 50).fill }
107
+ # end
108
+ def initialize(page_size: :A4, orientation: :portrait, &block)
109
+ @page_size = page_size
110
+ @orientation = orientation
111
+ @template = block
112
+ @frame = nil
113
+ @next_style = nil
114
+ end
115
+
116
+ # Creates a new page in the given document with this page style and returns it.
117
+ #
118
+ # If #frame has not been set beforehand or during execution of the #template, a default frame
119
+ # covering the whole page except a margin of 36 is created.
120
+ def create_page(document)
121
+ page = document.pages.create(media_box: page_size, orientation: orientation)
122
+ template&.call(page.canvas, self)
123
+ self.frame ||= create_frame(page, 36)
124
+ page
125
+ end
126
+
127
+ # Creates a frame based on the given page's box and margin.
128
+ #
129
+ # The +margin+ can be any value allowed by HexaPDF::Layout::Style::Quad#set.
130
+ #
131
+ # *Note*: This is a helper method for use inside the #template callable.
132
+ def create_frame(page, margin = 36)
133
+ box = page.box
134
+ margin = Layout::Style::Quad.new(margin)
135
+ Layout::Frame.new(box.left + margin.left,
136
+ box.bottom + margin.bottom,
137
+ box.width - margin.left - margin.right,
138
+ box.height - margin.bottom - margin.top)
139
+ end
140
+
141
+ end
142
+
143
+ end
144
+ 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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
@@ -253,17 +253,14 @@ module HexaPDF
253
253
  Glue.new(item.dup_attributes([glyph].freeze)))
254
254
  when "\n", "\v", "\f", "\u{85}", "\u{2029}"
255
255
  result << (penalties[item.attributes_hash] ||=
256
- Penalty.new(Penalty::PARAGRAPH_BREAK, 0,
257
- item: item.dup_attributes([].freeze)))
256
+ Penalty.new(Penalty::PARAGRAPH_BREAK, 0))
258
257
  when "\u{2028}"
259
- result << Penalty.new(Penalty::LINE_BREAK, 0,
260
- item: item.dup_attributes([].freeze))
258
+ result << Penalty.new(Penalty::LINE_BREAK, 0)
261
259
  when "\r"
262
260
  if !item.items[i + 1] || item.items[i + 1].kind_of?(Numeric) ||
263
261
  item.items[i + 1].str != "\n"
264
262
  result << (penalties[item.attributes_hash] ||=
265
- Penalty.new(Penalty::PARAGRAPH_BREAK, 0,
266
- item: item.dup_attributes([].freeze)))
263
+ Penalty.new(Penalty::PARAGRAPH_BREAK, 0))
267
264
  end
268
265
  when '-'
269
266
  result << Penalty::Standard
@@ -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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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
@@ -56,6 +56,7 @@ module HexaPDF
56
56
  autoload(:ImageBox, 'hexapdf/layout/image_box')
57
57
  autoload(:ColumnBox, 'hexapdf/layout/column_box')
58
58
  autoload(:ListBox, 'hexapdf/layout/list_box')
59
+ autoload(:PageStyle, 'hexapdf/layout/page_style')
59
60
 
60
61
  end
61
62
 
@@ -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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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-2022 Thomas Leitner
7
+ # Copyright (C) 2014-2023 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