hexapdf 0.11.9 → 0.13.0

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 (270) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +157 -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 +22 -11
  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 +3 -2
  30. data/lib/hexapdf/cli/images.rb +1 -1
  31. data/lib/hexapdf/cli/info.rb +52 -3
  32. data/lib/hexapdf/cli/inspect.rb +31 -9
  33. data/lib/hexapdf/cli/merge.rb +2 -2
  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 +81 -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 +4 -4
  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 +5 -5
  55. data/lib/hexapdf/dictionary_fields.rb +2 -10
  56. data/lib/hexapdf/document.rb +45 -17
  57. data/lib/hexapdf/document/files.rb +1 -2
  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 +2 -2
  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 +2 -1
  70. data/lib/hexapdf/encryption/standard_security_handler.rb +2 -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 +2 -5
  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 +2 -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 +3 -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 +4 -3
  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 +2 -2
  137. data/lib/hexapdf/layout/numeric_refinements.rb +1 -1
  138. data/lib/hexapdf/layout/style.rb +24 -24
  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 +4 -3
  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 +32 -27
  147. data/lib/hexapdf/parser.rb +69 -6
  148. data/lib/hexapdf/pdf_array.rb +10 -3
  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 +30 -22
  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 +7 -5
  158. data/lib/hexapdf/tokenizer.rb +5 -4
  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 +405 -0
  162. data/lib/hexapdf/type/acro_form/button_field.rb +305 -0
  163. data/lib/hexapdf/type/acro_form/choice_field.rb +220 -0
  164. data/lib/hexapdf/type/acro_form/field.rb +250 -17
  165. data/lib/hexapdf/type/acro_form/form.rb +159 -7
  166. data/lib/hexapdf/type/acro_form/text_field.rb +187 -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 +4 -3
  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 +238 -2
  180. data/lib/hexapdf/type/catalog.rb +23 -3
  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 +2 -2
  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 +4 -2
  187. data/lib/hexapdf/type/font_true_type.rb +7 -3
  188. data/lib/hexapdf/type/font_type0.rb +2 -2
  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 +12 -2
  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 +5 -3
  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 +36 -12
  199. data/lib/hexapdf/type/page_tree_node.rb +37 -16
  200. data/lib/hexapdf/type/resources.rb +17 -3
  201. data/lib/hexapdf/type/trailer.rb +4 -6
  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 +19 -16
  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/common_tokenizer_tests.rb +6 -1
  216. data/test/hexapdf/content/common.rb +2 -2
  217. data/test/hexapdf/content/graphic_object/test_arc.rb +4 -4
  218. data/test/hexapdf/content/test_canvas.rb +3 -3
  219. data/test/hexapdf/content/test_color_space.rb +71 -8
  220. data/test/hexapdf/content/test_operator.rb +22 -22
  221. data/test/hexapdf/content/test_parser.rb +14 -0
  222. data/test/hexapdf/document/test_fonts.rb +1 -1
  223. data/test/hexapdf/document/test_pages.rb +6 -6
  224. data/test/hexapdf/encryption/test_aes.rb +4 -4
  225. data/test/hexapdf/encryption/test_standard_security_handler.rb +11 -11
  226. data/test/hexapdf/filter/test_ascii85_decode.rb +1 -1
  227. data/test/hexapdf/filter/test_ascii_hex_decode.rb +1 -1
  228. data/test/hexapdf/font/encoding/test_base.rb +10 -0
  229. data/test/hexapdf/font/encoding/test_difference_encoding.rb +8 -0
  230. data/test/hexapdf/font/test_true_type_wrapper.rb +10 -7
  231. data/test/hexapdf/font/test_type1_wrapper.rb +33 -8
  232. data/test/hexapdf/layout/test_style.rb +1 -1
  233. data/test/hexapdf/layout/test_text_layouter.rb +3 -4
  234. data/test/hexapdf/test_configuration.rb +2 -2
  235. data/test/hexapdf/test_dictionary.rb +3 -1
  236. data/test/hexapdf/test_dictionary_fields.rb +2 -2
  237. data/test/hexapdf/test_document.rb +16 -4
  238. data/test/hexapdf/test_object.rb +44 -26
  239. data/test/hexapdf/test_parser.rb +125 -55
  240. data/test/hexapdf/test_pdf_array.rb +7 -0
  241. data/test/hexapdf/test_rectangle.rb +14 -0
  242. data/test/hexapdf/test_revision.rb +3 -0
  243. data/test/hexapdf/test_revisions.rb +35 -0
  244. data/test/hexapdf/test_writer.rb +2 -2
  245. data/test/hexapdf/type/acro_form/test_appearance_generator.rb +521 -0
  246. data/test/hexapdf/type/acro_form/test_button_field.rb +281 -0
  247. data/test/hexapdf/type/acro_form/test_choice_field.rb +137 -0
  248. data/test/hexapdf/type/acro_form/test_field.rb +163 -6
  249. data/test/hexapdf/type/acro_form/test_form.rb +189 -22
  250. data/test/hexapdf/type/acro_form/test_text_field.rb +121 -0
  251. data/test/hexapdf/type/acro_form/test_variable_text_field.rb +77 -0
  252. data/test/hexapdf/type/annotations/test_text.rb +1 -1
  253. data/test/hexapdf/type/annotations/test_widget.rb +199 -0
  254. data/test/hexapdf/type/test_annotation.rb +45 -0
  255. data/test/hexapdf/type/test_catalog.rb +18 -0
  256. data/test/hexapdf/type/test_font.rb +5 -0
  257. data/test/hexapdf/type/test_font_simple.rb +2 -1
  258. data/test/hexapdf/type/test_font_true_type.rb +6 -0
  259. data/test/hexapdf/type/test_font_type1.rb +8 -0
  260. data/test/hexapdf/type/test_form.rb +19 -1
  261. data/test/hexapdf/type/test_image.rb +7 -0
  262. data/test/hexapdf/type/test_page.rb +45 -7
  263. data/test/hexapdf/type/test_page_tree_node.rb +62 -12
  264. data/test/hexapdf/type/test_resources.rb +20 -0
  265. data/test/hexapdf/type/test_trailer.rb +4 -0
  266. data/test/hexapdf/utils/test_bit_field.rb +15 -1
  267. data/test/hexapdf/utils/test_sorted_tree_node.rb +10 -9
  268. data/test/test_helper.rb +1 -1
  269. metadata +34 -21
  270. data/lib/hexapdf/filter/dct_decode.rb +0 -60
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f56bc512ed28de11d43f5b2eb662729086734dc3120e6c8e96b56eab89420da4
4
- data.tar.gz: 4b9e75f7d533cc7b3c3a6e297d26ab0358dcaa4ac0f0a5346df3e95c90d9c173
3
+ metadata.gz: 77d9895ece62ee8b8df5afb5a44035868c6b33eb7b43a7cb5b85bd730bee56bc
4
+ data.tar.gz: 16b61502ef5c35df588c6a2fd53e1099b80f584276c07ec7a3c23343705ccb42
5
5
  SHA512:
