hexapdf 0.17.1 → 0.17.2

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 (255) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1024 -0
  3. data/LICENSE +29 -0
  4. data/README.md +129 -0
  5. data/Rakefile +109 -0
  6. data/agpl-3.0.txt +661 -0
  7. data/examples/001-hello_world.rb +16 -0
  8. data/examples/002-graphics.rb +275 -0
  9. data/examples/003-arcs.rb +50 -0
  10. data/examples/004-optimizing.rb +23 -0
  11. data/examples/005-merging.rb +27 -0
  12. data/examples/006-standard_pdf_fonts.rb +73 -0
  13. data/examples/007-truetype.rb +42 -0
  14. data/examples/008-show_char_bboxes.rb +55 -0
  15. data/examples/009-text_layouter_alignment.rb +47 -0
  16. data/examples/010-text_layouter_inline_boxes.rb +64 -0
  17. data/examples/011-text_layouter_line_wrapping.rb +57 -0
  18. data/examples/012-text_layouter_styling.rb +122 -0
  19. data/examples/013-text_layouter_shapes.rb +176 -0
  20. data/examples/014-text_in_polygon.rb +60 -0
  21. data/examples/015-boxes.rb +76 -0
  22. data/examples/016-frame_automatic_box_placement.rb +90 -0
  23. data/examples/017-frame_text_flow.rb +60 -0
  24. data/examples/018-composer.rb +44 -0
  25. data/examples/019-acro_form.rb +88 -0
  26. data/examples/emoji-smile.png +0 -0
  27. data/examples/emoji-wink.png +0 -0
  28. data/examples/machupicchu.jpg +0 -0
  29. data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +66 -0
  30. data/lib/hexapdf/content/graphic_object/geom2d.rb +13 -0
  31. data/lib/hexapdf/version.rb +1 -1
  32. data/test/data/aes-test-vectors/CBCGFSbox-128-decrypt.data.gz +0 -0
  33. data/test/data/aes-test-vectors/CBCGFSbox-128-encrypt.data.gz +0 -0
  34. data/test/data/aes-test-vectors/CBCGFSbox-192-decrypt.data.gz +0 -0
  35. data/test/data/aes-test-vectors/CBCGFSbox-192-encrypt.data.gz +0 -0
  36. data/test/data/aes-test-vectors/CBCGFSbox-256-decrypt.data.gz +0 -0
  37. data/test/data/aes-test-vectors/CBCGFSbox-256-encrypt.data.gz +0 -0
  38. data/test/data/aes-test-vectors/CBCKeySbox-128-decrypt.data.gz +0 -0
  39. data/test/data/aes-test-vectors/CBCKeySbox-128-encrypt.data.gz +0 -0
  40. data/test/data/aes-test-vectors/CBCKeySbox-192-decrypt.data.gz +0 -0
  41. data/test/data/aes-test-vectors/CBCKeySbox-192-encrypt.data.gz +0 -0
  42. data/test/data/aes-test-vectors/CBCKeySbox-256-decrypt.data.gz +0 -0
  43. data/test/data/aes-test-vectors/CBCKeySbox-256-encrypt.data.gz +0 -0
  44. data/test/data/aes-test-vectors/CBCVarKey-128-decrypt.data.gz +0 -0
  45. data/test/data/aes-test-vectors/CBCVarKey-128-encrypt.data.gz +0 -0
  46. data/test/data/aes-test-vectors/CBCVarKey-192-decrypt.data.gz +0 -0
  47. data/test/data/aes-test-vectors/CBCVarKey-192-encrypt.data.gz +0 -0
  48. data/test/data/aes-test-vectors/CBCVarKey-256-decrypt.data.gz +0 -0
  49. data/test/data/aes-test-vectors/CBCVarKey-256-encrypt.data.gz +0 -0
  50. data/test/data/aes-test-vectors/CBCVarTxt-128-decrypt.data.gz +0 -0
  51. data/test/data/aes-test-vectors/CBCVarTxt-128-encrypt.data.gz +0 -0
  52. data/test/data/aes-test-vectors/CBCVarTxt-192-decrypt.data.gz +0 -0
  53. data/test/data/aes-test-vectors/CBCVarTxt-192-encrypt.data.gz +0 -0
  54. data/test/data/aes-test-vectors/CBCVarTxt-256-decrypt.data.gz +0 -0
  55. data/test/data/aes-test-vectors/CBCVarTxt-256-encrypt.data.gz +0 -0
  56. data/test/data/fonts/Ubuntu-Title.ttf +0 -0
  57. data/test/data/images/cmyk.jpg +0 -0
  58. data/test/data/images/fillbytes.jpg +0 -0
  59. data/test/data/images/gray.jpg +0 -0
  60. data/test/data/images/greyscale-1bit.png +0 -0
  61. data/test/data/images/greyscale-2bit.png +0 -0
  62. data/test/data/images/greyscale-4bit.png +0 -0
  63. data/test/data/images/greyscale-8bit.png +0 -0
  64. data/test/data/images/greyscale-alpha-8bit.png +0 -0
  65. data/test/data/images/greyscale-trns-8bit.png +0 -0
  66. data/test/data/images/greyscale-with-gamma1.0.png +0 -0
  67. data/test/data/images/greyscale-with-gamma1.5.png +0 -0
  68. data/test/data/images/indexed-1bit.png +0 -0
  69. data/test/data/images/indexed-2bit.png +0 -0
  70. data/test/data/images/indexed-4bit.png +0 -0
  71. data/test/data/images/indexed-8bit.png +0 -0
  72. data/test/data/images/indexed-alpha-4bit.png +0 -0
  73. data/test/data/images/indexed-alpha-8bit.png +0 -0
  74. data/test/data/images/rgb.jpg +0 -0
  75. data/test/data/images/truecolour-8bit.png +0 -0
  76. data/test/data/images/truecolour-alpha-8bit.png +0 -0
  77. data/test/data/images/truecolour-gama-chrm-8bit.png +0 -0
  78. data/test/data/images/truecolour-srgb-8bit.png +0 -0
  79. data/test/data/images/ycck.jpg +0 -0
  80. data/test/data/minimal.pdf +44 -0
  81. data/test/data/standard-security-handler/README +9 -0
  82. data/test/data/standard-security-handler/bothpwd-aes-128bit-V4.pdf +44 -0
  83. data/test/data/standard-security-handler/bothpwd-aes-256bit-V5.pdf +0 -0
  84. data/test/data/standard-security-handler/bothpwd-arc4-128bit-V2.pdf +43 -0
  85. data/test/data/standard-security-handler/bothpwd-arc4-128bit-V4.pdf +43 -0
  86. data/test/data/standard-security-handler/bothpwd-arc4-40bit-V1.pdf +0 -0
  87. data/test/data/standard-security-handler/nopwd-aes-128bit-V4.pdf +43 -0
  88. data/test/data/standard-security-handler/nopwd-aes-256bit-V5.pdf +0 -0
  89. data/test/data/standard-security-handler/nopwd-arc4-128bit-V2.pdf +43 -0
  90. data/test/data/standard-security-handler/nopwd-arc4-128bit-V4.pdf +43 -0
  91. data/test/data/standard-security-handler/nopwd-arc4-40bit-V1.pdf +43 -0
  92. data/test/data/standard-security-handler/ownerpwd-aes-128bit-V4.pdf +0 -0
  93. data/test/data/standard-security-handler/ownerpwd-aes-256bit-V5.pdf +43 -0
  94. data/test/data/standard-security-handler/ownerpwd-arc4-128bit-V2.pdf +43 -0
  95. data/test/data/standard-security-handler/ownerpwd-arc4-128bit-V4.pdf +43 -0
  96. data/test/data/standard-security-handler/ownerpwd-arc4-40bit-V1.pdf +43 -0
  97. data/test/data/standard-security-handler/userpwd-aes-128bit-V4.pdf +43 -0
  98. data/test/data/standard-security-handler/userpwd-aes-256bit-V5.pdf +43 -0
  99. data/test/data/standard-security-handler/userpwd-arc4-128bit-V2.pdf +0 -0
  100. data/test/data/standard-security-handler/userpwd-arc4-128bit-V4.pdf +0 -0
  101. data/test/data/standard-security-handler/userpwd-arc4-40bit-V1.pdf +43 -0
  102. data/test/hexapdf/common_tokenizer_tests.rb +236 -0
  103. data/test/hexapdf/content/common.rb +39 -0
  104. data/test/hexapdf/content/graphic_object/test_arc.rb +102 -0
  105. data/test/hexapdf/content/graphic_object/test_endpoint_arc.rb +90 -0
  106. data/test/hexapdf/content/graphic_object/test_geom2d.rb +79 -0
  107. data/test/hexapdf/content/graphic_object/test_solid_arc.rb +86 -0
  108. data/test/hexapdf/content/test_canvas.rb +1279 -0
  109. data/test/hexapdf/content/test_color_space.rb +176 -0
  110. data/test/hexapdf/content/test_graphics_state.rb +151 -0
  111. data/test/hexapdf/content/test_operator.rb +619 -0
  112. data/test/hexapdf/content/test_parser.rb +99 -0
  113. data/test/hexapdf/content/test_processor.rb +163 -0
  114. data/test/hexapdf/content/test_transformation_matrix.rb +64 -0
  115. data/test/hexapdf/document/test_files.rb +72 -0
  116. data/test/hexapdf/document/test_fonts.rb +60 -0
  117. data/test/hexapdf/document/test_images.rb +72 -0
  118. data/test/hexapdf/document/test_pages.rb +130 -0
  119. data/test/hexapdf/encryption/common.rb +87 -0
  120. data/test/hexapdf/encryption/test_aes.rb +129 -0
  121. data/test/hexapdf/encryption/test_arc4.rb +39 -0
  122. data/test/hexapdf/encryption/test_fast_aes.rb +17 -0
  123. data/test/hexapdf/encryption/test_fast_arc4.rb +12 -0
  124. data/test/hexapdf/encryption/test_identity.rb +21 -0
  125. data/test/hexapdf/encryption/test_ruby_aes.rb +23 -0
  126. data/test/hexapdf/encryption/test_ruby_arc4.rb +20 -0
  127. data/test/hexapdf/encryption/test_security_handler.rb +380 -0
  128. data/test/hexapdf/encryption/test_standard_security_handler.rb +322 -0
  129. data/test/hexapdf/filter/common.rb +53 -0
  130. data/test/hexapdf/filter/test_ascii85_decode.rb +59 -0
  131. data/test/hexapdf/filter/test_ascii_hex_decode.rb +38 -0
  132. data/test/hexapdf/filter/test_crypt.rb +21 -0
  133. data/test/hexapdf/filter/test_encryption.rb +24 -0
  134. data/test/hexapdf/filter/test_flate_decode.rb +44 -0
  135. data/test/hexapdf/filter/test_lzw_decode.rb +52 -0
  136. data/test/hexapdf/filter/test_predictor.rb +219 -0
  137. data/test/hexapdf/filter/test_run_length_decode.rb +32 -0
  138. data/test/hexapdf/font/cmap/test_parser.rb +102 -0
  139. data/test/hexapdf/font/cmap/test_writer.rb +66 -0
  140. data/test/hexapdf/font/encoding/test_base.rb +45 -0
  141. data/test/hexapdf/font/encoding/test_difference_encoding.rb +29 -0
  142. data/test/hexapdf/font/encoding/test_glyph_list.rb +59 -0
  143. data/test/hexapdf/font/encoding/test_zapf_dingbats_encoding.rb +16 -0
  144. data/test/hexapdf/font/test_cmap.rb +104 -0
  145. data/test/hexapdf/font/test_encoding.rb +27 -0
  146. data/test/hexapdf/font/test_invalid_glyph.rb +34 -0
  147. data/test/hexapdf/font/test_true_type_wrapper.rb +186 -0
  148. data/test/hexapdf/font/test_type1_wrapper.rb +107 -0
  149. data/test/hexapdf/font/true_type/common.rb +17 -0
  150. data/test/hexapdf/font/true_type/table/common.rb +27 -0
  151. data/test/hexapdf/font/true_type/table/test_cmap.rb +47 -0
  152. data/test/hexapdf/font/true_type/table/test_cmap_subtable.rb +141 -0
  153. data/test/hexapdf/font/true_type/table/test_directory.rb +30 -0
  154. data/test/hexapdf/font/true_type/table/test_glyf.rb +58 -0
  155. data/test/hexapdf/font/true_type/table/test_head.rb +56 -0
  156. data/test/hexapdf/font/true_type/table/test_hhea.rb +26 -0
  157. data/test/hexapdf/font/true_type/table/test_hmtx.rb +30 -0
  158. data/test/hexapdf/font/true_type/table/test_kern.rb +61 -0
  159. data/test/hexapdf/font/true_type/table/test_loca.rb +33 -0
  160. data/test/hexapdf/font/true_type/table/test_maxp.rb +50 -0
  161. data/test/hexapdf/font/true_type/table/test_name.rb +76 -0
  162. data/test/hexapdf/font/true_type/table/test_os2.rb +55 -0
  163. data/test/hexapdf/font/true_type/table/test_post.rb +78 -0
  164. data/test/hexapdf/font/true_type/test_builder.rb +42 -0
  165. data/test/hexapdf/font/true_type/test_font.rb +116 -0
  166. data/test/hexapdf/font/true_type/test_optimizer.rb +26 -0
  167. data/test/hexapdf/font/true_type/test_subsetter.rb +73 -0
  168. data/test/hexapdf/font/true_type/test_table.rb +48 -0
  169. data/test/hexapdf/font/type1/common.rb +6 -0
  170. data/test/hexapdf/font/type1/test_afm_parser.rb +65 -0
  171. data/test/hexapdf/font/type1/test_font.rb +104 -0
  172. data/test/hexapdf/font/type1/test_font_metrics.rb +22 -0
  173. data/test/hexapdf/font/type1/test_pfb_parser.rb +37 -0
  174. data/test/hexapdf/font_loader/test_from_configuration.rb +43 -0
  175. data/test/hexapdf/font_loader/test_from_file.rb +36 -0
  176. data/test/hexapdf/font_loader/test_standard14.rb +33 -0
  177. data/test/hexapdf/image_loader/test_jpeg.rb +93 -0
  178. data/test/hexapdf/image_loader/test_pdf.rb +47 -0
  179. data/test/hexapdf/image_loader/test_png.rb +259 -0
  180. data/test/hexapdf/layout/test_box.rb +154 -0
  181. data/test/hexapdf/layout/test_frame.rb +350 -0
  182. data/test/hexapdf/layout/test_image_box.rb +73 -0
  183. data/test/hexapdf/layout/test_inline_box.rb +71 -0
  184. data/test/hexapdf/layout/test_line.rb +206 -0
  185. data/test/hexapdf/layout/test_style.rb +790 -0
  186. data/test/hexapdf/layout/test_text_box.rb +140 -0
  187. data/test/hexapdf/layout/test_text_fragment.rb +375 -0
  188. data/test/hexapdf/layout/test_text_layouter.rb +758 -0
  189. data/test/hexapdf/layout/test_text_shaper.rb +62 -0
  190. data/test/hexapdf/layout/test_width_from_polygon.rb +109 -0
  191. data/test/hexapdf/task/test_dereference.rb +51 -0
  192. data/test/hexapdf/task/test_optimize.rb +162 -0
  193. data/test/hexapdf/test_composer.rb +258 -0
  194. data/test/hexapdf/test_configuration.rb +93 -0
  195. data/test/hexapdf/test_data_dir.rb +32 -0
  196. data/test/hexapdf/test_dictionary.rb +340 -0
  197. data/test/hexapdf/test_dictionary_fields.rb +269 -0
  198. data/test/hexapdf/test_document.rb +641 -0
  199. data/test/hexapdf/test_filter.rb +100 -0
  200. data/test/hexapdf/test_importer.rb +106 -0
  201. data/test/hexapdf/test_object.rb +258 -0
  202. data/test/hexapdf/test_parser.rb +645 -0
  203. data/test/hexapdf/test_pdf_array.rb +169 -0
  204. data/test/hexapdf/test_rectangle.rb +73 -0
  205. data/test/hexapdf/test_reference.rb +50 -0
  206. data/test/hexapdf/test_revision.rb +188 -0
  207. data/test/hexapdf/test_revisions.rb +196 -0
  208. data/test/hexapdf/test_serializer.rb +195 -0
  209. data/test/hexapdf/test_stream.rb +274 -0
  210. data/test/hexapdf/test_tokenizer.rb +80 -0
  211. data/test/hexapdf/test_type.rb +18 -0
  212. data/test/hexapdf/test_writer.rb +140 -0
  213. data/test/hexapdf/test_xref_section.rb +61 -0
  214. data/test/hexapdf/type/acro_form/test_appearance_generator.rb +795 -0
  215. data/test/hexapdf/type/acro_form/test_button_field.rb +308 -0
  216. data/test/hexapdf/type/acro_form/test_choice_field.rb +220 -0
  217. data/test/hexapdf/type/acro_form/test_field.rb +259 -0
  218. data/test/hexapdf/type/acro_form/test_form.rb +357 -0
  219. data/test/hexapdf/type/acro_form/test_signature_field.rb +38 -0
  220. data/test/hexapdf/type/acro_form/test_text_field.rb +201 -0
  221. data/test/hexapdf/type/acro_form/test_variable_text_field.rb +88 -0
  222. data/test/hexapdf/type/actions/test_launch.rb +24 -0
  223. data/test/hexapdf/type/actions/test_uri.rb +23 -0
  224. data/test/hexapdf/type/annotations/test_markup_annotation.rb +22 -0
  225. data/test/hexapdf/type/annotations/test_text.rb +34 -0
  226. data/test/hexapdf/type/annotations/test_widget.rb +225 -0
  227. data/test/hexapdf/type/test_annotation.rb +97 -0
  228. data/test/hexapdf/type/test_catalog.rb +48 -0
  229. data/test/hexapdf/type/test_cid_font.rb +61 -0
  230. data/test/hexapdf/type/test_file_specification.rb +141 -0
  231. data/test/hexapdf/type/test_font.rb +67 -0
  232. data/test/hexapdf/type/test_font_descriptor.rb +61 -0
  233. data/test/hexapdf/type/test_font_simple.rb +176 -0
  234. data/test/hexapdf/type/test_font_true_type.rb +31 -0
  235. data/test/hexapdf/type/test_font_type0.rb +120 -0
  236. data/test/hexapdf/type/test_font_type1.rb +142 -0
  237. data/test/hexapdf/type/test_font_type3.rb +26 -0
  238. data/test/hexapdf/type/test_form.rb +120 -0
  239. data/test/hexapdf/type/test_image.rb +261 -0
  240. data/test/hexapdf/type/test_info.rb +9 -0
  241. data/test/hexapdf/type/test_object_stream.rb +117 -0
  242. data/test/hexapdf/type/test_page.rb +598 -0
  243. data/test/hexapdf/type/test_page_tree_node.rb +315 -0
  244. data/test/hexapdf/type/test_resources.rb +209 -0
  245. data/test/hexapdf/type/test_trailer.rb +116 -0
  246. data/test/hexapdf/type/test_xref_stream.rb +143 -0
  247. data/test/hexapdf/utils/test_bit_field.rb +63 -0
  248. data/test/hexapdf/utils/test_bit_stream.rb +69 -0
  249. data/test/hexapdf/utils/test_graphics_helpers.rb +37 -0
  250. data/test/hexapdf/utils/test_lru_cache.rb +22 -0
  251. data/test/hexapdf/utils/test_object_hash.rb +120 -0
  252. data/test/hexapdf/utils/test_pdf_doc_encoding.rb +18 -0
  253. data/test/hexapdf/utils/test_sorted_tree_node.rb +239 -0
  254. data/test/test_helper.rb +58 -0
  255. metadata +263 -3
