hexapdf 0.9.0 → 0.9.1

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 (191) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/CONTRIBUTERS +2 -1
  4. data/LICENSE +1 -1
  5. data/Rakefile +0 -1
  6. data/VERSION +1 -1
  7. data/examples/019-column_box.rb +57 -0
  8. data/lib/hexapdf.rb +4 -1
  9. data/lib/hexapdf/cli.rb +4 -1
  10. data/lib/hexapdf/cli/batch.rb +4 -1
  11. data/lib/hexapdf/cli/command.rb +4 -1
  12. data/lib/hexapdf/cli/files.rb +4 -1
  13. data/lib/hexapdf/cli/images.rb +4 -1
  14. data/lib/hexapdf/cli/info.rb +4 -1
  15. data/lib/hexapdf/cli/inspect.rb +4 -1
  16. data/lib/hexapdf/cli/merge.rb +4 -1
  17. data/lib/hexapdf/cli/modify.rb +4 -1
  18. data/lib/hexapdf/cli/optimize.rb +4 -1
  19. data/lib/hexapdf/cli/split.rb +5 -2
  20. data/lib/hexapdf/composer.rb +4 -1
  21. data/lib/hexapdf/configuration.rb +4 -1
  22. data/lib/hexapdf/content.rb +4 -1
  23. data/lib/hexapdf/content/canvas.rb +4 -1
  24. data/lib/hexapdf/content/color_space.rb +4 -1
  25. data/lib/hexapdf/content/graphic_object.rb +4 -1
  26. data/lib/hexapdf/content/graphic_object/arc.rb +4 -1
  27. data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +4 -1
  28. data/lib/hexapdf/content/graphic_object/geom2d.rb +4 -1
  29. data/lib/hexapdf/content/graphic_object/solid_arc.rb +4 -1
  30. data/lib/hexapdf/content/graphics_state.rb +4 -1
  31. data/lib/hexapdf/content/operator.rb +4 -1
  32. data/lib/hexapdf/content/parser.rb +4 -1
  33. data/lib/hexapdf/content/processor.rb +4 -1
  34. data/lib/hexapdf/content/transformation_matrix.rb +4 -1
  35. data/lib/hexapdf/data_dir.rb +4 -1
  36. data/lib/hexapdf/dictionary.rb +4 -1
  37. data/lib/hexapdf/dictionary_fields.rb +4 -1
  38. data/lib/hexapdf/document.rb +4 -1
  39. data/lib/hexapdf/document/files.rb +4 -1
  40. data/lib/hexapdf/document/fonts.rb +4 -1
  41. data/lib/hexapdf/document/images.rb +4 -1
  42. data/lib/hexapdf/document/pages.rb +4 -1
  43. data/lib/hexapdf/encryption.rb +4 -1
  44. data/lib/hexapdf/encryption/aes.rb +4 -1
  45. data/lib/hexapdf/encryption/arc4.rb +4 -1
  46. data/lib/hexapdf/encryption/fast_aes.rb +4 -1
  47. data/lib/hexapdf/encryption/fast_arc4.rb +4 -1
  48. data/lib/hexapdf/encryption/identity.rb +4 -1
  49. data/lib/hexapdf/encryption/ruby_aes.rb +4 -1
  50. data/lib/hexapdf/encryption/ruby_arc4.rb +4 -1
  51. data/lib/hexapdf/encryption/security_handler.rb +4 -1
  52. data/lib/hexapdf/encryption/standard_security_handler.rb +4 -1
  53. data/lib/hexapdf/error.rb +4 -1
  54. data/lib/hexapdf/filter.rb +4 -1
  55. data/lib/hexapdf/filter/ascii85_decode.rb +4 -1
  56. data/lib/hexapdf/filter/ascii_hex_decode.rb +4 -1
  57. data/lib/hexapdf/filter/dct_decode.rb +4 -1
  58. data/lib/hexapdf/filter/encryption.rb +4 -1
  59. data/lib/hexapdf/filter/flate_decode.rb +4 -1
  60. data/lib/hexapdf/filter/jpx_decode.rb +4 -1
  61. data/lib/hexapdf/filter/lzw_decode.rb +4 -1
  62. data/lib/hexapdf/filter/predictor.rb +4 -1
  63. data/lib/hexapdf/filter/run_length_decode.rb +4 -1
  64. data/lib/hexapdf/font/cmap.rb +4 -1
  65. data/lib/hexapdf/font/cmap/parser.rb +4 -1
  66. data/lib/hexapdf/font/cmap/writer.rb +5 -2
  67. data/lib/hexapdf/font/encoding.rb +4 -1
  68. data/lib/hexapdf/font/encoding/base.rb +4 -1
  69. data/lib/hexapdf/font/encoding/difference_encoding.rb +4 -1
  70. data/lib/hexapdf/font/encoding/glyph_list.rb +4 -1
  71. data/lib/hexapdf/font/encoding/mac_expert_encoding.rb +4 -1
  72. data/lib/hexapdf/font/encoding/mac_roman_encoding.rb +4 -1
  73. data/lib/hexapdf/font/encoding/standard_encoding.rb +4 -1
  74. data/lib/hexapdf/font/encoding/symbol_encoding.rb +4 -1
  75. data/lib/hexapdf/font/encoding/win_ansi_encoding.rb +4 -1
  76. data/lib/hexapdf/font/encoding/zapf_dingbats_encoding.rb +4 -1
  77. data/lib/hexapdf/font/invalid_glyph.rb +4 -1
  78. data/lib/hexapdf/font/true_type.rb +4 -1
  79. data/lib/hexapdf/font/true_type/builder.rb +4 -1
  80. data/lib/hexapdf/font/true_type/font.rb +4 -1
  81. data/lib/hexapdf/font/true_type/optimizer.rb +4 -1
  82. data/lib/hexapdf/font/true_type/subsetter.rb +4 -1
  83. data/lib/hexapdf/font/true_type/table.rb +4 -1
  84. data/lib/hexapdf/font/true_type/table/cmap.rb +4 -1
  85. data/lib/hexapdf/font/true_type/table/cmap_subtable.rb +4 -1
  86. data/lib/hexapdf/font/true_type/table/directory.rb +4 -1
  87. data/lib/hexapdf/font/true_type/table/glyf.rb +4 -1
  88. data/lib/hexapdf/font/true_type/table/head.rb +4 -1
  89. data/lib/hexapdf/font/true_type/table/hhea.rb +4 -1
  90. data/lib/hexapdf/font/true_type/table/hmtx.rb +4 -1
  91. data/lib/hexapdf/font/true_type/table/kern.rb +4 -1
  92. data/lib/hexapdf/font/true_type/table/loca.rb +4 -1
  93. data/lib/hexapdf/font/true_type/table/maxp.rb +4 -1
  94. data/lib/hexapdf/font/true_type/table/name.rb +4 -1
  95. data/lib/hexapdf/font/true_type/table/os2.rb +4 -1
  96. data/lib/hexapdf/font/true_type/table/post.rb +4 -1
  97. data/lib/hexapdf/font/true_type_wrapper.rb +4 -1
  98. data/lib/hexapdf/font/type1.rb +4 -1
  99. data/lib/hexapdf/font/type1/afm_parser.rb +4 -1
  100. data/lib/hexapdf/font/type1/character_metrics.rb +4 -1
  101. data/lib/hexapdf/font/type1/font.rb +4 -1
  102. data/lib/hexapdf/font/type1/font_metrics.rb +4 -1
  103. data/lib/hexapdf/font/type1/pfb_parser.rb +4 -1
  104. data/lib/hexapdf/font/type1_wrapper.rb +4 -1
  105. data/lib/hexapdf/font_loader.rb +4 -1
  106. data/lib/hexapdf/font_loader/from_configuration.rb +4 -1
  107. data/lib/hexapdf/font_loader/from_file.rb +4 -1
  108. data/lib/hexapdf/font_loader/standard14.rb +4 -1
  109. data/lib/hexapdf/image_loader.rb +4 -1
  110. data/lib/hexapdf/image_loader/jpeg.rb +4 -1
  111. data/lib/hexapdf/image_loader/pdf.rb +4 -1
  112. data/lib/hexapdf/image_loader/png.rb +4 -1
  113. data/lib/hexapdf/importer.rb +4 -1
  114. data/lib/hexapdf/layout.rb +4 -1
  115. data/lib/hexapdf/layout/box.rb +4 -1
  116. data/lib/hexapdf/layout/column_box.rb +161 -0
  117. data/lib/hexapdf/layout/frame.rb +4 -1
  118. data/lib/hexapdf/layout/image_box.rb +4 -1
  119. data/lib/hexapdf/layout/inline_box.rb +4 -1
  120. data/lib/hexapdf/layout/line.rb +4 -1
  121. data/lib/hexapdf/layout/numeric_refinements.rb +4 -1
  122. data/lib/hexapdf/layout/style.rb +4 -1
  123. data/lib/hexapdf/layout/text_box.rb +4 -1
  124. data/lib/hexapdf/layout/text_fragment.rb +4 -1
  125. data/lib/hexapdf/layout/text_layouter.rb +4 -1
  126. data/lib/hexapdf/layout/text_shaper.rb +4 -1
  127. data/lib/hexapdf/layout/width_from_polygon.rb +4 -1
  128. data/lib/hexapdf/name_tree_node.rb +4 -1
  129. data/lib/hexapdf/number_tree_node.rb +4 -1
  130. data/lib/hexapdf/object.rb +4 -1
  131. data/lib/hexapdf/parser.rb +4 -1
  132. data/lib/hexapdf/rectangle.rb +4 -1
  133. data/lib/hexapdf/reference.rb +4 -1
  134. data/lib/hexapdf/revision.rb +4 -1
  135. data/lib/hexapdf/revisions.rb +4 -1
  136. data/lib/hexapdf/serializer.rb +9 -2
  137. data/lib/hexapdf/stream.rb +4 -1
  138. data/lib/hexapdf/task.rb +4 -1
  139. data/lib/hexapdf/task/dereference.rb +4 -1
  140. data/lib/hexapdf/task/optimize.rb +4 -1
  141. data/lib/hexapdf/tokenizer.rb +4 -1
  142. data/lib/hexapdf/type.rb +4 -1
  143. data/lib/hexapdf/type/action.rb +4 -1
  144. data/lib/hexapdf/type/actions.rb +4 -1
  145. data/lib/hexapdf/type/actions/go_to.rb +4 -1
  146. data/lib/hexapdf/type/actions/go_to_r.rb +4 -1
  147. data/lib/hexapdf/type/actions/launch.rb +4 -1
  148. data/lib/hexapdf/type/actions/uri.rb +4 -1
  149. data/lib/hexapdf/type/annotation.rb +4 -1
  150. data/lib/hexapdf/type/annotations.rb +4 -1
  151. data/lib/hexapdf/type/annotations/link.rb +4 -1
  152. data/lib/hexapdf/type/annotations/markup_annotation.rb +4 -1
  153. data/lib/hexapdf/type/annotations/text.rb +4 -1
  154. data/lib/hexapdf/type/catalog.rb +4 -1
  155. data/lib/hexapdf/type/cid_font.rb +4 -1
  156. data/lib/hexapdf/type/embedded_file.rb +4 -1
  157. data/lib/hexapdf/type/file_specification.rb +4 -1
  158. data/lib/hexapdf/type/font.rb +4 -1
  159. data/lib/hexapdf/type/font_descriptor.rb +4 -1
  160. data/lib/hexapdf/type/font_simple.rb +4 -1
  161. data/lib/hexapdf/type/font_true_type.rb +4 -1
  162. data/lib/hexapdf/type/font_type0.rb +4 -1
  163. data/lib/hexapdf/type/font_type1.rb +4 -1
  164. data/lib/hexapdf/type/font_type3.rb +4 -1
  165. data/lib/hexapdf/type/form.rb +4 -1
  166. data/lib/hexapdf/type/graphics_state_parameter.rb +4 -1
  167. data/lib/hexapdf/type/image.rb +4 -1
  168. data/lib/hexapdf/type/info.rb +4 -1
  169. data/lib/hexapdf/type/names.rb +4 -1
  170. data/lib/hexapdf/type/object_stream.rb +4 -1
  171. data/lib/hexapdf/type/page.rb +4 -1
  172. data/lib/hexapdf/type/page_tree_node.rb +4 -1
  173. data/lib/hexapdf/type/resources.rb +4 -1
  174. data/lib/hexapdf/type/trailer.rb +4 -1
  175. data/lib/hexapdf/type/viewer_preferences.rb +4 -1
  176. data/lib/hexapdf/type/xref_stream.rb +4 -1
  177. data/lib/hexapdf/utils/bit_field.rb +4 -1
  178. data/lib/hexapdf/utils/bit_stream.rb +4 -1
  179. data/lib/hexapdf/utils/graphics_helpers.rb +4 -1
  180. data/lib/hexapdf/utils/lru_cache.rb +4 -1
  181. data/lib/hexapdf/utils/math_helpers.rb +4 -1
  182. data/lib/hexapdf/utils/object_hash.rb +4 -1
  183. data/lib/hexapdf/utils/pdf_doc_encoding.rb +4 -1
  184. data/lib/hexapdf/utils/sorted_tree_node.rb +4 -1
  185. data/lib/hexapdf/version.rb +5 -2
  186. data/lib/hexapdf/writer.rb +4 -1
  187. data/lib/hexapdf/xref_section.rb +4 -1
  188. data/test/hexapdf/font/cmap/test_writer.rb +9 -1
  189. data/test/hexapdf/test_serializer.rb +6 -0
  190. data/test/hexapdf/test_writer.rb +2 -2
  191. 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-2018 Thomas Leitner