6
- metadata.gz: 3651a7ed4a7fb305c79a70b0c009441b0e3012188ce5e8baf8847107bce27793e0c48a577ae0bbc9ae3d6bece5356b86955b4deb2abd505d0b7a856053461ab3
7
- data.tar.gz: 7cfd77439479567d81133e39243715dd05b3a3b31ccc64fd923ec7391ba745834977011e4618f1f9462cdcb2a682ed1b102c20474a4b3f5d7c69be438c6abd51
6
+ metadata.gz: 490fca7cfa535ebfab2af613dacf3ff9e9a6b0b2b76c865ceeb98a45d1cc7b668772dbd3a46ea00a5b82eb1374f36cb42b604754bbb1353e103cde726bc7e886
7
+ data.tar.gz: 1f85edaa9b2214218bb586d8c5409c9f741893fa0effdb60c64d294be231893ed96f1efa9db286d9a98f094caeb3fb272d318782dc7977adb8b252425d72cfb4
@@ -1,3 +1,160 @@
1
+ ## 0.13.0 - 2020-11-15
2
+
3
+ ### Added
4
+
5
+ * Cross-reference table reconstruction for damaged PDFs, controllable via the
6
+ new 'parser.try_xref_reconstruction' option
7
+ * Two new `hexapdf inspect` commands for showing page objects and page content
8
+ streams by page number
9
+ * Flag `--check` to the CLI command `hexapdf info` for checking a file for
10
+ parse and validation errors
11
+ * [HexaPDF::Type::AcroForm::Field#embedded_widget?] for checking if a widget is
12
+ embedded in the field object
13
+ * [HexaPDF::Type::AcroForm::Field#delete_widget] for deleting a widget
14
+ * [HexaPDF::PDFArray#delete] for deleting an object from a PDF array
15
+ * [HexaPDF::Type::Page#ancestor_nodes] for retrieving all ancestor page tree
16
+ nodes of a page
17
+ * [HexaPDF::Type::PageTreeNode#move_page] for moving a page to another index
18
+
19
+ ### Changed
20
+
21
+ * **Breaking change**: Overhauled document/object validation interfaces and
22
+ internals to be more similar and to allow for reporting of multiple validation
23
+ problems
24
+ * Validation of TrueType fonts to ignore missing fields if the font name
25
+ suggests that the font is one of the standard 14 PDF fonts
26
+ * Option `-p` of CLI command `hexapdf image2pdf` to also allow lowercase page
27
+ size names
28
+
29
+ ### Fixed
30
+
31
+ * Reporting of cross-reference section entry parsing error
32
+ * PDF version used by default for dictionary fields
33
+ * Error in CLI command `hexapdf inspect` when parsing an invalid object number
34
+ * Output of error messages in CLI command `hexapdf inspect` to go to `$stderr`
35
+ * Bug in [HexaPDF::Type::AcroForm::TextField] validation due to missing nil
36
+ handling
37
+
38
+
39
+ ## 0.12.3 - 2020-08-22
40
+
41
+ ### Changed
42
+
43
+ * Allow any object responding to `#to_sym` when setting a radio button value
44
+
45
+ ### Fixed
46
+
47
+ * Error in the AcroForm appearance generator for text fields when the font is
48
+ not found in the default resources
49
+ * Parsing of long numbers when reading a file from IO
50
+ * Usage of unsupported method for Ruby 2.4 so that all tests pass again
51
+
52
+
53
+ ## 0.12.2 - 2020-08-17
54
+
55
+ ### Fixed
56
+
57
+ - Wrong origin for page canvases when bottom left corner of media box doesn't
58
+ coincide with origin of coordinate system
59
+ - Wrong origin for Form XObject canvas when bottom left corner of bounding box
60
+ doesn't coincide with origin of coordinate system
61
+
62
+
63
+ ## 0.12.1 - 2020-08-16
64
+
65
+ ### Added
66
+
67
+ * [HexaPDF::Font::Encoding::Base#code] for retrieving the code for a given
68
+ glyph name
69
+
70
+ ### Fixed
71
+
72
+ * [HexaPDF::Font::Type1Wrapper#encode] to correctly resolve the code for a glyph
73
+ name
74
+
75
+
76
+ ## 0.12.0 - 2020-08-12
77
+
78
+ ### Added
79
+
80
+ * Convenience methods for accessing field flags for
81
+ [HexaPDF::Type::AcroForm::Field]
82
+ * [HexaPDF::Type::AcroForm::TextField] and
83
+ [HexaPDF::Type::AcroForm::VariableTextField] for basic text field support
84
+ * [HexaPDF::Type::AcroForm::ButtonField] for push button, radio button and
85
+ check box support
86
+ * [HexaPDF::Type::AcroForm::ChoiceField] for combo box and list box support
87
+ * [HexaPDF::Type::AcroForm::AppearanceGenerator] as central class for
88
+ generating appearance streams for form fields
89
+ * Various convenience methods for [HexaPDF::Type::AcroForm::Form]
90
+ * Various convenience methods for [HexaPDF::Type::AcroForm::Field]
91
+ * Various convenience methods for [HexaPDF::Type::Annotations::Widget]
92
+ * [HexaPDF::Type::Annotation::AppearanceDictionary]
93
+ * [HexaPDF::Document#acro_form] and [HexaPDF::Type::Catalog#acro_form]
94
+ convenience methods
95
+ * CLI command `hexapdf form` for listing fields of interactive forms and filling
96
+ them out
97
+ * [HexaPDF::Rectangle] methods for setting the left, top, right, bottom, width
98
+ and height
99
+ * Method #prenormalized_color to all color space implementations
100
+ * [HexaPDF::Type::Font#font_wrapper] for accessing an associated font wrapper
101
+ instance
102
+ * [HexaPDF::Type::FontType1#font_wrapper] for providing a font wrapper for the
103
+ standard PDF fonts
104
+ * [HexaPDF::Type::Annotation::Border] class
105
+ * [HexaPDF::Content::ColorSpace::device_color_from_specification] for easily
106
+ getting a device color object
107
+ * [HexaPDF::Content::ColorSpace::prenormalized_device_color] for getting a device
108
+ color object without normalizing values
109
+ * [HexaPDF::Type::Annotation#appearance] for returning the associated appearance
110
+ dictionary
111
+ * [HexaPDF::Type::Annotation#appearance?] for checking whether an appearance for
112
+ the annotation exists
113
+ * Configuration option 'acro_form.create_appearance_streams' for automatically
114
+ creating appearance streams
115
+ * [HexaPDF::Type::Resources] methods `#pattern` and `add_pattern`
116
+
117
+ ### Changed
118
+
119
+ * Deletion of pages to delete them from the document as well
120
+ * Refactored [HexaPDF::Font::Type1Wrapper] and [HexaPDF::Font::TrueTypeWrapper]
121
+ and renamed `#dict` to `#pdf_object`
122
+ * Fall back to the Type1 font's internal encoding when decoding a string
123
+ * All [HexaPDF::Content::ColorSpace] implementations to only normalize values
124
+ when using the ::color method
125
+ * [HexaPDF::Content::Parser#parse] to also accept a block in place of a
126
+ processor object
127
+ * HexaPDF::Type::AcroForm::Field#full_name to
128
+ [HexaPDF::Type::AcroForm::Field#full_field_name]
129
+ * Moved `HexaPDF::Content::Canvas#color_space_for_components` to class method on
130
+ [HexaPDF::Content::ColorSpace]
131
+ * Added bit unsetter method to[HexaPDF::Utils::BitField]
132
+ * [HexaPDF::Type::AcroForm::Form#find_root_fields] and `#each_field` to take the
133
+ field type into account when wrapping a field dictionary
134
+ * Pages specification of CLI commands to allow counting from the end using the
135
+ new `r<N>` notation
136
+ * [HexaPDF::Font::Type1Wrapper] to use the internal encoding of a font with a
137
+ 'Special' character set instead of a custom encoding
138
+ * Configuration 'filter.map' to use the pass-through filter on all unsupported
139
+ filters
140
+
141
+ ### Fixed
142
+
143
+ * Wrong normalization of color values when invoking a color operator
144
+ * Invalid type of `/DR` field of [HexaPDF::Type::AcroForm::Form]
145
+ * Invalid ordering of types for the `/V` and `/DV` fields of
146
+ [HexaPDF::Type::AcroForm::Field]
147
+ * [HexaPDF::Type::AcroForm::Field#terminal_field?] to work according to the spec
148
+ * Handling of empty files by throwing better error messages
149
+ * [HexaPDF::Type::Image#info] to correctly identify images with a soft mask as
150
+ currently not supported for writing
151
+ * [HexaPDF::Revision#delete] to remove the connection between the object and the
152
+ document
153
+ * Missing `#definition` method of `DeviceRGB`, `DeviceCMYK` and `DeviceGray`
154
+ color spaces
155
+ * Handling of 'Pattern' color spaces when parsing content streams
156
+
157
+
1
158
  ## 0.11.9 - 2020-06-15
2
159
 
3
160
  ### Changed
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
@@ -100,6 +100,7 @@ module HexaPDF
100
100
  def pdf_options(password)
101
101
  hash = {decryption_opts: {password: password}, config: {}}
102
102
  HexaPDF::GlobalConfiguration['filter.predictor.strict'] = command_parser.strict
103
+ hash[:config]['parser.try_xref_reconstruction'] = !command_parser.strict
103
104
  hash[:config]['parser.on_correctable_error'] =
104
105
  if command_parser.strict
105
106
  proc { true }
@@ -116,7 +117,7 @@ module HexaPDF
116
117
  end
117
118
 
118
119
  # Writes the document to the given file or does nothing if +out_file+ is +nil+.
119
- def write_document(doc, out_file)
120
+ def write_document(doc, out_file, incremental: false)
120
121
  if out_file
121
122
  doc.validate(auto_correct: true) do |object, msg, correctable|
122
123
  if command_parser.strict && !correctable
@@ -126,7 +127,7 @@ module HexaPDF
126
127
  "for object (#{object.oid},#{object.gen}): #{msg}"
127
128
  end
128
129
  end
129
- doc.write(out_file, validate: false)
130
+ doc.write(out_file, validate: false, incremental: incremental)
130
131
  end
131
132
  end
132
133
 
@@ -277,19 +278,29 @@ module HexaPDF
277
278
  #
278
279
  # See: #define_encryption_options
279
280
  def apply_encryption_options(doc)
280
- if @out_options.encryption == :add
281
+ case @out_options.encryption
282
+ when :add
281
283
  doc.encrypt(algorithm: @out_options.enc_algorithm,
282
284
  key_length: @out_options.enc_key_length,
283
285
  force_v4: @out_options.enc_force_v4,
284
286
  permissions: @out_options.enc_permissions,
285
287
  owner_password: @out_options.enc_owner_pwd,
286
288
  user_password: @out_options.enc_user_pwd)
287
- elsif @out_options.encryption == :remove
289
+ when :remove
288
290
  doc.encrypt(name: nil)
289
291
  end
290
292
  end
291
293
 
292
- PAGE_NUMBER_SPEC = "([1-9]\\d*|e)" #:nodoc:
294
+ PAGE_NUMBER_SPEC = "(r?[1-9]\\d*|e)" #:nodoc:
295
+ PAGE_MAP = lambda do |result, count|
296
+ if result == 'e'
297
+ count
298
+ elsif result.start_with?('r')
299
+ count - result[1..-1].to_i + 1
300
+ else
301
+ result.to_i
302
+ end
303
+ end
293
304
  ROTATE_MAP = {'l' => 90, 'r' => -90, 'd' => 180, 'n' => :none}.freeze #:nodoc:
294
305
 
295
306
  # Parses the pages specification string and returns an array of tuples containing a page
@@ -304,12 +315,12 @@ module HexaPDF
304
315
  range.split(',').each_with_object([]) do |str, arr|
305
316
  case str
306
317
  when /\A#{PAGE_NUMBER_SPEC}(l|r|d|n)?\z/o
307
- page_num = ($1 == 'e' ? count : str.to_i)
318
+ page_num = PAGE_MAP[$1, count]
308
319
  next if page_num > count
309
320
  arr << [page_num - 1, ROTATE_MAP[$2]]
310
321
  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
322
+ start_nr = [PAGE_MAP[$1, count], count].min - 1
323
+ end_nr = [PAGE_MAP[$2, count], count].min - 1
313
324
  step = ($3 ? $3.to_i : 1) * (start_nr > end_nr ? -1 : 1)
314
325
  rotation = ROTATE_MAP[$4]
315
326
  start_nr.step(to: end_nr, by: step) {|n| arr << [n, rotation] }