hexapdf 0.11.7 → 0.12.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +121 -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 +18 -9
- data/lib/hexapdf/cli/files.rb +1 -1
- data/lib/hexapdf/cli/form.rb +240 -0
- data/lib/hexapdf/cli/image2pdf.rb +1 -1
- data/lib/hexapdf/cli/images.rb +1 -1
- data/lib/hexapdf/cli/info.rb +1 -1
- data/lib/hexapdf/cli/inspect.rb +1 -1
- data/lib/hexapdf/cli/merge.rb +1 -1
- 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 +66 -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 +1 -1
- 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 +1 -1
- data/lib/hexapdf/dictionary_fields.rb +1 -1
- data/lib/hexapdf/document.rb +14 -5
- data/lib/hexapdf/document/files.rb +1 -1
- 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 +1 -1
- 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 +7 -1
- data/lib/hexapdf/encryption/standard_security_handler.rb +1 -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 +1 -1
- 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 +1 -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 +1 -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 +1 -1
- 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 +1 -1
- data/lib/hexapdf/layout/numeric_refinements.rb +1 -1
- data/lib/hexapdf/layout/style.rb +1 -1
- 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 +1 -1
- 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 +2 -2
- data/lib/hexapdf/parser.rb +4 -3
- data/lib/hexapdf/pdf_array.rb +1 -1
- 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 +1 -1
- 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 +1 -1
- data/lib/hexapdf/tokenizer.rb +1 -1
- 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 +401 -0
- data/lib/hexapdf/type/acro_form/button_field.rb +300 -0
- data/lib/hexapdf/type/acro_form/choice_field.rb +220 -0
- data/lib/hexapdf/type/acro_form/field.rb +220 -17
- data/lib/hexapdf/type/acro_form/form.rb +157 -7
- data/lib/hexapdf/type/acro_form/text_field.rb +186 -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 +1 -1
- 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 +239 -2
- data/lib/hexapdf/type/catalog.rb +21 -1
- 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 +1 -1
- data/lib/hexapdf/type/font.rb +18 -1
- data/lib/hexapdf/type/font_descriptor.rb +2 -2
- data/lib/hexapdf/type/font_simple.rb +1 -1
- data/lib/hexapdf/type/font_true_type.rb +1 -1
- data/lib/hexapdf/type/font_type0.rb +1 -1
- data/lib/hexapdf/type/font_type1.rb +16 -1
- data/lib/hexapdf/type/font_type3.rb +1 -1
- data/lib/hexapdf/type/form.rb +10 -1
- 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 +3 -1
- 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 +20 -5
- data/lib/hexapdf/type/page_tree_node.rb +8 -11
- data/lib/hexapdf/type/resources.rb +16 -3
- data/lib/hexapdf/type/trailer.rb +2 -3
- 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 +1 -1
- 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/content/common.rb +2 -2
- 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_security_handler.rb +4 -0
- 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/test_document.rb +12 -0
- data/test/hexapdf/test_parser.rb +10 -0
- data/test/hexapdf/test_rectangle.rb +14 -0
- data/test/hexapdf/test_revision.rb +3 -0
- data/test/hexapdf/test_serializer.rb +3 -3
- data/test/hexapdf/test_writer.rb +2 -2
- data/test/hexapdf/type/acro_form/test_appearance_generator.rb +515 -0
- data/test/hexapdf/type/acro_form/test_button_field.rb +276 -0
- data/test/hexapdf/type/acro_form/test_choice_field.rb +137 -0
- data/test/hexapdf/type/acro_form/test_field.rb +124 -6
- data/test/hexapdf/type/acro_form/test_form.rb +189 -22
- data/test/hexapdf/type/acro_form/test_text_field.rb +119 -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_type1.rb +8 -0
- data/test/hexapdf/type/test_form.rb +18 -0
- data/test/hexapdf/type/test_image.rb +7 -0
- data/test/hexapdf/type/test_page.rb +37 -6
- data/test/hexapdf/type/test_page_tree_node.rb +20 -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 +13 -1
- data/test/test_helper.rb +1 -1
- metadata +38 -18
- 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: d95e6e2abba7581aab78e449bf860c3955170d4c266850373296300495236c44
|
|
4
|
+
data.tar.gz: '0950af72d8864e98a70367ee28bdf09bc09aa83cace38933aa613bc8d476263d'
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c3c4ad1073d3ea9b820dc129348cf2d571159ea129aa65a10546552ae52e19cf29d74a4716e3fcefac10b34f9d2ad7e833bb90355c81564a152c853e0a406ea4
|
|
7
|
+
data.tar.gz: 637e17817d1aa8eb3b75035aa5d654f5bdbd7b531fb16776da49945c5100ab0705ab7d59b300f192b865d75ded43edae48d2f15541c2a93edbdedba9318f896a
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,123 @@
|
|
|
1
|
+
## 0.12.2 - 2020-08-17
|
|
2
|
+
|
|
3
|
+
### Fixed
|
|
4
|
+
|
|
5
|
+
- Wrong origin for page canvases when bottom left corner of media box doesn't
|
|
6
|
+
coincide with origin of coordinate system
|
|
7
|
+
- Wrong origin for Form XObject canvas when bottom left corner of bounding box
|
|
8
|
+
doesn't coincide with origin of coordinate system
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
## 0.12.1 - 2020-08-16
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
* [HexaPDF::Font::Encoding::Base#code] for retrieving the code for a given
|
|
16
|
+
glyph name
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
* [HexaPDF::Font::Type1Wrapper#encode] to correctly resolve the code for a glyph
|
|
21
|
+
name
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
## 0.12.0 - 2020-08-12
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
|
|
28
|
+
* Convenience methods for accessing field flags for
|
|
29
|
+
[HexaPDF::Type::AcroForm::Field]
|
|
30
|
+
* [HexaPDF::Type::AcroForm::TextField] and
|
|
31
|
+
[HexaPDF::Type::AcroForm::VariableTextField] for basic text field support
|
|
32
|
+
* [HexaPDF::Type::AcroForm::ButtonField] for push button, radio button and
|
|
33
|
+
check box support
|
|
34
|
+
* [HexaPDF::Type::AcroForm::ChoiceField] for combo box and list box support
|
|
35
|
+
* [HexaPDF::Type::AcroForm::AppearanceGenerator] as central class for
|
|
36
|
+
generating appearance streams for form fields
|
|
37
|
+
* Various convenience methods for [HexaPDF::Type::AcroForm::Form]
|
|
38
|
+
* Various convenience methods for [HexaPDF::Type::AcroForm::Field]
|
|
39
|
+
* Various convenience methods for [HexaPDF::Type::Annotations::Widget]
|
|
40
|
+
* [HexaPDF::Type::Annotation::AppearanceDictionary]
|
|
41
|
+
* [HexaPDF::Document#acro_form] and [HexaPDF::Type::Catalog#acro_form]
|
|
42
|
+
convenience methods
|
|
43
|
+
* CLI command `hexapdf form` for listing fields of interactive forms and filling
|
|
44
|
+
them out
|
|
45
|
+
* [HexaPDF::Rectangle] methods for setting the left, top, right, bottom, width
|
|
46
|
+
and height
|
|
47
|
+
* Method #prenormalized_color to all color space implementations
|
|
48
|
+
* [HexaPDF::Type::Font#font_wrapper] for accessing an associated font wrapper
|
|
49
|
+
instance
|
|
50
|
+
* [HexaPDF::Type::FontType1#font_wrapper] for providing a font wrapper for the
|
|
51
|
+
standard PDF fonts
|
|
52
|
+
* [HexaPDF::Type::Annotation::Border] class
|
|
53
|
+
* [HexaPDF::Content::ColorSpace::device_color_from_specification] for easily
|
|
54
|
+
getting a device color object
|
|
55
|
+
* [HexaPDF::Content::ColorSpace::prenormalized_device_color] for getting a device
|
|
56
|
+
color object without normalizing values
|
|
57
|
+
* [HexaPDF::Type::Annotation#appearance] for returning the associated appearance
|
|
58
|
+
dictionary
|
|
59
|
+
* [HexaPDF::Type::Annotation#appearance?] for checking whether an appearance for
|
|
60
|
+
the annotation exists
|
|
61
|
+
* Configuration option 'acro_form.create_appearance_streams' for automatically
|
|
62
|
+
creating appearance streams
|
|
63
|
+
* [HexaPDF::Type::Resources] methods `#pattern` and `add_pattern`
|
|
64
|
+
|
|
65
|
+
### Changed
|
|
66
|
+
|
|
67
|
+
* Deletion of pages to delete them from the document as well
|
|
68
|
+
* Refactored [HexaPDF::Font::Type1Wrapper] and [HexaPDF::Font::TrueTypeWrapper]
|
|
69
|
+
and renamed `#dict` to `#pdf_object`
|
|
70
|
+
* Fall back to the Type1 font's internal encoding when decoding a string
|
|
71
|
+
* All [HexaPDF::Content::ColorSpace] implementations to only normalize values
|
|
72
|
+
when using the ::color method
|
|
73
|
+
* [HexaPDF::Content::Parser#parse] to also accept a block in place of a
|
|
74
|
+
processor object
|
|
75
|
+
* HexaPDF::Type::AcroForm::Field#full_name to
|
|
76
|
+
[HexaPDF::Type::AcroForm::Field#full_field_name]
|
|
77
|
+
* Moved `HexaPDF::Content::Canvas#color_space_for_components` to class method on
|
|
78
|
+
[HexaPDF::Content::ColorSpace]
|
|
79
|
+
* Added bit unsetter method to[HexaPDF::Utils::BitField]
|
|
80
|
+
* [HexaPDF::Type::AcroForm::Form#find_root_fields] and `#each_field` to take the
|
|
81
|
+
field type into account when wrapping a field dictionary
|
|
82
|
+
* Pages specification of CLI commands to allow counting from the end using the
|
|
83
|
+
new `r<N>` notation
|
|
84
|
+
* [HexaPDF::Font::Type1Wrapper] to use the internal encoding of a font with a
|
|
85
|
+
'Special' character set instead of a custom encoding
|
|
86
|
+
* Configuration 'filter.map' to use the pass-through filter on all unsupported
|
|
87
|
+
filters
|
|
88
|
+
|
|
89
|
+
### Fixed
|
|
90
|
+
|
|
91
|
+
* Wrong normalization of color values when invoking a color operator
|
|
92
|
+
* Invalid type of `/DR` field of [HexaPDF::Type::AcroForm::Form]
|
|
93
|
+
* Invalid ordering of types for the `/V` and `/DV` fields of
|
|
94
|
+
[HexaPDF::Type::AcroForm::Field]
|
|
95
|
+
* [HexaPDF::Type::AcroForm::Field#terminal_field?] to work according to the spec
|
|
96
|
+
* Handling of empty files by throwing better error messages
|
|
97
|
+
* [HexaPDF::Type::Image#info] to correctly identify images with a soft mask as
|
|
98
|
+
currently not supported for writing
|
|
99
|
+
* [HexaPDF::Revision#delete] to remove the connection between the object and the
|
|
100
|
+
document
|
|
101
|
+
* Missing `#definition` method of `DeviceRGB`, `DeviceCMYK` and `DeviceGray`
|
|
102
|
+
color spaces
|
|
103
|
+
* Handling of 'Pattern' color spaces when parsing content streams
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
## 0.11.9 - 2020-06-15
|
|
107
|
+
|
|
108
|
+
### Changed
|
|
109
|
+
|
|
110
|
+
* Encryption dictionaries to always be indirect objects
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
## 0.11.8 - 2020-06-11
|
|
114
|
+
|
|
115
|
+
### Fixed
|
|
116
|
+
|
|
117
|
+
* Serialization of special `/` (zero-length name) object in dictionaries and
|
|
118
|
+
arrays
|
|
119
|
+
|
|
120
|
+
|
|
1
121
|
## 0.11.7 - 2020-06-10
|
|
2
122
|
|
|
3
123
|
### Fixed
|
|
@@ -7,6 +127,7 @@
|
|
|
7
127
|
* [HexaPDF::Task::Optimize] to work correctly when deleting object streams and
|
|
8
128
|
generating xref streams
|
|
9
129
|
|
|
130
|
+
|
|
10
131
|
## 0.11.6 - 2020-05-27
|
|
11
132
|
|
|
12
133
|
### Fixed
|
data/LICENSE
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
2
|
-
Copyright (C) 2014-
|
|
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
|
|
@@ -116,7 +116,7 @@ module HexaPDF
|
|
|
116
116
|
end
|
|
117
117
|
|
|
118
118
|
# Writes the document to the given file or does nothing if +out_file+ is +nil+.
|
|
119
|
-
def write_document(doc, out_file)
|
|
119
|
+
def write_document(doc, out_file, incremental: false)
|
|
120
120
|
if out_file
|
|
121
121
|
doc.validate(auto_correct: true) do |object, msg, correctable|
|
|
122
122
|
if command_parser.strict && !correctable
|
|
@@ -126,7 +126,7 @@ module HexaPDF
|
|
|
126
126
|
"for object (#{object.oid},#{object.gen}): #{msg}"
|
|
127
127
|
end
|
|
128
128
|
end
|
|
129
|
-
doc.write(out_file, validate: false)
|
|
129
|
+
doc.write(out_file, validate: false, incremental: incremental)
|
|
130
130
|
end
|
|
131
131
|
end
|
|
132
132
|
|
|
@@ -289,7 +289,16 @@ module HexaPDF
|
|
|
289
289
|
end
|
|
290
290
|
end
|
|
291
291
|
|
|
292
|
-
PAGE_NUMBER_SPEC = "([1-9]\\d*|e)" #:nodoc:
|
|
292
|
+
PAGE_NUMBER_SPEC = "(r?[1-9]\\d*|e)" #:nodoc:
|
|
293
|
+
PAGE_MAP = lambda do |result, count|
|
|
294
|
+
if result == 'e'
|
|
295
|
+
count
|
|
296
|
+
elsif result.start_with?('r')
|
|
297
|
+
count - result[1..-1].to_i + 1
|
|
298
|
+
else
|
|
299
|
+
result.to_i
|
|
300
|
+
end
|
|
301
|
+
end
|
|
293
302
|
ROTATE_MAP = {'l' => 90, 'r' => -90, 'd' => 180, 'n' => :none}.freeze #:nodoc:
|
|
294
303
|
|
|
295
304
|
# Parses the pages specification string and returns an array of tuples containing a page
|
|
@@ -304,12 +313,12 @@ module HexaPDF
|
|
|
304
313
|
range.split(',').each_with_object([]) do |str, arr|
|
|
305
314
|
case str
|
|
306
315
|
when /\A#{PAGE_NUMBER_SPEC}(l|r|d|n)?\z/o
|
|
307
|
-
page_num =
|
|
316
|
+
page_num = PAGE_MAP[$1, count]
|
|
308
317
|
next if page_num > count
|
|
309
318
|
arr << [page_num - 1, ROTATE_MAP[$2]]
|
|
310
319
|
when /\A#{PAGE_NUMBER_SPEC}-#{PAGE_NUMBER_SPEC}(?:\/([1-9]\d*))?(l|r|d|n)?\z/o
|
|
311
|
-
start_nr =
|
|
312
|
-
end_nr =
|
|
320
|
+
start_nr = [PAGE_MAP[$1, count], count].min - 1
|
|
321
|
+
end_nr = [PAGE_MAP[$2, count], count].min - 1
|
|
313
322
|
step = ($3 ? $3.to_i : 1) * (start_nr > end_nr ? -1 : 1)
|
|
314
323
|
rotation = ROTATE_MAP[$4]
|
|
315
324
|
start_nr.step(to: end_nr, by: step) {|n| arr << [n, rotation] }
|