7
+ # Copyright (C) 2014-2019 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
@@ -29,6 +29,9 @@
29
29
  # In accordance with Section 7(b) of the GNU Affero General Public
30
30
  # License, a covered work must retain the producer line in every PDF that
31
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/>.
32
35
  #++
33
36
 
34
37
  require 'hexapdf/font/true_type/table'
@@ -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-2018 Thomas Leitner
7
+ # Copyright (C) 2014-2019 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
@@ -29,6 +29,9 @@
29
29
  # In accordance with Section 7(b) of the GNU Affero General Public
30
30
  # License, a covered work must retain the producer line in every PDF that
31
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/>.
32
35
  #++
33
36
 
34
37
  require 'hexapdf/font/true_type'
@@ -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-2018 Thomas Leitner
7
+ # Copyright (C) 2014-2019 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
@@ -29,6 +29,9 @@
29
29
  # In accordance with Section 7(b) of the GNU Affero General Public
30
30
  # License, a covered work must retain the producer line in every PDF that
31
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/>.
32
35
  #++
33
36
 
34
37
  module HexaPDF
@@ -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-2018 Thomas Leitner
7
+ # Copyright (C) 2014-2019 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
@@ -29,6 +29,9 @@
29
29
  # In accordance with Section 7(b) of the GNU Affero General Public
