hexapdf 0.11.7 → 0.12.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 +121 -0
  3. data/LICENSE +1 -1
  4. data/examples/001-hello_world.rb +1 -1
  5. data/examples/002-graphics.rb +1 -1
  6. data/examples/003-arcs.rb +1 -1
  7. data/examples/004-optimizing.rb +1 -1
  8. data/examples/005-merging.rb +1 -1
  9. data/examples/006-standard_pdf_fonts.rb +1 -1
  10. data/examples/007-truetype.rb +1 -1
  11. data/examples/008-show_char_bboxes.rb +1 -1
  12. data/examples/009-text_layouter_alignment.rb +1 -1
  13. data/examples/010-text_layouter_inline_boxes.rb +1 -1
  14. data/examples/011-text_layouter_line_wrapping.rb +1 -1
  15. data/examples/012-text_layouter_styling.rb +1 -1
  16. data/examples/013-text_layouter_shapes.rb +1 -1
  17. data/examples/014-text_in_polygon.rb +1 -1
  18. data/examples/015-boxes.rb +1 -1
  19. data/examples/016-frame_automatic_box_placement.rb +1 -1
  20. data/examples/017-frame_text_flow.rb +1 -1
  21. data/examples/018-composer.rb +1 -1
  22. data/examples/019-acro_form.rb +51 -0
  23. data/lib/hexapdf.rb +1 -1
  24. data/lib/hexapdf/cli.rb +3 -1
  25. data/lib/hexapdf/cli/batch.rb +1 -1
  26. data/lib/hexapdf/cli/command.rb +18 -9
  27. data/lib/hexapdf/cli/files.rb +1 -1
  28. data/lib/hexapdf/cli/form.rb +240 -0
  29. data/lib/hexapdf/cli/image2pdf.rb +1 -1
  30. data/lib/hexapdf/cli/images.rb +1 -1
  31. data/lib/hexapdf/cli/info.rb +1 -1
  32. data/lib/hexapdf/cli/inspect.rb +1 -1
  33. data/lib/hexapdf/cli/merge.rb +1 -1
  34. data/lib/hexapdf/cli/modify.rb +1 -1
  35. data/lib/hexapdf/cli/optimize.rb +1 -1
  36. data/lib/hexapdf/cli/split.rb +1 -1
  37. data/lib/hexapdf/cli/watermark.rb +1 -1
  38. data/lib/hexapdf/composer.rb +2 -2
  39. data/lib/hexapdf/configuration.rb +66 -11
  40. data/lib/hexapdf/content.rb +3 -1
  41. data/lib/hexapdf/content/canvas.rb +5 -18
  42. data/lib/hexapdf/content/color_space.rb +111 -32
  43. data/lib/hexapdf/content/graphic_object.rb +1 -1
  44. data/lib/hexapdf/content/graphic_object/arc.rb +1 -1
  45. data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +1 -1
  46. data/lib/hexapdf/content/graphic_object/geom2d.rb +1 -1
  47. data/lib/hexapdf/content/graphic_object/solid_arc.rb +1 -1
  48. data/lib/hexapdf/content/graphics_state.rb +1 -1
  49. data/lib/hexapdf/content/operator.rb +9 -9
  50. data/lib/hexapdf/content/parser.rb +18 -5
  51. data/lib/hexapdf/content/processor.rb +1 -1
  52. data/lib/hexapdf/content/transformation_matrix.rb +1 -1
  53. data/lib/hexapdf/data_dir.rb +1 -1
  54. data/lib/hexapdf/dictionary.rb +1 -1
  55. data/lib/hexapdf/dictionary_fields.rb +1 -1
  56. data/lib/hexapdf/document.rb +14 -5
  57. data/lib/hexapdf/document/files.rb +1 -1
  58. data/lib/hexapdf/document/fonts.rb +1 -1
  59. data/lib/hexapdf/document/images.rb +1 -1
  60. data/lib/hexapdf/document/pages.rb +3 -14
  61. data/lib/hexapdf/encryption.rb +1 -1
  62. data/lib/hexapdf/encryption/aes.rb +1 -1
  63. data/lib/hexapdf/encryption/arc4.rb +1 -1
  64. data/lib/hexapdf/encryption/fast_aes.rb +1 -1
  65. data/lib/hexapdf/encryption/fast_arc4.rb +1 -1
  66. data/lib/hexapdf/encryption/identity.rb +1 -1
  67. data/lib/hexapdf/encryption/ruby_aes.rb +1 -1
  68. data/lib/hexapdf/encryption/ruby_arc4.rb +1 -1
  69. data/lib/hexapdf/encryption/security_handler.rb +7 -1
  70. data/lib/hexapdf/encryption/standard_security_handler.rb +1 -1
  71. data/lib/hexapdf/error.rb +1 -1
  72. data/lib/hexapdf/filter.rb +3 -3
  73. data/lib/hexapdf/filter/ascii85_decode.rb +1 -1
  74. data/lib/hexapdf/filter/ascii_hex_decode.rb +1 -1
  75. data/lib/hexapdf/filter/encryption.rb +1 -1
  76. data/lib/hexapdf/filter/flate_decode.rb +1 -1
  77. data/lib/hexapdf/filter/lzw_decode.rb +1 -1
  78. data/lib/hexapdf/filter/{jpx_decode.rb → pass_through.rb} +5 -5
  79. data/lib/hexapdf/filter/predictor.rb +1 -1
  80. data/lib/hexapdf/filter/run_length_decode.rb +1 -1
  81. data/lib/hexapdf/font/cmap.rb +1 -1
  82. data/lib/hexapdf/font/cmap/parser.rb +1 -1
  83. data/lib/hexapdf/font/cmap/writer.rb +1 -1
  84. data/lib/hexapdf/font/encoding.rb +1 -1
  85. data/lib/hexapdf/font/encoding/base.rb +9 -1
  86. data/lib/hexapdf/font/encoding/difference_encoding.rb +7 -1
  87. data/lib/hexapdf/font/encoding/glyph_list.rb +1 -1
  88. data/lib/hexapdf/font/encoding/mac_expert_encoding.rb +1 -1
  89. data/lib/hexapdf/font/encoding/mac_roman_encoding.rb +1 -1
  90. data/lib/hexapdf/font/encoding/standard_encoding.rb +1 -1
  91. data/lib/hexapdf/font/encoding/symbol_encoding.rb +1 -1
  92. data/lib/hexapdf/font/encoding/win_ansi_encoding.rb +1 -1
  93. data/lib/hexapdf/font/encoding/zapf_dingbats_encoding.rb +1 -1
  94. data/lib/hexapdf/font/invalid_glyph.rb +1 -1
  95. data/lib/hexapdf/font/true_type.rb +1 -1
  96. data/lib/hexapdf/font/true_type/builder.rb +1 -1
  97. data/lib/hexapdf/font/true_type/font.rb +1 -1
  98. data/lib/hexapdf/font/true_type/optimizer.rb +1 -1
  99. data/lib/hexapdf/font/true_type/subsetter.rb +1 -1
  100. data/lib/hexapdf/font/true_type/table.rb +1 -1
  101. data/lib/hexapdf/font/true_type/table/cmap.rb +1 -1
  102. data/lib/hexapdf/font/true_type/table/cmap_subtable.rb +1 -1
  103. data/lib/hexapdf/font/true_type/table/directory.rb +1 -1
  104. data/lib/hexapdf/font/true_type/table/glyf.rb +1 -1
  105. data/lib/hexapdf/font/true_type/table/head.rb +1 -1
  106. data/lib/hexapdf/font/true_type/table/hhea.rb +1 -1
  107. data/lib/hexapdf/font/true_type/table/hmtx.rb +1 -1
  108. data/lib/hexapdf/font/true_type/table/kern.rb +1 -1
  109. data/lib/hexapdf/font/true_type/table/loca.rb +1 -1
  110. data/lib/hexapdf/font/true_type/table/maxp.rb +1 -1
  111. data/lib/hexapdf/font/true_type/table/name.rb +1 -1
  112. data/lib/hexapdf/font/true_type/table/os2.rb +1 -1
  113. data/lib/hexapdf/font/true_type/table/post.rb +1 -1
  114. data/lib/hexapdf/font/true_type_wrapper.rb +54 -51
  115. data/lib/hexapdf/font/type1.rb +1 -1
  116. data/lib/hexapdf/font/type1/afm_parser.rb +1 -1
  117. data/lib/hexapdf/font/type1/character_metrics.rb +1 -1
  118. data/lib/hexapdf/font/type1/font.rb +1 -1
  119. data/lib/hexapdf/font/type1/font_metrics.rb +1 -1
  120. data/lib/hexapdf/font/type1/pfb_parser.rb +1 -1
  121. data/lib/hexapdf/font/type1_wrapper.rb +68 -52
  122. data/lib/hexapdf/font_loader.rb +1 -1
  123. data/lib/hexapdf/font_loader/from_configuration.rb +1 -1
  124. data/lib/hexapdf/font_loader/from_file.rb +1 -1
  125. data/lib/hexapdf/font_loader/standard14.rb +1 -1
  126. data/lib/hexapdf/image_loader.rb +1 -1
  127. data/lib/hexapdf/image_loader/jpeg.rb +1 -1
  128. data/lib/hexapdf/image_loader/pdf.rb +1 -1
  129. data/lib/hexapdf/image_loader/png.rb +1 -1
  130. data/lib/hexapdf/importer.rb +2 -4
  131. data/lib/hexapdf/layout.rb +1 -1
  132. data/lib/hexapdf/layout/box.rb +1 -1
  133. data/lib/hexapdf/layout/frame.rb +1 -1
  134. data/lib/hexapdf/layout/image_box.rb +1 -1
  135. data/lib/hexapdf/layout/inline_box.rb +1 -1
  136. data/lib/hexapdf/layout/line.rb +1 -1
  137. data/lib/hexapdf/layout/numeric_refinements.rb +1 -1
  138. data/lib/hexapdf/layout/style.rb +1 -1
  139. data/lib/hexapdf/layout/text_box.rb +1 -1
  140. data/lib/hexapdf/layout/text_fragment.rb +1 -1
  141. data/lib/hexapdf/layout/text_layouter.rb +1 -1
  142. data/lib/hexapdf/layout/text_shaper.rb +1 -1
  143. data/lib/hexapdf/layout/width_from_polygon.rb +1 -1
  144. data/lib/hexapdf/name_tree_node.rb +1 -1
  145. data/lib/hexapdf/number_tree_node.rb +1 -1
  146. data/lib/hexapdf/object.rb +2 -2
  147. data/lib/hexapdf/parser.rb +4 -3
  148. data/lib/hexapdf/pdf_array.rb +1 -1
  149. data/lib/hexapdf/rectangle.rb +31 -1
  150. data/lib/hexapdf/reference.rb +1 -1
  151. data/lib/hexapdf/revision.rb +2 -1
  152. data/lib/hexapdf/revisions.rb +1 -1
  153. data/lib/hexapdf/serializer.rb +2 -2
  154. data/lib/hexapdf/stream.rb +1 -1
  155. data/lib/hexapdf/task.rb +1 -1
  156. data/lib/hexapdf/task/dereference.rb +1 -1
  157. data/lib/hexapdf/task/optimize.rb +1 -1
  158. data/lib/hexapdf/tokenizer.rb +1 -1
  159. data/lib/hexapdf/type.rb +1 -1
  160. data/lib/hexapdf/type/acro_form.rb +7 -1
  161. data/lib/hexapdf/type/acro_form/appearance_generator.rb +401 -0
  162. data/lib/hexapdf/type/acro_form/button_field.rb +300 -0
  163. data/lib/hexapdf/type/acro_form/choice_field.rb +220 -0
  164. data/lib/hexapdf/type/acro_form/field.rb +220 -17
  165. data/lib/hexapdf/type/acro_form/form.rb +157 -7
  166. data/lib/hexapdf/type/acro_form/text_field.rb +186 -0
  167. data/lib/hexapdf/type/acro_form/variable_text_field.rb +122 -0
  168. data/lib/hexapdf/type/action.rb +1 -1
  169. data/lib/hexapdf/type/actions.rb +1 -1
  170. data/lib/hexapdf/type/actions/go_to.rb +1 -1
  171. data/lib/hexapdf/type/actions/go_to_r.rb +1 -1
  172. data/lib/hexapdf/type/actions/launch.rb +1 -1
  173. data/lib/hexapdf/type/actions/uri.rb +1 -1
  174. data/lib/hexapdf/type/annotation.rb +73 -3
  175. data/lib/hexapdf/type/annotations.rb +1 -1
  176. data/lib/hexapdf/type/annotations/link.rb +2 -2
  177. data/lib/hexapdf/type/annotations/markup_annotation.rb +1 -1
  178. data/lib/hexapdf/type/annotations/text.rb +1 -1
  179. data/lib/hexapdf/type/annotations/widget.rb +239 -2
  180. data/lib/hexapdf/type/catalog.rb +21 -1
  181. data/lib/hexapdf/type/cid_font.rb +1 -1
  182. data/lib/hexapdf/type/embedded_file.rb +1 -1
  183. data/lib/hexapdf/type/file_specification.rb +1 -1
  184. data/lib/hexapdf/type/font.rb +18 -1
  185. data/lib/hexapdf/type/font_descriptor.rb +2 -2
  186. data/lib/hexapdf/type/font_simple.rb +1 -1
  187. data/lib/hexapdf/type/font_true_type.rb +1 -1
  188. data/lib/hexapdf/type/font_type0.rb +1 -1
  189. data/lib/hexapdf/type/font_type1.rb +16 -1
  190. data/lib/hexapdf/type/font_type3.rb +1 -1
  191. data/lib/hexapdf/type/form.rb +10 -1
  192. data/lib/hexapdf/type/graphics_state_parameter.rb +1 -1
  193. data/lib/hexapdf/type/icon_fit.rb +1 -1
  194. data/lib/hexapdf/type/image.rb +3 -1
  195. data/lib/hexapdf/type/info.rb +1 -1
  196. data/lib/hexapdf/type/names.rb +1 -1
  197. data/lib/hexapdf/type/object_stream.rb +1 -1
  198. data/lib/hexapdf/type/page.rb +20 -5
  199. data/lib/hexapdf/type/page_tree_node.rb +8 -11
  200. data/lib/hexapdf/type/resources.rb +16 -3
  201. data/lib/hexapdf/type/trailer.rb +2 -3
  202. data/lib/hexapdf/type/viewer_preferences.rb +1 -1
  203. data/lib/hexapdf/type/xref_stream.rb +1 -1
  204. data/lib/hexapdf/utils/bit_field.rb +38 -24
  205. data/lib/hexapdf/utils/bit_stream.rb +1 -1
  206. data/lib/hexapdf/utils/graphics_helpers.rb +1 -1
  207. data/lib/hexapdf/utils/lru_cache.rb +1 -1
  208. data/lib/hexapdf/utils/math_helpers.rb +1 -1
  209. data/lib/hexapdf/utils/object_hash.rb +1 -1
  210. data/lib/hexapdf/utils/pdf_doc_encoding.rb +1 -1
  211. data/lib/hexapdf/utils/sorted_tree_node.rb +1 -1
  212. data/lib/hexapdf/version.rb +2 -2
  213. data/lib/hexapdf/writer.rb +1 -1
  214. data/lib/hexapdf/xref_section.rb +1 -1
  215. data/test/hexapdf/content/common.rb +2 -2
  216. data/test/hexapdf/content/test_color_space.rb +71 -8
  217. data/test/hexapdf/content/test_operator.rb +22 -22
  218. data/test/hexapdf/content/test_parser.rb +14 -0
  219. data/test/hexapdf/document/test_fonts.rb +1 -1
  220. data/test/hexapdf/document/test_pages.rb +6 -6
  221. data/test/hexapdf/encryption/test_security_handler.rb +4 -0
  222. data/test/hexapdf/font/encoding/test_base.rb +10 -0
  223. data/test/hexapdf/font/encoding/test_difference_encoding.rb +8 -0
  224. data/test/hexapdf/font/test_true_type_wrapper.rb +10 -7
  225. data/test/hexapdf/font/test_type1_wrapper.rb +33 -8
  226. data/test/hexapdf/layout/test_style.rb +1 -1
  227. data/test/hexapdf/test_document.rb +12 -0
  228. data/test/hexapdf/test_parser.rb +10 -0
  229. data/test/hexapdf/test_rectangle.rb +14 -0
  230. data/test/hexapdf/test_revision.rb +3 -0
  231. data/test/hexapdf/test_serializer.rb +3 -3
  232. data/test/hexapdf/test_writer.rb +2 -2
  233. data/test/hexapdf/type/acro_form/test_appearance_generator.rb +515 -0
  234. data/test/hexapdf/type/acro_form/test_button_field.rb +276 -0
  235. data/test/hexapdf/type/acro_form/test_choice_field.rb +137 -0
  236. data/test/hexapdf/type/acro_form/test_field.rb +124 -6
  237. data/test/hexapdf/type/acro_form/test_form.rb +189 -22
  238. data/test/hexapdf/type/acro_form/test_text_field.rb +119 -0
  239. data/test/hexapdf/type/acro_form/test_variable_text_field.rb +77 -0
  240. data/test/hexapdf/type/annotations/test_text.rb +1 -1
  241. data/test/hexapdf/type/annotations/test_widget.rb +199 -0
  242. data/test/hexapdf/type/test_annotation.rb +45 -0
  243. data/test/hexapdf/type/test_catalog.rb +18 -0
  244. data/test/hexapdf/type/test_font.rb +5 -0
  245. data/test/hexapdf/type/test_font_type1.rb +8 -0
  246. data/test/hexapdf/type/test_form.rb +18 -0
  247. data/test/hexapdf/type/test_image.rb +7 -0
  248. data/test/hexapdf/type/test_page.rb +37 -6
  249. data/test/hexapdf/type/test_page_tree_node.rb +20 -12
  250. data/test/hexapdf/type/test_resources.rb +20 -0
  251. data/test/hexapdf/type/test_trailer.rb +4 -0
  252. data/test/hexapdf/utils/test_bit_field.rb +13 -1
  253. data/test/test_helper.rb +1 -1
  254. metadata +38 -18
  255. data/lib/hexapdf/filter/dct_decode.rb +0 -60
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 569e36409af92892e51daffa031686bc87db46bc846933ddb9f47c415fccfd3f
4
- data.tar.gz: 88ad0152b80467b2f7936e2431b24091b8fa799b51094efcbfb467af04fb468e
3
+ metadata.gz: d95e6e2abba7581aab78e449bf860c3955170d4c266850373296300495236c44
4
+ data.tar.gz: '0950af72d8864e98a70367ee28bdf09bc09aa83cace38933aa613bc8d476263d'
5
5
  SHA512:
