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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +157 -0
- data/LICENSE +1 -1
- data/examples/001-hello_world.rb +1 -1
- data/examples/002-graphics.rb +1 -1
- data/examples/003-arcs.rb +1 -1
- data/examples/004-optimizing.rb +1 -1
- data/examples/005-merging.rb +1 -1
- data/examples/006-standard_pdf_fonts.rb +1 -1
- data/examples/007-truetype.rb +1 -1
- data/examples/008-show_char_bboxes.rb +1 -1
- data/examples/009-text_layouter_alignment.rb +1 -1
- data/examples/010-text_layouter_inline_boxes.rb +1 -1
- data/examples/011-text_layouter_line_wrapping.rb +1 -1
- data/examples/012-text_layouter_styling.rb +1 -1
- data/examples/013-text_layouter_shapes.rb +1 -1
- data/examples/014-text_in_polygon.rb +1 -1
- data/examples/015-boxes.rb +1 -1
- data/examples/016-frame_automatic_box_placement.rb +1 -1
- data/examples/017-frame_text_flow.rb +1 -1
- data/examples/018-composer.rb +1 -1
- data/examples/019-acro_form.rb +51 -0
- data/lib/hexapdf.rb +1 -1
- data/lib/hexapdf/cli.rb +3 -1
- data/lib/hexapdf/cli/batch.rb +1 -1
- data/lib/hexapdf/cli/command.rb +22 -11
- data/lib/hexapdf/cli/files.rb +1 -1
- data/lib/hexapdf/cli/form.rb +240 -0
- data/lib/hexapdf/cli/image2pdf.rb +3 -2
- data/lib/hexapdf/cli/images.rb +1 -1
- data/lib/hexapdf/cli/info.rb +52 -3
- data/lib/hexapdf/cli/inspect.rb +31 -9
- data/lib/hexapdf/cli/merge.rb +2 -2
- data/lib/hexapdf/cli/modify.rb +1 -1
- data/lib/hexapdf/cli/optimize.rb +1 -1
- data/lib/hexapdf/cli/split.rb +1 -1
- data/lib/hexapdf/cli/watermark.rb +1 -1
- data/lib/hexapdf/composer.rb +2 -2
- data/lib/hexapdf/configuration.rb +81 -11
- data/lib/hexapdf/content.rb +3 -1
- data/lib/hexapdf/content/canvas.rb +5 -18
- data/lib/hexapdf/content/color_space.rb +111 -32
- data/lib/hexapdf/content/graphic_object.rb +1 -1
- data/lib/hexapdf/content/graphic_object/arc.rb +4 -4
- data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +1 -1
- data/lib/hexapdf/content/graphic_object/geom2d.rb +1 -1
- data/lib/hexapdf/content/graphic_object/solid_arc.rb +1 -1
- data/lib/hexapdf/content/graphics_state.rb +1 -1
- data/lib/hexapdf/content/operator.rb +9 -9
- data/lib/hexapdf/content/parser.rb +18 -5
- data/lib/hexapdf/content/processor.rb +1 -1
- data/lib/hexapdf/content/transformation_matrix.rb +1 -1
- data/lib/hexapdf/data_dir.rb +1 -1
- data/lib/hexapdf/dictionary.rb +5 -5
- data/lib/hexapdf/dictionary_fields.rb +2 -10
- data/lib/hexapdf/document.rb +45 -17
- data/lib/hexapdf/document/files.rb +1 -2
- data/lib/hexapdf/document/fonts.rb +1 -1
- data/lib/hexapdf/document/images.rb +1 -1
- data/lib/hexapdf/document/pages.rb +3 -14
- data/lib/hexapdf/encryption.rb +1 -1
- data/lib/hexapdf/encryption/aes.rb +1 -1
- data/lib/hexapdf/encryption/arc4.rb +1 -1
- data/lib/hexapdf/encryption/fast_aes.rb +1 -1
- data/lib/hexapdf/encryption/fast_arc4.rb +2 -2
- data/lib/hexapdf/encryption/identity.rb +1 -1
- data/lib/hexapdf/encryption/ruby_aes.rb +1 -1
- data/lib/hexapdf/encryption/ruby_arc4.rb +1 -1
- data/lib/hexapdf/encryption/security_handler.rb +2 -1
- data/lib/hexapdf/encryption/standard_security_handler.rb +2 -1
- data/lib/hexapdf/error.rb +1 -1
- data/lib/hexapdf/filter.rb +3 -3
- data/lib/hexapdf/filter/ascii85_decode.rb +1 -1
- data/lib/hexapdf/filter/ascii_hex_decode.rb +1 -1
- data/lib/hexapdf/filter/encryption.rb +1 -1
- data/lib/hexapdf/filter/flate_decode.rb +1 -1
- data/lib/hexapdf/filter/lzw_decode.rb +1 -1
- data/lib/hexapdf/filter/{jpx_decode.rb → pass_through.rb} +5 -5
- data/lib/hexapdf/filter/predictor.rb +1 -1
- data/lib/hexapdf/filter/run_length_decode.rb +1 -1
- data/lib/hexapdf/font/cmap.rb +2 -5
- data/lib/hexapdf/font/cmap/parser.rb +1 -1
- data/lib/hexapdf/font/cmap/writer.rb +1 -1
- data/lib/hexapdf/font/encoding.rb +1 -1
- data/lib/hexapdf/font/encoding/base.rb +9 -1
- data/lib/hexapdf/font/encoding/difference_encoding.rb +7 -1
- data/lib/hexapdf/font/encoding/glyph_list.rb +1 -1
- data/lib/hexapdf/font/encoding/mac_expert_encoding.rb +1 -1
- data/lib/hexapdf/font/encoding/mac_roman_encoding.rb +1 -1
- data/lib/hexapdf/font/encoding/standard_encoding.rb +1 -1
- data/lib/hexapdf/font/encoding/symbol_encoding.rb +1 -1
- data/lib/hexapdf/font/encoding/win_ansi_encoding.rb +1 -1
- data/lib/hexapdf/font/encoding/zapf_dingbats_encoding.rb +1 -1
- data/lib/hexapdf/font/invalid_glyph.rb +1 -1
- data/lib/hexapdf/font/true_type.rb +1 -1
- data/lib/hexapdf/font/true_type/builder.rb +1 -1
- data/lib/hexapdf/font/true_type/font.rb +1 -1
- data/lib/hexapdf/font/true_type/optimizer.rb +1 -1
- data/lib/hexapdf/font/true_type/subsetter.rb +1 -1
- data/lib/hexapdf/font/true_type/table.rb +1 -1
- data/lib/hexapdf/font/true_type/table/cmap.rb +1 -1
- data/lib/hexapdf/font/true_type/table/cmap_subtable.rb +1 -1
- data/lib/hexapdf/font/true_type/table/directory.rb +1 -1
- data/lib/hexapdf/font/true_type/table/glyf.rb +1 -1
- data/lib/hexapdf/font/true_type/table/head.rb +2 -1
- data/lib/hexapdf/font/true_type/table/hhea.rb +1 -1
- data/lib/hexapdf/font/true_type/table/hmtx.rb +1 -1
- data/lib/hexapdf/font/true_type/table/kern.rb +1 -1
- data/lib/hexapdf/font/true_type/table/loca.rb +1 -1
- data/lib/hexapdf/font/true_type/table/maxp.rb +1 -1
- data/lib/hexapdf/font/true_type/table/name.rb +1 -1
- data/lib/hexapdf/font/true_type/table/os2.rb +3 -1
- data/lib/hexapdf/font/true_type/table/post.rb +1 -1
- data/lib/hexapdf/font/true_type_wrapper.rb +54 -51
- data/lib/hexapdf/font/type1.rb +1 -1
- data/lib/hexapdf/font/type1/afm_parser.rb +1 -1
- data/lib/hexapdf/font/type1/character_metrics.rb +1 -1
- data/lib/hexapdf/font/type1/font.rb +1 -1
- data/lib/hexapdf/font/type1/font_metrics.rb +1 -1
- data/lib/hexapdf/font/type1/pfb_parser.rb +1 -1
- data/lib/hexapdf/font/type1_wrapper.rb +68 -52
- data/lib/hexapdf/font_loader.rb +1 -1
- data/lib/hexapdf/font_loader/from_configuration.rb +1 -1
- data/lib/hexapdf/font_loader/from_file.rb +1 -1
- data/lib/hexapdf/font_loader/standard14.rb +1 -1
- data/lib/hexapdf/image_loader.rb +1 -1
- data/lib/hexapdf/image_loader/jpeg.rb +1 -1
- data/lib/hexapdf/image_loader/pdf.rb +1 -1
- data/lib/hexapdf/image_loader/png.rb +4 -3
- data/lib/hexapdf/importer.rb +2 -4
- data/lib/hexapdf/layout.rb +1 -1
- data/lib/hexapdf/layout/box.rb +1 -1
- data/lib/hexapdf/layout/frame.rb +1 -1
- data/lib/hexapdf/layout/image_box.rb +1 -1
- data/lib/hexapdf/layout/inline_box.rb +1 -1
- data/lib/hexapdf/layout/line.rb +2 -2
- data/lib/hexapdf/layout/numeric_refinements.rb +1 -1
- data/lib/hexapdf/layout/style.rb +24 -24
- data/lib/hexapdf/layout/text_box.rb +1 -1
- data/lib/hexapdf/layout/text_fragment.rb +1 -1
- data/lib/hexapdf/layout/text_layouter.rb +1 -1
- data/lib/hexapdf/layout/text_shaper.rb +4 -3
- data/lib/hexapdf/layout/width_from_polygon.rb +1 -1
- data/lib/hexapdf/name_tree_node.rb +1 -1
- data/lib/hexapdf/number_tree_node.rb +1 -1
- data/lib/hexapdf/object.rb +32 -27
- data/lib/hexapdf/parser.rb +69 -6
- data/lib/hexapdf/pdf_array.rb +10 -3
- data/lib/hexapdf/rectangle.rb +31 -1
- data/lib/hexapdf/reference.rb +1 -1
- data/lib/hexapdf/revision.rb +2 -1
- data/lib/hexapdf/revisions.rb +30 -22
- data/lib/hexapdf/serializer.rb +2 -2
- data/lib/hexapdf/stream.rb +1 -1
- data/lib/hexapdf/task.rb +1 -1
- data/lib/hexapdf/task/dereference.rb +1 -1
- data/lib/hexapdf/task/optimize.rb +7 -5
- data/lib/hexapdf/tokenizer.rb +5 -4
- data/lib/hexapdf/type.rb +1 -1
- data/lib/hexapdf/type/acro_form.rb +7 -1
- data/lib/hexapdf/type/acro_form/appearance_generator.rb +405 -0
- data/lib/hexapdf/type/acro_form/button_field.rb +305 -0
- data/lib/hexapdf/type/acro_form/choice_field.rb +220 -0
- data/lib/hexapdf/type/acro_form/field.rb +250 -17
- data/lib/hexapdf/type/acro_form/form.rb +159 -7
- data/lib/hexapdf/type/acro_form/text_field.rb +187 -0
- data/lib/hexapdf/type/acro_form/variable_text_field.rb +122 -0
- data/lib/hexapdf/type/action.rb +1 -1
- data/lib/hexapdf/type/actions.rb +1 -1
- data/lib/hexapdf/type/actions/go_to.rb +1 -1
- data/lib/hexapdf/type/actions/go_to_r.rb +1 -1
- data/lib/hexapdf/type/actions/launch.rb +1 -1
- data/lib/hexapdf/type/actions/uri.rb +4 -3
- data/lib/hexapdf/type/annotation.rb +73 -3
- data/lib/hexapdf/type/annotations.rb +1 -1
- data/lib/hexapdf/type/annotations/link.rb +2 -2
- data/lib/hexapdf/type/annotations/markup_annotation.rb +1 -1
- data/lib/hexapdf/type/annotations/text.rb +1 -1
- data/lib/hexapdf/type/annotations/widget.rb +238 -2
- data/lib/hexapdf/type/catalog.rb +23 -3
- data/lib/hexapdf/type/cid_font.rb +1 -1
- data/lib/hexapdf/type/embedded_file.rb +1 -1
- data/lib/hexapdf/type/file_specification.rb +2 -2
- data/lib/hexapdf/type/font.rb +18 -1
- data/lib/hexapdf/type/font_descriptor.rb +2 -2
- data/lib/hexapdf/type/font_simple.rb +4 -2
- data/lib/hexapdf/type/font_true_type.rb +7 -3
- data/lib/hexapdf/type/font_type0.rb +2 -2
- data/lib/hexapdf/type/font_type1.rb +16 -1
- data/lib/hexapdf/type/font_type3.rb +1 -1
- data/lib/hexapdf/type/form.rb +12 -2
- data/lib/hexapdf/type/graphics_state_parameter.rb +1 -1
- data/lib/hexapdf/type/icon_fit.rb +1 -1
- data/lib/hexapdf/type/image.rb +5 -3
- data/lib/hexapdf/type/info.rb +1 -1
- data/lib/hexapdf/type/names.rb +1 -1
- data/lib/hexapdf/type/object_stream.rb +1 -1
- data/lib/hexapdf/type/page.rb +36 -12
- data/lib/hexapdf/type/page_tree_node.rb +37 -16
- data/lib/hexapdf/type/resources.rb +17 -3
- data/lib/hexapdf/type/trailer.rb +4 -6
- data/lib/hexapdf/type/viewer_preferences.rb +1 -1
- data/lib/hexapdf/type/xref_stream.rb +1 -1
- data/lib/hexapdf/utils/bit_field.rb +38 -24
- data/lib/hexapdf/utils/bit_stream.rb +1 -1
- data/lib/hexapdf/utils/graphics_helpers.rb +1 -1
- data/lib/hexapdf/utils/lru_cache.rb +1 -1
- data/lib/hexapdf/utils/math_helpers.rb +1 -1
- data/lib/hexapdf/utils/object_hash.rb +1 -1
- data/lib/hexapdf/utils/pdf_doc_encoding.rb +1 -1
- data/lib/hexapdf/utils/sorted_tree_node.rb +19 -16
- data/lib/hexapdf/version.rb +2 -2
- data/lib/hexapdf/writer.rb +1 -1
- data/lib/hexapdf/xref_section.rb +1 -1
- data/test/hexapdf/common_tokenizer_tests.rb +6 -1
- data/test/hexapdf/content/common.rb +2 -2
- data/test/hexapdf/content/graphic_object/test_arc.rb +4 -4
- data/test/hexapdf/content/test_canvas.rb +3 -3
- data/test/hexapdf/content/test_color_space.rb +71 -8
- data/test/hexapdf/content/test_operator.rb +22 -22
- data/test/hexapdf/content/test_parser.rb +14 -0
- data/test/hexapdf/document/test_fonts.rb +1 -1
- data/test/hexapdf/document/test_pages.rb +6 -6
- data/test/hexapdf/encryption/test_aes.rb +4 -4
- data/test/hexapdf/encryption/test_standard_security_handler.rb +11 -11
- data/test/hexapdf/filter/test_ascii85_decode.rb +1 -1
- data/test/hexapdf/filter/test_ascii_hex_decode.rb +1 -1
- data/test/hexapdf/font/encoding/test_base.rb +10 -0
- data/test/hexapdf/font/encoding/test_difference_encoding.rb +8 -0
- data/test/hexapdf/font/test_true_type_wrapper.rb +10 -7
- data/test/hexapdf/font/test_type1_wrapper.rb +33 -8
- data/test/hexapdf/layout/test_style.rb +1 -1
- data/test/hexapdf/layout/test_text_layouter.rb +3 -4
- data/test/hexapdf/test_configuration.rb +2 -2
- data/test/hexapdf/test_dictionary.rb +3 -1
- data/test/hexapdf/test_dictionary_fields.rb +2 -2
- data/test/hexapdf/test_document.rb +16 -4
- data/test/hexapdf/test_object.rb +44 -26
- data/test/hexapdf/test_parser.rb +125 -55
- data/test/hexapdf/test_pdf_array.rb +7 -0
- data/test/hexapdf/test_rectangle.rb +14 -0
- data/test/hexapdf/test_revision.rb +3 -0
- data/test/hexapdf/test_revisions.rb +35 -0
- data/test/hexapdf/test_writer.rb +2 -2
- data/test/hexapdf/type/acro_form/test_appearance_generator.rb +521 -0
- data/test/hexapdf/type/acro_form/test_button_field.rb +281 -0
- data/test/hexapdf/type/acro_form/test_choice_field.rb +137 -0
- data/test/hexapdf/type/acro_form/test_field.rb +163 -6
- data/test/hexapdf/type/acro_form/test_form.rb +189 -22
- data/test/hexapdf/type/acro_form/test_text_field.rb +121 -0
- data/test/hexapdf/type/acro_form/test_variable_text_field.rb +77 -0
- data/test/hexapdf/type/annotations/test_text.rb +1 -1
- data/test/hexapdf/type/annotations/test_widget.rb +199 -0
- data/test/hexapdf/type/test_annotation.rb +45 -0
- data/test/hexapdf/type/test_catalog.rb +18 -0
- data/test/hexapdf/type/test_font.rb +5 -0
- data/test/hexapdf/type/test_font_simple.rb +2 -1
- data/test/hexapdf/type/test_font_true_type.rb +6 -0
- data/test/hexapdf/type/test_font_type1.rb +8 -0
- data/test/hexapdf/type/test_form.rb +19 -1
- data/test/hexapdf/type/test_image.rb +7 -0
- data/test/hexapdf/type/test_page.rb +45 -7
- data/test/hexapdf/type/test_page_tree_node.rb +62 -12
- data/test/hexapdf/type/test_resources.rb +20 -0
- data/test/hexapdf/type/test_trailer.rb +4 -0
- data/test/hexapdf/utils/test_bit_field.rb +15 -1
- data/test/hexapdf/utils/test_sorted_tree_node.rb +10 -9
- data/test/test_helper.rb +1 -1
- metadata +34 -21
- data/lib/hexapdf/filter/dct_decode.rb +0 -60
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 77d9895ece62ee8b8df5afb5a44035868c6b33eb7b43a7cb5b85bd730bee56bc
|
|
4
|
+
data.tar.gz: 16b61502ef5c35df588c6a2fd53e1099b80f584276c07ec7a3c23343705ccb42
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 490fca7cfa535ebfab2af613dacf3ff9e9a6b0b2b76c865ceeb98a45d1cc7b668772dbd3a46ea00a5b82eb1374f36cb42b604754bbb1353e103cde726bc7e886
|
|
7
|
+
data.tar.gz: 1f85edaa9b2214218bb586d8c5409c9f741893fa0effdb60c64d294be231893ed96f1efa9db286d9a98f094caeb3fb272d318782dc7977adb8b252425d72cfb4
|
data/CHANGELOG.md
CHANGED
|
@@ -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-
|
|
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
|
data/examples/001-hello_world.rb
CHANGED
data/examples/002-graphics.rb
CHANGED
data/examples/003-arcs.rb
CHANGED
data/examples/004-optimizing.rb
CHANGED
data/examples/005-merging.rb
CHANGED
data/examples/007-truetype.rb
CHANGED
data/examples/015-boxes.rb
CHANGED
data/examples/018-composer.rb
CHANGED
|
@@ -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)
|
data/lib/hexapdf.rb
CHANGED
|
@@ -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-
|
|
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
|
data/lib/hexapdf/cli.rb
CHANGED
|
@@ -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-
|
|
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)
|
data/lib/hexapdf/cli/batch.rb
CHANGED
|
@@ -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-
|
|
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
|
data/lib/hexapdf/cli/command.rb
CHANGED
|
@@ -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-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
312
|
-
end_nr =
|
|
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] }
|