30
30
  # License, a covered work must retain the producer line in every PDF that
31
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/>.
32
35
  #++
33
36
 
34
37
  require 'hexapdf/font/type1/font_metrics'
@@ -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-2018 Thomas Leitner
7
+ # Copyright (C) 2014-2019 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
@@ -29,6 +29,9 @@
29
29
  # In accordance with Section 7(b) of the GNU Affero General Public
30
30
  # License, a covered work must retain the producer line in every PDF that
31
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/>.
32
35
  #++
33
36
 
34
37
  module HexaPDF
@@ -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-2018 Thomas Leitner
7
+ # Copyright (C) 2014-2019 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
@@ -29,6 +29,9 @@
29
29
  # In accordance with Section 7(b) of the GNU Affero General Public
30
30
  # License, a covered work must retain the producer line in every PDF that
31
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/>.
32
35
  #++
33
36
 
34
37
  require 'forwardable'
@@ -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-2018 Thomas Leitner
7
+ # Copyright (C) 2014-2019 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
@@ -29,6 +29,9 @@
29
29
  # In accordance with Section 7(b) of the GNU Affero General Public
30
30
  # License, a covered work must retain the producer line in every PDF that
31
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/>.
32
35
  #++
33
36
 
34
37
  require 'hexapdf/font/type1/character_metrics'