6
- metadata.gz: d49c7ae6f7bb2d17cf3124a10043b50d451e832f64fbf9cd6d852e00d00a6eb0fb47fedb624f97629404f5509b6126d4fdf04265164416adbb2020075b0dafd9
7
- data.tar.gz: 2fa2a590c07c7e286ab4b57bd110618bab7b3e4f6bfbb00906c1df53e3314f23536644652ba6a143802ca2bc331bd8f1ffa58ee4fbda884ae020c9b517b7f652
6
+ metadata.gz: c3c4ad1073d3ea9b820dc129348cf2d571159ea129aa65a10546552ae52e19cf29d74a4716e3fcefac10b34f9d2ad7e833bb90355c81564a152c853e0a406ea4
7
+ data.tar.gz: 637e17817d1aa8eb3b75035aa5d654f5bdbd7b531fb16776da49945c5100ab0705ab7d59b300f192b865d75ded43edae48d2f15541c2a93edbdedba9318f896a
@@ -1,3 +1,123 @@
1
+ ## 0.12.2 - 2020-08-17
2
+
3
+ ### Fixed
4
+
5
+ - Wrong origin for page canvases when bottom left corner of media box doesn't
6
+ coincide with origin of coordinate system
7
+ - Wrong origin for Form XObject canvas when bottom left corner of bounding box
8
+ doesn't coincide with origin of coordinate system
9
+
10
+
11
+ ## 0.12.1 - 2020-08-16
12
+
13
+ ### Added
14
+
15
+ * [HexaPDF::Font::Encoding::Base#code] for retrieving the code for a given
16
+ glyph name
17
+
18
+ ### Fixed
19
+
20
+ * [HexaPDF::Font::Type1Wrapper#encode] to correctly resolve the code for a glyph
21
+ name
22
+
23
+
24
+ ## 0.12.0 - 2020-08-12
25
+
26
+ ### Added
27
+
28
+ * Convenience methods for accessing field flags for
29
+ [HexaPDF::Type::AcroForm::Field]
30
+ * [HexaPDF::Type::AcroForm::TextField] and
31
+ [HexaPDF::Type::AcroForm::VariableTextField] for basic text field support
32
+ * [HexaPDF::Type::AcroForm::ButtonField] for push button, radio button and
33
+ check box support
34
+ * [HexaPDF::Type::AcroForm::ChoiceField] for combo box and list box support
35
+ * [HexaPDF::Type::AcroForm::AppearanceGenerator] as central class for
36
+ generating appearance streams for form fields
37
+ * Various convenience methods for [HexaPDF::Type::AcroForm::Form]
38
+ * Various convenience methods for [HexaPDF::Type::AcroForm::Field]
39
+ * Various convenience methods for [HexaPDF::Type::Annotations::Widget]
40
+ * [HexaPDF::Type::Annotation::AppearanceDictionary]
41
+ * [HexaPDF::Document#acro_form] and [HexaPDF::Type::Catalog#acro_form]
42
+ convenience methods
43
+ * CLI command `hexapdf form` for listing fields of interactive forms and filling
44
+ them out
45
+ * [HexaPDF::Rectangle] methods for setting the left, top, right, bottom, width
46
+ and height
47
+ * Method #prenormalized_color to all color space implementations
48
+ * [HexaPDF::Type::Font#font_wrapper] for accessing an associated font wrapper
49
+ instance
50
+ * [HexaPDF::Type::FontType1#font_wrapper] for providing a font wrapper for the
51
+ standard PDF fonts
52
+ * [HexaPDF::Type::Annotation::Border] class
53
+ * [HexaPDF::Content::ColorSpace::device_color_from_specification] for easily
54
+ getting a device color object
55
+ * [HexaPDF::Content::ColorSpace::prenormalized_device_color] for getting a device
56
+ color object without normalizing values
57
+ * [HexaPDF::Type::Annotation#appearance] for returning the associated appearance
58
+ dictionary
59
+ * [HexaPDF::Type::Annotation#appearance?] for checking whether an appearance for
60
+ the annotation exists
61
+ * Configuration option 'acro_form.create_appearance_streams' for automatically
62
+ creating appearance streams
63
+ * [HexaPDF::Type::Resources] methods `#pattern` and `add_pattern`
64
+
65
+ ### Changed
66
+
67
+ * Deletion of pages to delete them from the document as well
68
+ * Refactored [HexaPDF::Font::Type1Wrapper] and [HexaPDF::Font::TrueTypeWrapper]
69
+ and renamed `#dict` to `#pdf_object`
70
+ * Fall back to the Type1 font's internal encoding when decoding a string
71
+ * All [HexaPDF::Content::ColorSpace] implementations to only normalize values
72
+ when using the ::color method
73
+ * [HexaPDF::Content::Parser#parse] to also accept a block in place of a
74
+ processor object
75
+ * HexaPDF::Type::AcroForm::Field#full_name to
76
+ [HexaPDF::Type::AcroForm::Field#full_field_name]
77
+ * Moved `HexaPDF::Content::Canvas#color_space_for_components` to class method on
78
+ [HexaPDF::Content::ColorSpace]
79
+ * Added bit unsetter method to[HexaPDF::Utils::BitField]
80
+ * [HexaPDF::Type::AcroForm::Form#find_root_fields] and `#each_field` to take the
81
+ field type into account when wrapping a field dictionary
82
+ * Pages specification of CLI commands to allow counting from the end using the
83
+ new `r<N>` notation
84
+ * [HexaPDF::Font::Type1Wrapper] to use the internal encoding of a font with a
85
+ 'Special' character set instead of a custom encoding
86
+ * Configuration 'filter.map' to use the pass-through filter on all unsupported
87
+ filters
88
+
89
+ ### Fixed
90
+
91
+ * Wrong normalization of color values when invoking a color operator
92
+ * Invalid type of `/DR` field of [HexaPDF::Type::AcroForm::Form]
93
+ * Invalid ordering of types for the `/V` and `/DV` fields of
94
+ [HexaPDF::Type::AcroForm::Field]
95
+ * [HexaPDF::Type::AcroForm::Field#terminal_field?] to work according to the spec
96
+ * Handling of empty files by throwing better error messages
97
+ * [HexaPDF::Type::Image#info] to correctly identify images with a soft mask as
98
+ currently not supported for writing
99
+ * [HexaPDF::Revision#delete] to remove the connection between the object and the
100
+ document
101
+ * Missing `#definition` method of `DeviceRGB`, `DeviceCMYK` and `DeviceGray`
102
+ color spaces
103
+ * Handling of 'Pattern' color spaces when parsing content streams
104
+
105
+
106
+ ## 0.11.9 - 2020-06-15
107
+
108
+ ### Changed
109
+
110
+ * Encryption dictionaries to always be indirect objects
111
+
112
+
113
+ ## 0.11.8 - 2020-06-11
114
+
115
+ ### Fixed
116
+
117
+ * Serialization of special `/` (zero-length name) object in dictionaries and
118
+ arrays
119
+
120
+
1
121
  ## 0.11.7 - 2020-06-10
2
122
 
3
123
  ### Fixed
@@ -7,6 +127,7 @@
7
127
  * [HexaPDF::Task::Optimize] to work correctly when deleting object streams and
8
128
  generating xref streams
9
129
 
130
+
10
131
  ## 0.11.6 - 2020-05-27
11
132
 
12
133
  ### Fixed
data/LICENSE CHANGED
@@ -1,5 +1,5 @@
1
1
  HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
2
- Copyright (C) 2014-2019 Thomas Leitner
2
+ Copyright (C) 2014-2020 Thomas Leitner
3
3
 
4
4
  HexaPDF is free software: you can redistribute it and/or modify it
5
5
  under the terms of the GNU Affero General Public License version 3 as
@@ -1,4 +1,4 @@
1
- # ## Hello World
1
+ # # Hello World
2
2
  #
3
3
  # This simple example mimics the classic "hello world" examples from
4
4
  # programming languages.
@@ -1,4 +1,4 @@
1
- # ## Graphics Primitives
1
+ # # Graphics Primitives
2
2
  #
3
3
  # This example shows many of the operations that the canvas implementation
4
4
  # allows.
@@ -1,4 +1,4 @@
1
- # ## Arcs and Solid Arcs
1
+ # # Arcs and Solid Arcs
2
2
  #
3
3
  # This example shows how to use the graphic objects `:arc` and `:solid_arc` to
4
4
  # draw simple pie charts.
@@ -1,4 +1,4 @@
1
- # ## Optimizing a PDF File
1
+ # # Optimizing a PDF File
2
2
  #
3
3
  # This example shows how to read a PDF file, optimize it and write it
4
4
  # out again.
@@ -1,4 +1,4 @@
1
- # ## Merging PDF Files
1
+ # # Merging PDF Files
2
2
  #
3
3
  # Merging of PDF files can be done in various ways of sophistication.
4
4
  #
@@ -1,4 +1,4 @@
1
- # ## Standard PDF Fonts
1
+ # # Standard PDF Fonts
2
2
  #
3
3
  # This example shows all characters that are available in the standard 14 PDF
4
4
  # fonts.
@@ -1,4 +1,4 @@
1
- # ## TrueType Fonts
1
+ # # TrueType Fonts
2
2
  #
3
3
  # This example displays all glyphs of a TrueType font and shows that using a
4
4
  # TrueType font with HexaPDF is very similar to using one of the standard PDF
@@ -1,4 +1,4 @@
1
- # ## Show Character Bounding Boxes
1
+ # # Show Character Bounding Boxes
2
2
  #
3
3
  # This examples shows how to process the contents of a page. It finds all
4
4
  # characters on a page and surrounds them with their bounding box. Additionally,
@@ -1,4 +1,4 @@
1
- # ## Text Layouter - Alignment
1
+ # # Text Layouter - Alignment
2
2
  #
3
3
  # The [HexaPDF::Layout::TextLayouter] class can be used to easily lay out text
4
4
  # inside a rectangular area, with various horizontal and vertical alignment
@@ -1,4 +1,4 @@
1
- # ## Text Layouter - Inline Boxes
1
+ # # Text Layouter - Inline Boxes
2
2
  #
3
3
  # The [HexaPDF::Layout::TextLayouter] class can be used to easily lay out text
4
4
  # mixed with inline boxes.
@@ -1,4 +1,4 @@
1
- # ## Text Layouter - Line Wrapping
1
+ # # Text Layouter - Line Wrapping
2
2
  #
3
3
  # The [HexaPDF::Layout::TextLayouter] class can be used to easily lay out text,
4
4
  # automatically wrapping it appropriately.
@@ -1,4 +1,4 @@
1
- # ## Text Layouter - Styling
1
+ # # Text Layouter - Styling
2
2
  #
3
3
  # The text used as part of a [HexaPDF::Layout::TextLayouter] class can be styled
4
4
  # using [HexaPDF::Layout::Style]. To do this [HexaPDF::Layout::TextFragment]
@@ -1,4 +1,4 @@
1
- # ## Text Layouter - Shapes
1
+ # # Text Layouter - Shapes
2
2
  #
3
3
  # The [HexaPDF::Layout::TextLayouter] class can be used to easily lay out text,
4
4
  # not limiting the area to a rectangle but any shape. There is only one
@@ -1,4 +1,4 @@
1
- # ## Text in Polygon
1
+ # # Text in Polygon
2
2
  #
3
3
  # While creating width specifications for the [HexaPDF::Layout::TextLayouter]
4
4
  # class by hand is possible, the [HexaPDF::Layout::WidthFromPolygon] class
@@ -1,4 +1,4 @@
1
- # ## Boxes
1
+ # # Boxes
2
2
  #
3
3
  # The [HexaPDF::Layout::Box] class is used as the basis for all document layout
4
4
  # features.
@@ -1,4 +1,4 @@
1
- # ## Frame - Automatic Box Placement
1
+ # # Frame - Automatic Box Placement
2
2
  #
3
3
  # The [HexaPDF::Layout::Frame] class is used for placing rectangular boxes.
4
4
  #
@@ -1,4 +1,4 @@
1
- # ## Frame - Text Flow
1
+ # # Frame - Text Flow
2
2
  #
3
3
  # This example shows how [HexaPDF::Layout::Frame] and [HexaPDF::Layout::TextBox]
4
4
  # can be used to flow text around objects.
@@ -1,4 +1,4 @@
1
- # ## Composer
1
+ # # Composer
2
2
  #
3
3
  # This example shows how [HexaPDF::Composer] simplifies the creation of PDF
4
4
  # documents by providing a high-level interface to the box layouting engine.
@@ -0,0 +1,51 @@
1
+ # # PDF Forms
2
+ #
3
+ # PDF files can be used for interactive forms, containing various types of form
4
+ # fields. HexaPDF supports the creation and processing of these forms.
5
+ #
6
+ # This example show-cases how to create the various form field types and their
7
+ # possible standard appearances.
8
+ #
9
+ # Usage:
10
+ # : `ruby acro_form.rb`
11
+ #
12
+
13
+ require 'hexapdf'
14
+
15
+ doc = HexaPDF::Document.new
16
+ page = doc.pages.add
17
+ canvas = page.canvas
18
+
19
+ canvas.font("Helvetica", size: 36)
20
+ canvas.text("Form Example", at: [50, 750])
21
+ form = doc.acro_form(create: true)
22
+
23
+ canvas.font_size(16)
24
+ canvas.text("Check boxes", at: [50, 650])
25
+ [:check, :circle, :cross, :diamond, :square, :star].each_with_index do |symbol, index|
26
+ cb = form.create_check_box("Checkbox #{index}")
27
+ widget = cb.create_widget(page, Rect: [200 + 50 * index, 640, 240 + 50 * index, 680])
28
+ widget.background_color(1 - 0.05 * index)
29
+ widget.marker_style(style: symbol, color: [0.166 * index, 0, 1 - 0.166 * index],
30
+ size: 7 * index)
31
+ cb.field_value = true
32
+ end
33
+
34
+ canvas.text("Radio buttons", at: [50, 550])
35
+ rb = form.create_radio_button("Radio")
36
+ [:check, :circle, :cross, :diamond, :square, :star].each_with_index do |symbol, index|
37
+ widget = rb.create_widget(page, value: :"button#{index}",
38
+ Rect: [200 + 50 * index, 540, 240 + 50 * index, 580])
39
+ widget.background_color(1 - 0.05 * index)
40
+ widget.marker_style(style: symbol, color: [0.166 * index, 0, 1 - 0.166 * index],
41
+ size: 7 * index)
42
+ end
43
+ rb.field_value = :button0
44
+
45
+ canvas.text("Text field", at: [50, 450])
46
+ tx = form.create_text_field("Single Line")
47
+ widget = tx.create_widget(page, Rect: [200, 445, 500, 465])
48
+ tx.set_default_appearance_string(font_size: 16)
49
+ tx.field_value = "A sample test string!"
50
+
51
+ doc.write('acro_form.pdf', optimize: true)
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2019 Thomas Leitner
7
+ # Copyright (C) 2014-2020 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2019 Thomas Leitner
7
+ # Copyright (C) 2014-2020 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -46,6 +46,7 @@ require 'hexapdf/cli/batch'
46
46
  require 'hexapdf/cli/split'
47
47
  require 'hexapdf/cli/watermark'
48
48
  require 'hexapdf/cli/image2pdf'
49
+ require 'hexapdf/cli/form'
49
50
  require 'hexapdf/version'
50
51
  require 'hexapdf/document'
51
52
 
@@ -99,6 +100,7 @@ module HexaPDF
99
100
  add_command(HexaPDF::CLI::Split.new)
100
101
  add_command(HexaPDF::CLI::Watermark.new)
101
102
  add_command(HexaPDF::CLI::Image2PDF.new)
103
+ add_command(HexaPDF::CLI::Form.new)
102
104
  add_command(CmdParse::HelpCommand.new)
103
105
  version_command = CmdParse::VersionCommand.new(add_switches: false)
104
106
  add_command(version_command)
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2019 Thomas Leitner
7
+ # Copyright (C) 2014-2020 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -4,7 +4,7 @@
4
4
  # This file is part of HexaPDF.
5
5
  #
6
6
  # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
7
- # Copyright (C) 2014-2019 Thomas Leitner
7
+ # Copyright (C) 2014-2020 Thomas Leitner
8
8
  #
9
9
  # HexaPDF is free software: you can redistribute it and/or modify it
10
10
  # under the terms of the GNU Affero General Public License version 3 as
@@ -80,7 +80,7 @@ module HexaPDF
80
80
  # Creates a HexaPDF::Document instance for the PDF file and yields it.
81
81
  #
82
82
  # If +out_file+ is given, the document is written to it after yielding.
83
- def with_document(file, password: nil, out_file: nil) #:yield: document
83
+ def with_document(file, password: nil, out_file: nil, incremental: false) #:yield: document
84
84
  if file == out_file
85
85
  doc = HexaPDF::Document.open(file, **pdf_options(password))
86
86
  else
@@ -90,7 +90,7 @@ module HexaPDF
90
90
 
91
91
  yield(doc)
92
92
 
93
- write_document(doc, out_file)
93
+ write_document(doc, out_file, incremental: incremental)
94
94
  ensure
95
95
  file_io&.close
96
96
  end
@@ -116,7 +116,7 @@ module HexaPDF
116
116
  end
117
117
 
118
118
  # Writes the document to the given file or does nothing if +out_file+ is +nil+.
119
- def write_document(doc, out_file)
119
+ def write_document(doc, out_file, incremental: false)
120
120
  if out_file
121
121
  doc.validate(auto_correct: true) do |object, msg, correctable|
122
122
  if command_parser.strict && !correctable
@@ -126,7 +126,7 @@ module HexaPDF
126
126
  "for object (#{object.oid},#{object.gen}): #{msg}"
127
127
  end
128
128
  end
129
- doc.write(out_file, validate: false)
129
+ doc.write(out_file, validate: false, incremental: incremental)
130
130
  end
131
131
  end
132
132
 
@@ -289,7 +289,16 @@ module HexaPDF
289
289
  end
290
290
  end
291
291
 
292
- PAGE_NUMBER_SPEC = "([1-9]\\d*|e)" #:nodoc:
292
+ PAGE_NUMBER_SPEC = "(r?[1-9]\\d*|e)" #:nodoc:
293
+ PAGE_MAP = lambda do |result, count|
294
+ if result == 'e'
295
+ count
296
+ elsif result.start_with?('r')
297
+ count - result[1..-1].to_i + 1
298
+ else
299
+ result.to_i
300
+ end
301
+ end
293
302
  ROTATE_MAP = {'l' => 90, 'r' => -90, 'd' => 180, 'n' => :none}.freeze #:nodoc:
294
303
 
295
304
  # Parses the pages specification string and returns an array of tuples containing a page
@@ -304,12 +313,12 @@ module HexaPDF
304
313
  range.split(',').each_with_object([]) do |str, arr|
305
314
  case str
306
315
  when /\A#{PAGE_NUMBER_SPEC}(l|r|d|n)?\z/o
307
- page_num = ($1 == 'e' ? count : str.to_i)
316
+ page_num = PAGE_MAP[$1, count]
308
317
  next if page_num > count
309
318
  arr << [page_num - 1, ROTATE_MAP[$2]]
310
319
  when /\A#{PAGE_NUMBER_SPEC}-#{PAGE_NUMBER_SPEC}(?:\/([1-9]\d*))?(l|r|d|n)?\z/o
311
- start_nr = ($1 == 'e' ? count : [$1.to_i, count].min) - 1
312
- end_nr = ($2 == 'e' ? count : [$2.to_i, count].min) - 1
320
+ start_nr = [PAGE_MAP[$1, count], count].min - 1
321
+ end_nr = [PAGE_MAP[$2, count], count].min - 1
313
322
  step = ($3 ? $3.to_i : 1) * (start_nr > end_nr ? -1 : 1)
314
323
  rotation = ROTATE_MAP[$4]
315
324
  start_nr.step(to: end_nr, by: step) {|n| arr << [n, rotation] }