hexapdf 0.11.9 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- 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] }
|