@@ -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-2018 Thomas Leitner
7
+ # Copyright (C) 2014-2019 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
@@ -29,6 +29,9 @@
29
29
  # In accordance with Section 7(b) of the GNU Affero General Public
30
30
  # License, a covered work must retain the producer line in every PDF that
31
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/>.
32
35
  #++
33
36
 
34
37
  require 'hexapdf/font/encoding'
@@ -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-2018 Thomas Leitner
7
+ # Copyright (C) 2014-2019 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
@@ -29,6 +29,9 @@
29
29
  # In accordance with Section 7(b) of the GNU Affero General Public
30
30
  # License, a covered work must retain the producer line in every PDF that
31
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/>.
32
35
  #++
33
36
 
34
37
  require 'hexapdf/font/type1'
@@ -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-2018 Thomas Leitner
7
+ # Copyright (C) 2014-2019 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
@@ -29,6 +29,9 @@
29
29
  # In accordance with Section 7(b) of the GNU Affero General Public
30
30
  # License, a covered work must retain the producer line in every PDF that
31
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/>.
32
35
  #++
33
36
 
34
37
  module HexaPDF
@@ -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-2018 Thomas Leitner
7
+ # Copyright (C) 2014-2019 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
@@ -29,6 +29,9 @@
29
29
  # In accordance with Section 7(b) of the GNU Affero General Public