data/CHANGELOG.md ADDED
@@ -0,0 +1,1024 @@
1
+ ## 0.17.2 - 2021-10-26
2
+
3
+ ### Fixed
4
+
5
+ * Deployment of HexaPDF's Rubygem
6
+
7
+
8
+ ## 0.17.1 - 2021-10-21
9
+
10
+ ### Fixed
11
+
12
+ * Handling of files containing invalid UTF-16 strings
13
+
14
+
15
+ ## 0.17.0 - 2021-10-21
16
+
17
+ ### Added
18
+
19
+ * CLI command `hexapdf fonts` for listing fonts of a PDF file
20
+ * [HexaPDF::Layout::Style#background_alpha] for defining the opacity of the
21
+ background
22
+ * [HexaPDF::Type::Page#each_annotation] for iterating over all annotations of a
23
+ page
24
+
25
+ ### Changed
26
+
27
+ * **Breaking change**: Handling of AcroForm check boxes to allow multiple
28
+ widgets with different values
29
+ * CLI command `hexapdf form` to support new check box features
30
+ * [HexaPDF::Content::Canvas#text] to use the font size as leading if no leading
31
+ has been set
32
+ * [HexaPDF::Content::Canvas#line_with_rounded_corner] to be a public method
33
+ * [HexaPDF::Layout::Style::LineSpacing] to allow using integers or floats as
34
+ type argument to mean proportional line spacing
35
+ * [HexaPDF::Type::AcroForm::VariableTextField#set_default_appearance_string] to
36
+ allow specifying font options
37
+ * AcroForm text field creation methods in [HexaPDF::Type::AcroForm::Form] to
38
+ allow specifying font options
39
+
40
+ ### Fixed
41
+
42
+ * [HexaPDF::Type::AcroForm::Field#each_widget] to also return widgets of other
43
+ form fields that have the same name
44
+ * `hexapdf form` to allow filling in multiline and comb text fields
45
+ * `hexapdf form` to correctly work for PDF files containing null values in the
46
+ list of annotations
47
+ * Handling of files that contain invalid default appearance strings
48
+ * [HexaPDF::Type::AcroForm::TextField#field_value] to allow setting a `nil`
49
+ value for single line text fields
50
+ * [HexaPDF::Content::GraphicObject::Arc] to respect the value set by the
51
+ `#max_curves` accessor
52
+
53
+
54
+ ## 0.16.0 - 2021-09-28
55
+
56
+ ## Added
57
+
58
+ * Support for RGB color values of the form "RGB" in addition to "RRGGBB" and for
59
+ CSS color module level 3 color names
60
+ * Conversion module for Integer fields to fix certain invalid PDF files
61
+
62
+
63
+ ## 0.15.9 - 2021-09-04
64
+
65
+ ### Fixed
66
+
67
+ * Handling of files that contain stream length values that are indirect objects
68
+ not referring to a number
69
+
70
+
71
+ ## 0.15.8 - 2021-08-16
72
+
73
+ ### Fixed
74
+
75
+ * Regression when using `-v` with the hexapdf command line tool
76
+
77
+
78
+ ## 0.15.7 - 2021-07-17
79
+
80
+ ### Fixed
81
+
82
+ * Infinite loop while parsing PDF array due to missing closing bracket
83
+ * Handling of invalid files with missing or corrupted trailer dictionary
84
+
85
+
86
+ ## 0.15.6 - 2021-07-16
87
+
88
+ ### Fixed
89
+
90
+ * Handling of indirect objects with invalid values which are now treated as null
91
+ objects
92
+
93
+
94
+ ## 0.15.5 - 2021-07-06
95
+
96
+ ### Changed
97
+
98
+ * Refactored [HexaPDF::Tokenizer#next_xref_entry] and changed yielded value
99
+
100
+
101
+ ### Fixed
102
+
103
+ * Handling of invalid cross-reference stream entries that ends with the sequence
104
+ `\r\r`
105
+
106
+
107
+ ## 0.15.4 - 2021-05-27
108
+
109
+ ### Fixed
110
+
111
+ * [HexaPDF::Type::Annotation#appearance] to handle cases where there is
112
+ no valid appearance stream
113
+
114
+
115
+ ## 0.15.3 - 2021-05-01
116
+
117
+ ### Fixed
118
+
119
+ * Handling of general (not document-level), unencrypted metadata streams
120
+
121
+
122
+ ## 0.15.2 - 2021-05-01
123
+
124
+ ### Fixed
125
+
126
+ * Handling of unencrypted metadata streams
127
+
128
+
129
+ ## 0.15.1 - 2021-04-15
130
+
131
+ ### Fixed
132
+
133
+ * Potential division by zero when calculating the scaling for XObjects
134
+ * Handling of XObjects with a width or height of zero when drawing on canvas
135
+
136
+
137
+ ## 0.15.0 - 2021-04-12
138
+
139
+ ### Added
140
+
141
+ * [HexaPDF::Type::Page#flatten_annotations] for flattening the annotations of a
142
+ page
143
+ * [HexaPDF::Type::AcroForm::Form#flatten] for flattening interactive forms
144
+ * [HexaPDF::Revision#update] for updating the stored wrapper class of a PDF
145
+ object
146
+ * [HexaPDF::Type::AcroForm::SignatureField] for working with AcroForm signature
147
+ fields
148
+ * Support for form field flattening to the `hexapdf form` CLI command
149
+
150
+ ### Changed
151
+
152
+ * **Breaking change**: Overhauled the interface for accessing appearances of
153
+ annotations to make it more convenient
154
+ * Validation of [HexaPDF::Type::FontDescriptor] to delete invalid `/FontWeight`
155
+ value
156
+ * [HexaPDF::MalformedPDFError#pos] an accessor instead of a reader and update
157
+ the exception message
158
+ * Configuration option 'acro_form.fallback_font' to allow a callable object for
159
+ more advanced fallback font handling
160
+
161
+ ### Fixed
162
+
163
+ * [HexaPDF::Type::Annotations::Widget#background_color] to correctly handle
164
+ empty background color arrays
165
+ * [HexaPDF::Type::AcroForm::Field#delete_widget] to update the wrapper object
166
+ stored in the document in case the widget is embedded
167
+ * Processing of invalid PDF files containing a space,CR,LF combination after
168
+ the 'stream' keyword
169
+ * Cross-reference stream reconstruction with respect to detection of linearized
170
+ files
171
+ * Detection of existing appearances for AcroForm push button fields when
172
+ creating appearances
173
+
174
+
175
+ ## 0.14.4 - 2021-02-27
176
+
177
+ ### Added
178
+
179
+ * Support for the Crypt filters
180
+
181
+ ### Changed
182
+
183
+ * [HexaPDF::MalformedPDFError] to make the `pos` argument optional
184
+
185
+ ### Fixed
186
+
187
+ * Handling of invalid floating point numbers NaN, Inf and -Inf when serializing
188
+ * Processing of invalid PDF files containing NaN and Inf instead of numbers
189
+ * Bug in Type1 font AFM parser that occured if the file doesn't end with a new
190
+ line character
191
+ * Cross-reference table reconstruction to handle the case of an entry specifying
192
+ a non-existent indirect object
193
+ * Cross-reference table reconstruction to handle trailers specified by cross-
194
+ reference streams
195
+ * Cross-reference table reconstruction to use the set security handle for
196
+ decrypting indirect objects
197
+ * Parsing of cross-reference streams where data is missing
198
+
199
+
200
+ ## 0.14.3 - 2021-02-16
201
+
202
+ ### Fixed
203
+
204
+ * Bug in [HexaPDF::Font::TrueType::Subsetter#use_glyph] which lead to corrupt
205
+ text output
206
+ * [HexaPDF::Serializer] to handle infinite recursion problem
207
+ * Cross-reference table reconstruction to avoid an O(n^2) performance problem
208
+ * [HexaPDF::Type::Resources] validation to handle an invalid `/ProcSet` entry
209
+ containing a single value instead of an array
210
+ * Processing of invalid PDF files missing a required value in appearance streams
211
+ * Processing of invalid empty arrays that should be rectangles by converting
212
+ them to PDF null objects
213
+ * Processing of invalid PDF files containing indirect objects with offset 0
214
+ * Processing of invalid PDF files containing a space/CR or space/LF combination
215
+ after the 'stream' keyword
216
+
217
+
218
+ ## 0.14.2 - 2021-01-22
219
+
220
+ ### Fixed
221
+
222
+ * [HexaPDF::Font::TrueType::Subsetter#use_glyph] to really avoid using subset
223
+ glyph ID 41 (`)`)
224
+
225
+
226
+ ## 0.14.1 - 2021-01-21
227
+
228
+ ### Changed
229
+
230
+ * Validation message when checking for allowed values to include the invalid
231
+ object
232
+ * [HexaPDF::FontLoader::FromFile] to allow (re)using an existing font object
233
+ * [HexaPDF::Importer] internals to avoid problems with retained memory
234
+
235
+ ### Fixed
236
+
237
+ * Parsing of invalid PDF files where whitespace is missing after the integer
238
+ value of an indirect object
239
+ * [HexaPDF::Dictionary] so that adding new key-value pairs during validation is
240
+ possible
241
+
242
+
243
+ ## 0.14.0 - 2020-12-30
244
+
245
+ ### Added
246
+
247
+ * Support for creating AcroForm multiline text fields and their appearances
248
+ * Support for creating AcroForm comb text fields and their appearances
249
+ * Support for creating AcroForm password fields and their appearances
250
+ * Support for creating AcroForm file select fields and their appearances
251
+ * Support for creating AcroForm list box appearances
252
+ * [HexaPDF::Type::AcroForm::ChoiceField#list_box_top_index] and its setter
253
+ method
254
+ * [HexaPDF::Type::AcroForm::ChoiceField#update_widgets] to create appearances if
255
+ they don't exist
256
+ * Methods for caching data to [HexaPDF::Object]
257
+ * Support for splitting by page size to CLI command `hexapdf split`
258
+
259
+ ### Changed
260
+
261
+ * [HexaPDF::Utils::ObjectHash#oids] to be public instead of private
262
+ * Cross-reference table parsing to handle invalidly numbered main sections
263
+ * [HexaPDF::Document#cache] and [HexaPDF::Object#cache] to allow updating
264
+ values for existing keys
265
+ * Appearance creation methods of AcroForm objects to allow forcing the creation
266
+ of new appearances
267
+ * [HexaPDF::Type::AcroForm::AppearanceGenerator#create_text_appearances] to
268
+ re-use existing form objects
269
+ * AcroForm field creation methods to allow specifying often used field
270
+ properties
271
+
272
+ ### Fixed
273
+
274
+ * Missing usage of `:sort` flag for AcroForm choice fields
275
+ * Setting the `/I` field for AcroForm list boxes with multiple selection
276
+ * [HexaPDF::Layout::TextLayouter::SimpleLineWrapping] to remove glue items
277
+ (whitespace) before a hard line break
278
+ * Infinite loop when reconstructing the cross-reference table
279
+ * [HexaPDF::Type::AcroForm::ChoiceField] to support export values for option
280
+ items
281
+ * AcroForm text field appearance creation to only create a new appearance if the
282
+ field's value has changed
283
+ * AcroForm choice field appearance creation to only create a new appearance if
284
+ the involved dictionary fields' values have changed
285
+ * [HexaPDF::Type::AcroForm::ChoiceField#list_box_top_index=] to raise an error
286
+ if no option items are set
287
+ * [HexaPDF::PDFArray#to_ary] to return an array with preprocessed values
288
+ * [HexaPDF::Type::Form#contents=] to clear cached values to avoid returning e.g.
289
+ an invalid canvas object later
290
+ * [HexaPDF::Type::AcroForm::ButtonField#update_widgets] to create appearances if
291
+ they don't exist
292
+
293
+
294
+ ## 0.13.0 - 2020-11-15
295
+
296
+ ### Added
297
+
298
+ * Cross-reference table reconstruction for damaged PDFs, controllable via the
299
+ new 'parser.try_xref_reconstruction' option
300
+ * Two new `hexapdf inspect` commands for showing page objects and page content
301
+ streams by page number
302
+ * Flag `--check` to the CLI command `hexapdf info` for checking a file for
303
+ parse and validation errors
304
+ * [HexaPDF::Type::AcroForm::Field#embedded_widget?] for checking if a widget is
305
+ embedded in the field object
306
+ * [HexaPDF::Type::AcroForm::Field#delete_widget] for deleting a widget
307
+ * [HexaPDF::PDFArray#delete] for deleting an object from a PDF array
308
+ * [HexaPDF::Type::Page#ancestor_nodes] for retrieving all ancestor page tree
309
+ nodes of a page
310
+ * [HexaPDF::Type::PageTreeNode#move_page] for moving a page to another index
311
+
312
+ ### Changed
313
+
314
+ * **Breaking change**: Overhauled document/object validation interfaces and
315
+ internals to be more similar and to allow for reporting of multiple validation
316
+ problems
317
+ * Validation of TrueType fonts to ignore missing fields if the font name
318
+ suggests that the font is one of the standard 14 PDF fonts
319
+ * Option `-p` of CLI command `hexapdf image2pdf` to also allow lowercase page
320
+ size names
321
+
322
+ ### Fixed
323
+
324
+ * Reporting of cross-reference section entry parsing error
325
+ * PDF version used by default for dictionary fields
326
+ * Error in CLI command `hexapdf inspect` when parsing an invalid object number
327
+ * Output of error messages in CLI command `hexapdf inspect` to go to `$stderr`
328
+ * Bug in [HexaPDF::Type::AcroForm::TextField] validation due to missing nil
329
+ handling
330
+
331
+
332
+ ## 0.12.3 - 2020-08-22
333
+
334
+ ### Changed
335
+
336
+ * Allow any object responding to `#to_sym` when setting a radio button value
337
+
338
+ ### Fixed
339
+
340
+ * Error in the AcroForm appearance generator for text fields when the font is
341
+ not found in the default resources
342
+ * Parsing of long numbers when reading a file from IO
343
+ * Usage of unsupported method for Ruby 2.4 so that all tests pass again
344
+
345
+
346
+ ## 0.12.2 - 2020-08-17
347
+
348
+ ### Fixed
349
+
350
+ - Wrong origin for page canvases when bottom left corner of media box doesn't
351
+ coincide with origin of coordinate system
352
+ - Wrong origin for Form XObject canvas when bottom left corner of bounding box
353
+ doesn't coincide with origin of coordinate system
354
+
355
+
356
+ ## 0.12.1 - 2020-08-16
357
+
358
+ ### Added
359
+
360
+ * [HexaPDF::Font::Encoding::Base#code] for retrieving the code for a given
361
+ glyph name
362
+
363
+ ### Fixed
364
+
365
+ * [HexaPDF::Font::Type1Wrapper#encode] to correctly resolve the code for a glyph
366
+ name
367
+
368
+
369
+ ## 0.12.0 - 2020-08-12
370
+
371
+ ### Added
372
+
373
+ * Convenience methods for accessing field flags for
374
+ [HexaPDF::Type::AcroForm::Field]
375
+ * [HexaPDF::Type::AcroForm::TextField] and
376
+ [HexaPDF::Type::AcroForm::VariableTextField] for basic text field support
377
+ * [HexaPDF::Type::AcroForm::ButtonField] for push button, radio button and
378
+ check box support
379
+ * [HexaPDF::Type::AcroForm::ChoiceField] for combo box and list box support
380
+ * [HexaPDF::Type::AcroForm::AppearanceGenerator] as central class for
381
+ generating appearance streams for form fields
382
+ * Various convenience methods for [HexaPDF::Type::AcroForm::Form]
383
+ * Various convenience methods for [HexaPDF::Type::AcroForm::Field]
384
+ * Various convenience methods for [HexaPDF::Type::Annotations::Widget]
385
+ * [HexaPDF::Type::Annotation::AppearanceDictionary]
386
+ * [HexaPDF::Document#acro_form] and [HexaPDF::Type::Catalog#acro_form]
387
+ convenience methods
388
+ * CLI command `hexapdf form` for listing fields of interactive forms and filling
389
+ them out
390
+ * [HexaPDF::Rectangle] methods for setting the left, top, right, bottom, width
391
+ and height
392
+ * Method #prenormalized_color to all color space implementations
393
+ * [HexaPDF::Type::Font#font_wrapper] for accessing an associated font wrapper
394
+ instance
395
+ * [HexaPDF::Type::FontType1#font_wrapper] for providing a font wrapper for the
396
+ standard PDF fonts
397
+ * [HexaPDF::Type::Annotation::Border] class
398
+ * [HexaPDF::Content::ColorSpace::device_color_from_specification] for easily
399
+ getting a device color object
400
+ * [HexaPDF::Content::ColorSpace::prenormalized_device_color] for getting a device
401
+ color object without normalizing values
402
+ * [HexaPDF::Type::Annotation#appearance] for returning the associated appearance
403
+ dictionary
404
+ * [HexaPDF::Type::Annotation#appearance?] for checking whether an appearance for
405
+ the annotation exists
406
+ * Configuration option 'acro_form.create_appearance_streams' for automatically
407
+ creating appearance streams
408
+ * [HexaPDF::Type::Resources] methods `#pattern` and `add_pattern`
409
+
410
+ ### Changed
411
+
412
+ * Deletion of pages to delete them from the document as well
413
+ * Refactored [HexaPDF::Font::Type1Wrapper] and [HexaPDF::Font::TrueTypeWrapper]
414
+ and renamed `#dict` to `#pdf_object`
415
+ * Fall back to the Type1 font's internal encoding when decoding a string
416
+ * All [HexaPDF::Content::ColorSpace] implementations to only normalize values
417
+ when using the ::color method
418
+ * [HexaPDF::Content::Parser#parse] to also accept a block in place of a
419
+ processor object
420
+ * HexaPDF::Type::AcroForm::Field#full_name to
421
+ [HexaPDF::Type::AcroForm::Field#full_field_name]
422
+ * Moved `HexaPDF::Content::Canvas#color_space_for_components` to class method on
423
+ [HexaPDF::Content::ColorSpace]
424
+ * Added bit unsetter method to[HexaPDF::Utils::BitField]
425
+ * [HexaPDF::Type::AcroForm::Form#find_root_fields] and `#each_field` to take the
426
+ field type into account when wrapping a field dictionary
427
+ * Pages specification of CLI commands to allow counting from the end using the
428
+ new `r<N>` notation
429
+ * [HexaPDF::Font::Type1Wrapper] to use the internal encoding of a font with a
430
+ 'Special' character set instead of a custom encoding
431
+ * Configuration 'filter.map' to use the pass-through filter on all unsupported
432
+ filters
433
+
434
+ ### Fixed
435
+
436
+ * Wrong normalization of color values when invoking a color operator
437
+ * Invalid type of `/DR` field of [HexaPDF::Type::AcroForm::Form]
438
+ * Invalid ordering of types for the `/V` and `/DV` fields of
439
+ [HexaPDF::Type::AcroForm::Field]
440
+ * [HexaPDF::Type::AcroForm::Field#terminal_field?] to work according to the spec
441
+ * Handling of empty files by throwing better error messages
442
+ * [HexaPDF::Type::Image#info] to correctly identify images with a soft mask as
443
+ currently not supported for writing
444
+ * [HexaPDF::Revision#delete] to remove the connection between the object and the
445
+ document
446
+ * Missing `#definition` method of `DeviceRGB`, `DeviceCMYK` and `DeviceGray`
447
+ color spaces
448
+ * Handling of 'Pattern' color spaces when parsing content streams
449
+
450
+
451
+ ## 0.11.9 - 2020-06-15
452
+
453
+ ### Changed
454
+
455
+ * Encryption dictionaries to always be indirect objects
456
+
457
+
458
+ ## 0.11.8 - 2020-06-11
459
+
460
+ ### Fixed
461
+
462
+ * Serialization of special `/` (zero-length name) object in dictionaries and
463
+ arrays
464
+
465
+
466
+ ## 0.11.7 - 2020-06-10
467
+
468
+ ### Fixed
469
+
470
+ * Deletion of object streams in [HexaPDF::Task::Optimize] to avoid accessing
471
+ then invalid object streams
472
+ * [HexaPDF::Task::Optimize] to work correctly when deleting object streams and
473
+ generating xref streams
474
+
475
+
476
+ ## 0.11.6 - 2020-05-27
477
+
478
+ ### Fixed
479
+
480
+ * [HexaPDF::Layout::TextBox] to respect the set width and height when fitting
481
+ and splitting the box
482
+
483
+
484
+ ## 0.11.5 - 2020-01-27
485
+
486
+ ### Changed
487
+
488
+ * [HexaPDF::Font::TrueType::Table::CmapSubtable] to lazily parse the subtable
489
+ * [HexaPDF::Font::TrueType::Table::Hmtx] to lazily parse the width data
490
+ * CLI command `hexapdf image2pdf` to use the last argument as output file
491
+ instead of the first (same order as `merge`)
492
+ * Automatically require the HexaPDF C extension if it is installed
493
+
494
+ ### Fixed
495
+
496
+ * Wrong line length calculation for variable width layouting when a text box is
497
+ too wide and needs to be broken into parts
498
+ * CLI command `hexapdf image2pdf` so that treating a PDF as image works
499
+
500
+
501
+ ## 0.11.4 - 2019-12-28
502
+
503
+ ### Fixed
504
+
505
+ * Memory consumption problem of PNG image loader when using images with alpha
506
+ channel
507
+
508
+
509
+ ## 0.11.3 - 2019-11-27
510
+
511
+ ### Fixed
512
+
513
+ * Restore compatibility with Ruby 2.4
514
+
515
+
516
+ ## 0.11.2 - 2019-11-22
517
+
518
+ ### Fixed
519
+
520
+ * Conversion of [HexaPDF::Rectangle] type when the original is not a plain
521
+ Array but a [HexaPDF::PDFArray]
522
+
523
+
524
+ ## 0.11.1 - 2019-11-19
525
+
526
+ ### Fixed
527
+
528
+ * [HexaPDF::Type::AcroForm::Form#find_root_fields] to work for documents where
529
+ not all pages have form fields
530
+
531
+
532
+ ## 0.11.0 - 2019-11-19
533
+
534
+ ### Added
535
+
536
+ * [HexaPDF::PDFArray] to wrap arrays and allow automatic resolution of
537
+ references like with [HexaPDF::Dictionary] - MAY BREAK THINGS!
538
+ * CLI command `hexapdf watermark` to apply a watermark PDF as background or
539
+ stamp onto another PDF file
540
+ * CLI command `hexapdf image2pdf` to convert images into a PDF file
541
+ * [HexaPDF::DictionaryFields::Field#allowed_values] to allow constraining a
542
+ field to certain allowed values
543
+ * [HexaPDF::Document::Fonts#configured_fonts] to return all font variants that
544
+ are configured and available for adding to a document
545
+ * [HexaPDF::Type::Annotations::Widget] and associated classes
546
+ * [HexaPDF::Type::AcroForm::Form] and [HexaPDF::Type::AcroForm::Field] for basic
547
+ AcroForm support
548
+
549
+ ### Changed
550
+
551
+ * Use Reline for interactive mode of `hexapdf inspect` if available
552
+ * [HexaPDF::DictionaryFields::Field::new] to use keyword arguments
553
+ * Update the field information for implemented PDF types to include the allowed
554
+ values where possible
555
+ * Interface of font loader objects to allow another method `available_fonts` for
556
+ returning all available fonts
557
+ * [HexaPDF::Layout::Style] to check for valid values where possible
558
+
559
+ ### Fixed
560
+
561
+ * Line spacing of empty lines for [HexaPDF::Layout::TextLayouter]
562
+ * Handling of `/DecodeParms` when exporting to PNG images
563
+
564
+
565
+ ## 0.10.0 - 2019-10-02
566
+
567
+ ### Added
568
+
569
+ * [HexaPDF::Reference#to_s] to return the serialized form of the PDF reference
570
+ * [HexaPDF::Revision#xref] for getting cross-reference entries
571
+ * HexaPDF::XRefSection::Entry#to_s to return a description of the
572
+ cross-reference entry
573
+
574
+ ### Changed
575
+
576
+ * Enhanced the `hexapdf images` command to also show information on PPI (pixels
577
+ per inch) and size
578
+ * Completely revamped the `hexapdf inspect` command with an interactive mode,
579
+ structure output, cross-reference entry output and object search
580
+ * Output of validation problem messages for `hexapdf` command to include more
581
+ information
582
+ * The Validation feature to automatically correct String-for-Symbol and
583
+ Symbol-for-String problems
584
+
585
+ ### Fixed
586
+
587
+ * [HexaPDF::Document#wrap] to better handle subtype mappings in case of unknown
588
+ type information
589
+ * [HexaPDF::DictionaryFields::DictionaryConverter] to not allow conversion to a
590
+ [HexaPDF::Stream] subclass from objects without stream data
591
+ * Import of JPEG images with YCCK color encoding
592
+ * Export of images without `/FlateDecode` filter or `/DecodeParms` to PNG files
593
+ * Mistyped name of field type for field `/Popup` of
594
+ [HexaPDF::Type::Annotations::MarkupAnnotation]
595
+ * Loading and saving of encrypted and signed PDFs
596
+ * CLI commands that optimize font data structures won't crash when encountering
597
+ invalid font objects
598
+
599
+
600
+ ## 0.9.3 - 2019-06-13
601
+
602
+ ### Changed
603
+
604
+ * Behaviour of how object streams are generated to work around a bug (?) in
605
+ Adobe Acrobat
606
+
607
+ ### Fixed
608
+
609
+ * Fix problem with [HexaPDF::Encryption::StandardSecurityHandler] due to
610
+ behaviour change of Ruby 2.6.0 in `String#setbyte`
611
+
612
+ ## 0.9.2 - 2019-05-22
613
+
614
+ ### Changed
615
+
616
+ * [HexaPDF::Encryption::AES] to handle invalid padding
617
+ * [HexaPDF::Filter::FlateDecode] to correctly handle invalid empty streams
618
+
619
+ ## 0.9.1 - 2019-03-26
620
+
621
+ ### Fixed
622
+
623
+ * [HexaPDF::Serializer] to avoid infinite loops for self-referencing streams
624
+ * Bug due to frozen string in [HexaPDF::Font::CMap::Writer]
625
+
626
+
627
+ ## 0.9.0 - 2018-12-31
628
+
629
+ ### Added
630
+
631
+ * [HexaPDF::Composer] for composing PDF documents in a high-level way
632
+ * Incremental writing support (i.e. appending a single revision with all the
633
+ changes to an existing document) to [HexaPDF::Writer] and [HexaPDF::Document]
634
+ * CLI command `hexapdf split` to split a PDF file into individual pages
635
+ * [HexaPDF::Revisions#parser] for accessing the parser object that is created
636
+ when a document is read from an IO stream
637
+ * [HexaPDF::Document#each] argument `only_loaded` for iteration over loaded
638
+ objects only
639
+ * [HexaPDF::Document#validate] argument `only_loaded` for validating only loaded
640
+ objects
641
+ * [HexaPDF::Revision#each_modified_object] for iterating over all modified
642
+ objects of a revision
643
+ * [HexaPDF::Layout::Box#split] and [HexaPDF::Layout::TextBox#split] for
644
+ splitting a box into two parts
645
+ * [HexaPDF::Layout::Frame#full?] for testing whether the frame has any space
646
+ left
647
+ * [HexaPDF::Layout::Style] property `last_line_gap` for controlling the spacing
648
+ after the last line of text
649
+ * HexaPDF::Layout::Box#draw_content for use by subclasses
650
+ * [HexaPDF::Type::Form#width] and [HexaPDF::Type::Form#height] for compatibility
651
+ with [HexaPDF::Type::Image]
652
+ * [HexaPDF::Layout::ImageBox] for displaying an image inside a frame
653
+
654
+ ### Changed
655
+
656
+ * [HexaPDF::Revision#each] to allow iteration over loaded objects only
657
+ * [HexaPDF::Document#each] method argument from `current` to `only_current`
658
+ * [HexaPDF::Object#==] and [HexaPDF::Reference#==] so that Object and Reference
659
+ objects can be compared
660
+ * Refactored [HexaPDF::Layout::Frame] to allow separate fitting, splitting and
661
+ drawing of boxes
662
+ * [HexaPDF::Layout::Style::LineSpacing::new] to allow setting of line spacing
663
+ via a single hash argument
664
+ * Made [HexaPDF::Layout::Style] copyable
665
+
666
+ ### Fixed
667
+
668
+ * Configuration so that annotation objects are correctly mapped to classes
669
+ * Fix problem with [HexaPDF::Filter::Predictor] due to behaviour change of Ruby
670
+ 2.6.0 in `String#setbyte`
671
+ * Fitting of [HexaPDF::Layout::TextBox] when the box has padding and/or borders
672
+ * Fitting of [HexaPDF::Layout::TextBox] when width and/or height has been set
673
+ * Fitting of absolutely positioned boxes in [HexaPDF::Layout::Frame]
674
+ * Fix bug in variable width line wrapping due to not considering line spacing
675
+ correctly ([HexaPDF::Layout::Line::HeightCalculator#simulate_height] return
676
+ value needed to be changed for this fix)
677
+
678
+ ## 0.8.0 - 2018-10-26
679
+
680
+ ### Added
681
+
682
+ * [HexaPDF::Layout::Frame] for box positioning and easier text layouting
683
+ inside an arbitrary polygon
684
+ * [HexaPDF::Layout::TextBox] for displaying text in a rectangular and for
685
+ flowing text inside a frame
686
+ * [HexaPDF::Layout::WidthFromPolygon] for getting a width specification from
687
+ a polygon for use with the text layouting engine
688
+ * [HexaPDF::Type::Image#width] and [HexaPDF::Type::Image#height] convenience
689
+ methods
690
+ * [HexaPDF::Type::FontType3] for Type 3 font support
691
+ * [HexaPDF::Content::GraphicObject::Geom2D] for [Geom2D] object drawing support
692
+ * [HexaPDF::Type::Page#orientation] for easy determination of page orientation
693
+ * [HexaPDF::Type::Page#rotate] for rotating a page
694
+ * [HexaPDF::Layout::Style::Quad#set] for setting all values at once
695
+
696
+ ### Changed
697
+
698
+ * [HexaPDF::Document#validate] to also yield the object that failed validation
699
+ * [HexaPDF::Type::Page#box] to allow setting the value for a box
700
+ * [HexaPDF::Layout::TextLayouter#fit] to allow fitting text into arbitrarily
701
+ shaped areas
702
+ * [HexaPDF::Layout::TextLayouter] to return a new
703
+ [HexaPDF::Layout::TextLayouter::Result] structure when `#fit` is called that
704
+ includes the `#draw` method
705
+ * [HexaPDF::Layout::TextLayouter#fit] to require the height argument
706
+ * Refactored [HexaPDF::Layout::Box] to make using it a bit easier
707
+
708
+ ### Fixed
709
+
710
+ * Validation and conversion of dictionary fields with multiple possible types
711
+ * Box border drawing when border width is greater than edge length
712
+
713
+ [geom2d]: https://github.com/gettalong/geom2d
714
+
715
+
716
+ ## 0.7.0 - 2018-06-19
717
+
718
+ ### Changed
719
+
720
+ * All Ruby source files use frozen string literal pragma
721
+ * [HexaPDF::MalformedPDFError::new] method signature
722
+ * [HexaPDF::Layout::TextFragment::new] and
723
+ [HexaPDF::Layout::TextFragment::create] method signatures
724
+ * [HexaPDF::Encryption::SecurityHandler#set_up_encryption] argument `force_V4`
725
+ to `force_v4`
726
+ * HexaPDF::Layout::TextLayouter#draw to return result of #fit if possible
727
+
728
+ ### Removed
729
+
730
+ * Optional `leading` argument to HexaPDF::Content::Canvas#font_size method
731
+
732
+ ### Fixed
733
+
734
+ * Misspelt variable name in [HexaPDF::Layout::TextLayouter::SimpleLineWrapping]
735
+ * [HexaPDF::Layout::TextLayouter::SimpleTextSegmentation] to work if the last
736
+ character in a text fragment is \r
737
+ * [HexaPDF::Layout::TextLayouter] to work if an optional break point (think
738
+ soft-hyphen) is followed by whitespace
739
+ * [HexaPDF::Font::TrueType::Builder] to correctly order the entries in the
740
+ table directory
741
+ * [HexaPDF::Font::TrueType::Builder] to pad the table data to achieve the
742
+ correct alignment
743
+ * [HexaPDF::Filter::FlateDecode] by removing the Zlib pools since they were
744
+ not thread safe
745
+ * All color space classes to accept the color space definition as argument to
746
+ `::new`
747
+
748
+
749
+ ## 0.6.0 - 2017-10-27
750
+
751
+ ### Added
752
+
753
+ * [HexaPDF::Layout::Box] as base class for all layout boxes
754
+ * More styling properties for [HexaPDF::Layout::Style]
755
+ * Methods for checking whether styling properties in [HexaPDF::Layout::Style]
756
+ have been accessed or set
757
+ * [HexaPDF::FontLoader::FromFile] to allow specifying a font file directly
758
+ * Configuration option 'page.default_media_orientation' for settig the default
759
+ orientation of new pages
760
+ * Convenience methods for getting underline and strikeout properties from fonts
761
+ * Configuration option 'style.layers_map' for pre-defining overlay and underlay
762
+ callback objects for [HexaPDF::Layout::Style]
763
+ * [HexaPDF::Type::Action] as well as specific implementations for the GoTo,
764
+ GoToR, Launch and URI actions
765
+ * [HexaPDF::Type::Annotation] as well as specific implementations for the Text
766
+ Link annotations
767
+ * [HexaPDF::Layout::Style::LinkLayer] for easy adding of in-document, URI and
768
+ file links
769
+
770
+ ### Changed
771
+
772
+ * [HexaPDF::Layout::TextFragment] to support more styling properties
773
+ * Cross-reference subsection parsing can handle missing whitespace
774
+ * Renamed HexaPDF::Layout::LineFragment to [HexaPDF::Layout::Line]
775
+ * Renamed HexaPDF::Layout::TextBox to [HexaPDF::Layout::TextLayouter]
776
+ * [HexaPDF::Layout::TextFragment::new] and
777
+ [HexaPDF::Layout::TextLayouter::new] to either take a Style object or
778
+ style options
779
+ * [HexaPDF::Layout::TextLayouter#fit] method signature
780
+ * [HexaPDF::Layout::InlineBox] to wrap a generic box
781
+ * HexaPDF::Document::Fonts#load to [HexaPDF::Document::Fonts#add] for
782
+ consistency
783
+ * [HexaPDF::Document::Pages#add] to allow setting the paper orientation when
784
+ creating new pages
785
+ * [HexaPDF::Filter::Predictor] to allow correcting some common problems
786
+ depending on the new configuration option 'filter.predictor.strict'
787
+ * Moved configuration options 'encryption.aes', 'encryption.arc4',
788
+ 'encryption.filter_map', 'encryption.sub_filter.map', 'filter.map',
789
+ 'image_loader' and 'task.map' to the document specific configuration object
790
+ * [HexaPDF::Configuration#constantize] can now dig into hierarchical values
791
+ * [HexaPDF::Document#wrap] class resolution and configuration option structure
792
+ of 'object.subtype_map'
793
+
794
+ ### Removed
795
+
796
+ * HexaPDF::Dictionary#to_hash method
797
+
798
+ ### Fixed
799
+
800
+ * [HexaPDF::Layout::TextLayouter#fit] to split text fragment into parts if the
801
+ fragment doesn't fit on an empty line
802
+ * Parsing of PDF files containing a loop with respect to cross-reference tables
803
+ * [HexaPDF::Layout::InlineBox] to act as placeholder if no drawing block is
804
+ given
805
+ * Undefined method error in [HexaPDF::Content::Canvas] by raising a proper error
806
+ * Invalid handling of fonts by [HexaPDF::Content::Canvas] when saving and
807
+ restoring the graphics state
808
+ * [HexaPDF::Layout::TextLayouter] so that text fragments don't pollute the
809
+ graphics state
810
+ * [HexaPDF::Content::Operator::SetTextRenderingMode] to normalize the value
811
+ * [HexaPDF::Stream#stream_source] to always return a decrypted stream
812
+ * [HexaPDF::Layout::TextLayouter] to correctly indent all paragraphs, not just
813
+ the first one
814
+ * One-off error in [HexaPDF::Filter::LZWDecode]
815
+ * [HexaPDF::Configuration#merge] to duplicate array values to avoid unwanted
816
+ modifications
817
+ * [HexaPDF::Dictionary#key?] to return false if the key is present but nil
818
+ * [HexaPDF::DictionaryFields::FileSpecificationConverter] to convert hash and
819
+ dictionaries
820
+ * Field /F definition in [HexaPDF::Stream]
821
+
822
+
823
+ ## 0.5.0 - 2017-06-24
824
+
825
+ ### Added
826
+
827
+ * HexaPDF::Layout::TextBox for easy positioning and layouting of text
828
+ * HexaPDF::Layout::LineFragment for single text line layout calculations
829
+ * [HexaPDF::Layout::TextShaper] for text shaping functionality
830
+ * [HexaPDF::Layout::TextFragment] for basic text metrics calculations
831
+ * [HexaPDF::Layout::InlineBox] for fixed size inline graphics
832
+ * [HexaPDF::Layout::Style] as container for text and graphics styling properties
833
+ * Support for kerning of TrueType fonts via the 'kern' table
834
+ * Support for determining the features provided by a font
835
+
836
+ ### Changed
837
+
838
+ * Handling of invalid glyphs is done using the special
839
+ [HexaPDF::Font::InvalidGlyph] class
840
+ * Configuration option 'font.on_missing_glyph'; returns an invalid glyph
841
+ instead of raising an error
842
+ * Bounding box of TrueType glyphs without contours is set to `[0, 0, 0, 0]`
843
+ * Ligature pairs for AFM fonts are stored like kerning pairs
844
+ * Use TrueType configuration option 'font.true_type.unknown_format' in all
845
+ places where applicable
846
+ * Allow passing a font object to [HexaPDF::Content::Canvas#font]
847
+ * Handle invalid entry in TrueType format 4 cmap subtable encountered in the
848
+ wild gracefully
849
+ * Invalid positive descent values in font descriptors are now changed into
850
+ negative ones by the validation feature
851
+ * Allow specifying the page media box or a page format when adding a new page
852
+ through [HexaPDF::Document::Pages#add]
853
+
854
+ ### Fixed
855
+
856
+ * [HexaPDF::Task::Dereference] to work correctly when encountering invalid
857
+ references
858
+ * [HexaPDF::Tokenizer] and HexaPDF::Content::Tokenizer to parse a solitary
859
+ plus sign
860
+ * Usage of Strings instead of Symbols for AFM font kerning and ligature pairs
861
+ * Processing the contents of form XObjects in case they don't have a resources
862
+ dictionary
863
+ * Deletion of valid page node when optimizing page trees with the `hexapdf
864
+ optimize` command
865
+ * [HexaPDF::Type::FontType0] to always wrap the descendant font even if it is a
866
+ direct object
867
+
868
+
869
+ ## 0.4.0 - 2017-03-19
870
+
871
+ ### Added
872
+
873
+ * [HexaPDF::Type::FontType0] and [HexaPDF::Type::CIDFont] for composite font
874
+ support
875
+ * Complete support for CMaps for use with composite fonts; the interface for
876
+ [HexaPDF::Font::CMap] changed to accomodate this
877
+ * CLI command `hexapdf batch` for batch execution of a single command for
878
+ multiple input files
879
+ * CLI option `--verbose` for more verbose output; also changed the default
880
+ verbosity level to only display warnings and not informational messages
881
+ * CLI option `--quiet` for suppressing additional and diagnostic output
882
+ * CLI option `--strict` for enabling strict parsing and validation; also
883
+ changed the default from strict to non-strict parsing/validation
884
+ * CLI optimization option `--optimize-fonts` for optimizing embedded fonts
885
+ * Method `#word_spacing_applicable?` to font types
886
+ * Support for marked-content points and sequences in [HexaPDF::Content::Canvas]
887
+ * Support for property lists in a page's resource dictionary
888
+ * Show file name and size in `hexapdf info` output
889
+ * [HexaPDF::Type::Font#font_file] for getting the embedded font file
890
+ * [HexaPDF::Font::TrueType::Optimizer] for optimizing TrueType fonts
891
+ * Configuration option 'filter.flate_memory' for configuring memory use of the
892
+ [HexaPDF::Filter::FlateDecode] filter
893
+ * Method [HexaPDF::Content::Canvas#show_glyphs_only] for faster glyph showing
894
+ without text matrix calculations
895
+ * Methods for caching expensive computations of PDF objects
896
+ ([HexaPDF::Document#cache] and others)
897
+
898
+ ### Changed
899
+
900
+ * Enabled in-place processing of PDF files for all CLI commands
901
+ * Show warning instead of exiting when extracting images with `hexapdf images`
902
+ and an image format is not supported
903
+ * Handling of character code to Unicode mapping:
904
+ - [HexaPDF::Font::CMap#to_unicode], [HexaPDF::Font::Encoding::Base#unicode]
905
+ and [HexaPDF::Font::Encoding::GlyphList#name_to_unicode] return `nil`
906
+ instead of an empty string
907
+ - Font dictionaries use the new configuration option
908
+ 'font.on_missing_unicode_mapping' in their `#to_utf8` method
909
+ * [HexaPDF::Configuration#constantize] to raise error if constant is not found
910
+ * Extracted TrueType font file building code into new module
911
+ [HexaPDF::Font::TrueType::Builder]
912
+ * [HexaPDF::Filter::FlateDecode] filter to use pools of Zlib inflaters and
913
+ deflaters to conserve memory
914
+
915
+ ### Fixed
916
+
917
+ * Use of wrong glyph IDs for glyph width entries and unicode mapping for subset
918
+ TrueType fonts
919
+ * Invalid document reference when importing wrapped direct objects with
920
+ [HexaPDF::Importer]
921
+ * Invalid type of /DW key in CIDFont dictionary when embedding TrueType fonts
922
+ * Caching problem in [HexaPDF::Document::Fonts] which lead to multiple instances
923
+ of the same font
924
+ * Bug in handling of word spacing with respect to offset calculations when
925
+ showing or extracting text
926
+ * Incorrect handling of page rotation values in `hexapdf merge`
927
+ * Missing handling of certain rotation values in `hexapdf modify`
928
+ * Removal of unused pages in `hexapdf modify`
929
+ * Handling of invalid page numbers in CLI commands
930
+ * Useless multiple extraction of the same image in `hexapdf images`
931
+ * Type of /VP entry of [HexaPDF::Type::Page]
932
+ * Parsing of inline images that contain the end-of-image marker
933
+ * High memory usage due to not closing `Zlib::Stream` objects in
934
+ [HexaPDF::Filter::FlateDecode]
935
+
936
+
937
+ ## 0.3.0 - 2017-01-25
938
+
939
+ ### Added
940
+
941
+ * TrueType font subsetting support
942
+ * Image extraction ability to CLI via `hexapdf images` command
943
+ * [HexaPDF::Type::Image#write] for writing an image XObject to an IO stream or
944
+ file
945
+ * [HexaPDF::Type::Image#info] for getting image properties of an image XObject
946
+ * CLI option `--[no-]force` to force overwriting existing files
947
+
948
+ ### Changed
949
+
950
+ * Refactor `hexapdf modify` command into three individual commands `modify`,
951
+ `merge` and `optimize`
952
+ * Rename `hexapdf extract` to `hexapdf files` and the option `--indices` to
953
+ `--extract`
954
+ * Show PDF trailer by default with `hexapdf inspect`
955
+ * Refactor CLI command classes to use specialized superclass
956
+ [HexaPDF::CLI::Command]
957
+ * Optimize parsing of PDF files for better performance and memory efficiency
958
+
959
+ ### Fixed
960
+
961
+ * Writing of hybrid-reference PDF files - they are written as standard PDF files
962
+ since all current applications should be able to handle PDF 1.5
963
+ * Serialization of self-referential, indirect PDF objects
964
+ * Performance problem for `hexapdf inspect --pages` when inspecting huge files
965
+ * TrueType compound glyph component offset calculation
966
+ * Parsing of TrueType data type 'fixed'
967
+ * Updating a PDF trailer's ID field when it isn't an array
968
+
969
+ ## 0.2.0 - 2016-11-28
970
+
971
+ ### Added
972
+
973
+ * PDF file merge ability to `hexapdf modify`, i.e. adding pages from other PDFs
974
+ * Page interleaving support to 'hexapdf modify'
975
+ * Step values in pages definitions for CLI commands
976
+ * Convenience class for working with pages through [HexaPDF::Document#pages]
977
+ with a more Ruby-like interface
978
+ * Method [HexaPDF::Type::Form#canvas]
979
+ * Method [HexaPDF::Type::Page#index]
980
+ * Validation for [HexaPDF::Rectangle] objects
981
+ * [HexaPDF::Font::Type1::FontMetrics#weight_class] for returning the numeric
982
+ weight
983
+
984
+ ### Changed
985
+
986
+ * Refactor document utilities into own classes with a more Ruby-like interface;
987
+ concern fonts, images and files, now accessible through
988
+ [HexaPDF::Document#fonts], [HexaPDF::Document#images] and
989
+ [HexaPDF::Document#files]
990
+ * Validate nested collection values in [HexaPDF::Object]
991
+ * Allow [HexaPDF::Dictionary#[]] to always unwrap nil values
992
+ * Update [HexaPDF::Task::Optimize] to delete unused objects on `:compact`
993
+ * Allow [HexaPDF::Type::PageTreeNode#delete_page] to take a page object or a
994
+ page index
995
+ * Don't set /EFF key in encryption dictionary
996
+ * Better error handling for hexapdf CLI commands
997
+ * Show help output when no command is given for `hexapdf` CLI
998
+ * Set /FontWeight in [HexaPDF::Font::Type1Wrapper]
999
+ * Use kramdown's man page support for the `hexapdf` man page instead of ronn
1000
+
1001
+ ### Removed
1002
+
1003
+ * Remove unneeded parts of TrueType implementation
1004
+
1005
+ ### Fixed
1006
+
1007
+ * Problem with unnamed classes/modules on serialization
1008
+ * Handle potentially indirect objects correctly in [HexaPDF::Object::deep_copy]
1009
+ * [HexaPDF::Revisions#merge] for objects that appear in multiple revisions
1010
+ * Output of `--pages` option of 'hexapdf inspect' command
1011
+ * Infinite recursion problem in [HexaPDF::Task::Dereference]
1012
+ * Problem with iteration over images in certain cases
1013
+ * [HexaPDF::Type::Page#[]] with respect to inherited fields
1014
+ * Problems with access permissions on encryption
1015
+ * Encryption routine of standard security handler with respect to owner password
1016
+ * Invalid check in validation of standard encryption dictionary
1017
+ * 'hexapdf modify' command to support files with many pages
1018
+ * Validation of encryption key for encryption revision 6
1019
+ * Various parts of the API documentation
1020
+
1021
+
1022
+ ## 0.1.0 - 2016-10-26
1023
+
1024
+ * Initial release