hexapdf 0.17.1 → 0.17.2

Sign up to get free protection for your applications and to get access to all the features.
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