30
30
  # License, a covered work must retain the producer line in every PDF that
31
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/>.
32
35
  #++
33
36
 
34
37
  require 'hexapdf/font/true_type_wrapper'
@@ -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-2018 Thomas Leitner
7
+ # Copyright (C) 2014-2019 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
@@ -29,6 +29,9 @@
29
29
  # In accordance with Section 7(b) of the GNU Affero General Public
30
30
  # License, a covered work must retain the producer line in every PDF that
31
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/>.
32
35
  #++
33
36
 
34
37
  require 'hexapdf/font/true_type_wrapper'
@@ -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-2018 Thomas Leitner
7
+ # Copyright (C) 2014-2019 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
@@ -29,6 +29,9 @@
29
29
  # In accordance with Section 7(b) of the GNU Affero General Public
30
30
  # License, a covered work must retain the producer line in every PDF that
31
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/>.
32
35
  #++
33
36
 
34
37
  require 'hexapdf/data_dir'
@@ -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-2018 Thomas Leitner
7
+ # Copyright (C) 2014-2019 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
@@ -29,6 +29,9 @@
29
29
  # In accordance with Section 7(b) of the GNU Affero General Public
30
30
  # License, a covered work must retain the producer line in every PDF that
31
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/>.
32
35
  #++
33
36
 
34
37
  module HexaPDF
@@ -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-2018 Thomas Leitner
7
+ # Copyright (C) 2014-2019 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
@@ -29,6 +29,9 @@
29
29
  # In accordance with Section 7(b) of the GNU Affero General Public
30
30
  # License, a covered work must retain the producer line in every PDF that
31
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/>.
32
35
  #++
33
36
 
34
37
  require 'hexapdf/error'
@@ -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-2018 Thomas Leitner
7
+ # Copyright (C) 2014-2019 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
@@ -29,6 +29,9 @@
29
29
  # In accordance with Section 7(b) of the GNU Affero General Public
30
30
  # License, a covered work must retain the producer line in every PDF that
31
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/>.
32
35
  #++
33
36
 
34
37
  require 'hexapdf/error'
@@ -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-2018 Thomas Leitner
7
+ # Copyright (C) 2014-2019 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
@@ -29,6 +29,9 @@
29
29
  # In accordance with Section 7(b) of the GNU Affero General Public
30
30
  # License, a covered work must retain the producer line in every PDF that
31
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/>.
32
35
  #++
33
36
 
34
37
  require 'hexapdf/error'
@@ -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-2018 Thomas Leitner
7
+ # Copyright (C) 2014-2019 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
@@ -29,6 +29,9 @@
29
29
  # In accordance with Section 7(b) of the GNU Affero General Public
30
30
  # License, a covered work must retain the producer line in every PDF that
31
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/>.
32
35
  #++
33
36
 
34
37
  require 'hexapdf/error'
@@ -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-2018 Thomas Leitner
7
+ # Copyright (C) 2014-2019 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
@@ -29,6 +29,9 @@
29
29
  # In accordance with Section 7(b) of the GNU Affero General Public
30
30
  # License, a covered work must retain the producer line in every PDF that
31
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/>.
32
35
  #++
33
36
 
34
37
  module HexaPDF
@@ -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-2018 Thomas Leitner
7
+ # Copyright (C) 2014-2019 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
@@ -29,6 +29,9 @@
29
29
  # In accordance with Section 7(b) of the GNU Affero General Public
30
30
  # License, a covered work must retain the producer line in every PDF that
31
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/>.
32
35
  #++
33
36
  require 'hexapdf/layout/style'
34
37
 
@@ -0,0 +1,161 @@
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-2019 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
+ require 'hexapdf/layout/box'
37
+
38
+ module HexaPDF
39
+ module Layout
40
+
41
+ # A ColumnBox arranges boxes in one or more columns.
42
+ #
43
+ # The number of columns as well as the size of the gap between the columns can be modified.
44
+ class ColumnBox < Box
45
+
46
+ # The child boxes of this ColumnBox.
47
+ attr_reader :children
48
+
49
+ # The number of columns.
50
+ # TODO: allow array with column widths later like [100, :*, :*]; same for gaps
51
+ attr_reader :columns
52
+
53
+ # The size of the gap between the columns.
54
+ attr_reader :gap
55
+
56
+ # Creates a new ColumnBox object for the given +children+ boxes.
57
+ def initialize(children = [], columns = 2, gap: 36, **kwargs)
58
+ super(kwargs, &:unused_draw_block)
59
+ @children = children
60
+ @columns = columns
61
+ @gap = gap
62
+ end
63
+
64
+ # Fits the column box into the available space.
65
+ def fit(available_width, available_height, frame)
66
+ last_height_difference = 1_000_000
67
+ height = if style.position == :flow
68
+ frame.height
69
+ else
70
+ (@initial_height > 0 ? @initial_height : available_height) - reserved_height
71
+ end
72
+ while true
73
+ @frames = []
74
+ if style.position == :flow
75
+ column_width = (frame.width - gap * (@columns - 1)).to_f / @columns
76
+ @columns.times do |col_nr|
77
+ left = (column_width + gap) * col_nr + frame.left
78
+ bottom = frame.bottom
79
+ rect = Geom2D::Polygon([left, bottom],
80
+ [left + column_width, bottom],
81
+ [left + column_width, bottom + height],
82
+ [left, bottom + height])
83
+ shape = Geom2D::Algorithms::PolygonOperation.run(frame.shape, rect, :intersection)
84
+ col_frame = Frame.new(left, bottom, column_width, height)
85
+ col_frame.shape = shape
86
+ @frames << col_frame
87
+ end
88
+ @frame_index = 0
89
+ @results = @children.map {|child_box| fit_box(child_box) }
90
+ @width = frame.width
91
+ @height = frame.height - @frames.min_by(&:y).y
92
+ else
93
+ width = (@initial_width > 0 ? @initial_width : available_width) - reserved_width
94
+ column_width = (width - gap * (@columns - 1)).to_f / @columns
95
+ @columns.times do |col_nr|
96
+ @frames << Frame.new((column_width + gap) * col_nr, 0, column_width, height)
97
+ end
98
+ @frame_index = 0
99
+ @results = @children.map {|child_box| fit_box(child_box) }
100
+ @width = width
101
+ @height = height - @frames.min_by(&:y).y
102
+ end
103
+ min_y, max_y = @frames.minmax_by(&:y).map(&:y)
104
+ p [height, @frames.map(&:y), last_height_difference, min_y, max_y]
105
+ # TOOD: @result.any?(&:empty?) only for the first run!!!! if the first run fails, we
106
+ # cannot balance the columns because there is too much content.
107
+ # TODO: another break condition is if the @results didn't change since the last run
108
+ break if max_y != height && (@results.any?(&:empty?) ||
109
+ max_y - min_y >= last_height_difference ||
110
+ max_y - min_y < 0.5)
111
+ last_height_difference = max_y - min_y
112
+ height -= last_height_difference / 2.0
113
+ p [height]
114
+ end
115
+ @results.all? {|res| res.length == 1 }
116
+ end
117
+
118
+ private
119
+
120
+ def fit_box(box)
121
+ cur_frame = @frames[@frame_index]
122
+ fitted_boxes = []
123
+ while true && cur_frame
124
+ result = cur_frame.fit(box)
125
+ if result.success?
126
+ cur_frame.remove_area(result.mask)
127
+ fitted_boxes << result
128
+ break
129
+ elsif cur_frame.full?
130
+ @frame_index += 1
131
+ break if @frame_index == @frames.length
132
+ cur_frame = @frames[@frame_index]
133
+ else
134
+ draw_box, box = cur_frame.split(result)
135
+ if draw_box
136
+ cur_frame.remove_area(result.mask)
137
+ fitted_boxes << result
138
+ elsif !cur_frame.find_next_region
139
+ @frame_index += 1
140
+ break if @frame_index == @frames.length
141
+ cur_frame = @frames[@frame_index]
142
+ end
143
+ end
144
+ end
145
+ fitted_boxes
146
+ end
147
+
148
+ # Draws the child boxes onto the canvas at position [x, y].
149
+ def draw_content(canvas, x, y)
150
+ x = y = 0 if style.position == :flow
151
+ @results.each do |result_boxes|
152
+ result_boxes.each do |result|
153
+ result.box.draw(canvas, x + result.x, y + result.y)
154
+ end
155
+ end
156
+ end
157
+
158
+ end
159
+
160
+ end
161
+ end