hexapdf 0.6.0 → 0.7.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 +5 -5
- data/CHANGELOG.md +33 -0
- data/CONTRIBUTERS +1 -1
- data/LICENSE +1 -1
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/bin/hexapdf +1 -1
- data/examples/text_layouter_styling.rb +1 -2
- data/lib/hexapdf.rb +2 -2
- data/lib/hexapdf/cli.rb +3 -3
- data/lib/hexapdf/cli/batch.rb +5 -5
- data/lib/hexapdf/cli/command.rb +15 -17
- data/lib/hexapdf/cli/files.rb +3 -3
- data/lib/hexapdf/cli/images.rb +3 -4
- data/lib/hexapdf/cli/info.rb +5 -5
- data/lib/hexapdf/cli/inspect.rb +6 -6
- data/lib/hexapdf/cli/merge.rb +6 -6
- data/lib/hexapdf/cli/modify.rb +4 -4
- data/lib/hexapdf/cli/optimize.rb +3 -3
- data/lib/hexapdf/configuration.rb +4 -5
- data/lib/hexapdf/content.rb +2 -2
- data/lib/hexapdf/content/canvas.rb +35 -36
- data/lib/hexapdf/content/color_space.rb +9 -14
- data/lib/hexapdf/content/graphic_object.rb +2 -2
- data/lib/hexapdf/content/graphic_object/arc.rb +3 -3
- data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +2 -2
- data/lib/hexapdf/content/graphic_object/solid_arc.rb +4 -8
- data/lib/hexapdf/content/graphics_state.rb +4 -13
- data/lib/hexapdf/content/operator.rb +33 -35
- data/lib/hexapdf/content/parser.rb +28 -18
- data/lib/hexapdf/content/processor.rb +4 -5
- data/lib/hexapdf/content/transformation_matrix.rb +2 -2
- data/lib/hexapdf/data_dir.rb +2 -2
- data/lib/hexapdf/dictionary.rb +8 -9
- data/lib/hexapdf/dictionary_fields.rb +7 -10
- data/lib/hexapdf/document.rb +18 -18
- data/lib/hexapdf/document/files.rb +12 -10
- data/lib/hexapdf/document/fonts.rb +2 -2
- data/lib/hexapdf/document/images.rb +3 -3
- data/lib/hexapdf/document/pages.rb +4 -4
- data/lib/hexapdf/encryption.rb +2 -2
- data/lib/hexapdf/encryption/aes.rb +2 -2
- data/lib/hexapdf/encryption/arc4.rb +4 -4
- data/lib/hexapdf/encryption/fast_aes.rb +2 -2
- data/lib/hexapdf/encryption/fast_arc4.rb +4 -4
- data/lib/hexapdf/encryption/identity.rb +5 -4
- data/lib/hexapdf/encryption/ruby_aes.rb +147 -139
- data/lib/hexapdf/encryption/ruby_arc4.rb +4 -4
- data/lib/hexapdf/encryption/security_handler.rb +11 -12
- data/lib/hexapdf/encryption/standard_security_handler.rb +6 -9
- data/lib/hexapdf/error.rb +7 -9
- data/lib/hexapdf/filter.rb +2 -3
- data/lib/hexapdf/filter/ascii85_decode.rb +3 -3
- data/lib/hexapdf/filter/ascii_hex_decode.rb +2 -2
- data/lib/hexapdf/filter/dct_decode.rb +2 -2
- data/lib/hexapdf/filter/encryption.rb +2 -2
- data/lib/hexapdf/filter/flate_decode.rb +16 -33
- data/lib/hexapdf/filter/jpx_decode.rb +2 -2
- data/lib/hexapdf/filter/lzw_decode.rb +4 -4
- data/lib/hexapdf/filter/predictor.rb +2 -6
- data/lib/hexapdf/filter/run_length_decode.rb +2 -2
- data/lib/hexapdf/font/cmap.rb +2 -3
- data/lib/hexapdf/font/cmap/parser.rb +11 -11
- data/lib/hexapdf/font/cmap/writer.rb +25 -25
- data/lib/hexapdf/font/encoding.rb +2 -2
- data/lib/hexapdf/font/encoding/base.rb +2 -2
- data/lib/hexapdf/font/encoding/difference_encoding.rb +2 -2
- data/lib/hexapdf/font/encoding/glyph_list.rb +6 -6
- data/lib/hexapdf/font/encoding/mac_expert_encoding.rb +2 -2
- data/lib/hexapdf/font/encoding/mac_roman_encoding.rb +2 -2
- data/lib/hexapdf/font/encoding/standard_encoding.rb +2 -2
- data/lib/hexapdf/font/encoding/symbol_encoding.rb +2 -2
- data/lib/hexapdf/font/encoding/win_ansi_encoding.rb +2 -2
- data/lib/hexapdf/font/encoding/zapf_dingbats_encoding.rb +2 -2
- data/lib/hexapdf/font/invalid_glyph.rb +7 -7
- data/lib/hexapdf/font/true_type.rb +2 -2
- data/lib/hexapdf/font/true_type/builder.rb +13 -7
- data/lib/hexapdf/font/true_type/font.rb +2 -3
- data/lib/hexapdf/font/true_type/optimizer.rb +2 -2
- data/lib/hexapdf/font/true_type/subsetter.rb +4 -4
- data/lib/hexapdf/font/true_type/table.rb +3 -5
- data/lib/hexapdf/font/true_type/table/cmap.rb +2 -2
- data/lib/hexapdf/font/true_type/table/cmap_subtable.rb +9 -16
- data/lib/hexapdf/font/true_type/table/directory.rb +4 -4
- data/lib/hexapdf/font/true_type/table/glyf.rb +2 -2
- data/lib/hexapdf/font/true_type/table/head.rb +3 -2
- data/lib/hexapdf/font/true_type/table/hhea.rb +2 -2
- data/lib/hexapdf/font/true_type/table/hmtx.rb +2 -2
- data/lib/hexapdf/font/true_type/table/kern.rb +3 -3
- data/lib/hexapdf/font/true_type/table/loca.rb +3 -3
- data/lib/hexapdf/font/true_type/table/maxp.rb +2 -2
- data/lib/hexapdf/font/true_type/table/name.rb +3 -5
- data/lib/hexapdf/font/true_type/table/os2.rb +4 -3
- data/lib/hexapdf/font/true_type/table/post.rb +3 -7
- data/lib/hexapdf/font/true_type_wrapper.rb +20 -22
- data/lib/hexapdf/font/type1.rb +2 -2
- data/lib/hexapdf/font/type1/afm_parser.rb +7 -7
- data/lib/hexapdf/font/type1/character_metrics.rb +2 -2
- data/lib/hexapdf/font/type1/font.rb +3 -3
- data/lib/hexapdf/font/type1/font_metrics.rb +2 -4
- data/lib/hexapdf/font/type1/pfb_parser.rb +2 -2
- data/lib/hexapdf/font/type1_wrapper.rb +8 -9
- data/lib/hexapdf/font_loader.rb +2 -2
- data/lib/hexapdf/font_loader/from_configuration.rb +2 -2
- data/lib/hexapdf/font_loader/from_file.rb +2 -2
- data/lib/hexapdf/font_loader/standard14.rb +2 -2
- data/lib/hexapdf/image_loader.rb +2 -2
- data/lib/hexapdf/image_loader/jpeg.rb +6 -4
- data/lib/hexapdf/image_loader/pdf.rb +2 -2
- data/lib/hexapdf/image_loader/png.rb +6 -6
- data/lib/hexapdf/importer.rb +6 -4
- data/lib/hexapdf/layout.rb +2 -2
- data/lib/hexapdf/layout/box.rb +4 -4
- data/lib/hexapdf/layout/inline_box.rb +2 -2
- data/lib/hexapdf/layout/line.rb +6 -6
- data/lib/hexapdf/layout/numeric_refinements.rb +2 -2
- data/lib/hexapdf/layout/style.rb +17 -8
- data/lib/hexapdf/layout/text_fragment.rb +86 -48
- data/lib/hexapdf/layout/text_layouter.rb +40 -21
- data/lib/hexapdf/layout/text_shaper.rb +2 -2
- data/lib/hexapdf/name_tree_node.rb +2 -2
- data/lib/hexapdf/number_tree_node.rb +2 -2
- data/lib/hexapdf/object.rb +6 -8
- data/lib/hexapdf/parser.rb +10 -10
- data/lib/hexapdf/rectangle.rb +4 -4
- data/lib/hexapdf/reference.rb +2 -2
- data/lib/hexapdf/revision.rb +4 -4
- data/lib/hexapdf/revisions.rb +5 -5
- data/lib/hexapdf/serializer.rb +27 -24
- data/lib/hexapdf/stream.rb +4 -4
- data/lib/hexapdf/task.rb +2 -2
- data/lib/hexapdf/task/dereference.rb +4 -4
- data/lib/hexapdf/task/optimize.rb +5 -4
- data/lib/hexapdf/tokenizer.rb +12 -14
- data/lib/hexapdf/type.rb +2 -2
- data/lib/hexapdf/type/action.rb +3 -3
- data/lib/hexapdf/type/actions.rb +2 -2
- data/lib/hexapdf/type/actions/go_to.rb +2 -2
- data/lib/hexapdf/type/actions/go_to_r.rb +2 -2
- data/lib/hexapdf/type/actions/launch.rb +2 -2
- data/lib/hexapdf/type/actions/uri.rb +3 -3
- data/lib/hexapdf/type/annotation.rb +3 -3
- data/lib/hexapdf/type/annotations.rb +2 -2
- data/lib/hexapdf/type/annotations/link.rb +2 -2
- data/lib/hexapdf/type/annotations/markup_annotation.rb +2 -2
- data/lib/hexapdf/type/annotations/text.rb +2 -2
- data/lib/hexapdf/type/catalog.rb +4 -4
- data/lib/hexapdf/type/cid_font.rb +4 -5
- data/lib/hexapdf/type/embedded_file.rb +3 -3
- data/lib/hexapdf/type/file_specification.rb +6 -7
- data/lib/hexapdf/type/font.rb +4 -4
- data/lib/hexapdf/type/font_descriptor.rb +3 -4
- data/lib/hexapdf/type/font_simple.rb +12 -16
- data/lib/hexapdf/type/font_true_type.rb +2 -2
- data/lib/hexapdf/type/font_type0.rb +5 -5
- data/lib/hexapdf/type/font_type1.rb +4 -4
- data/lib/hexapdf/type/form.rb +3 -3
- data/lib/hexapdf/type/graphics_state_parameter.rb +3 -3
- data/lib/hexapdf/type/image.rb +13 -14
- data/lib/hexapdf/type/info.rb +2 -2
- data/lib/hexapdf/type/names.rb +2 -2
- data/lib/hexapdf/type/object_stream.rb +5 -5
- data/lib/hexapdf/type/page.rb +9 -10
- data/lib/hexapdf/type/page_tree_node.rb +5 -6
- data/lib/hexapdf/type/resources.rb +11 -11
- data/lib/hexapdf/type/trailer.rb +3 -3
- data/lib/hexapdf/type/viewer_preferences.rb +2 -2
- data/lib/hexapdf/type/xref_stream.rb +8 -4
- data/lib/hexapdf/utils/bit_field.rb +4 -4
- data/lib/hexapdf/utils/bit_stream.rb +4 -4
- data/lib/hexapdf/utils/graphics_helpers.rb +2 -2
- data/lib/hexapdf/utils/lru_cache.rb +2 -2
- data/lib/hexapdf/utils/math_helpers.rb +2 -2
- data/lib/hexapdf/utils/object_hash.rb +3 -3
- data/lib/hexapdf/utils/pdf_doc_encoding.rb +3 -3
- data/lib/hexapdf/utils/sorted_tree_node.rb +12 -11
- data/lib/hexapdf/version.rb +3 -3
- data/lib/hexapdf/writer.rb +8 -8
- data/lib/hexapdf/xref_section.rb +3 -3
- data/test/hexapdf/common_tokenizer_tests.rb +6 -7
- data/test/hexapdf/content/graphic_object/test_endpoint_arc.rb +0 -1
- data/test/hexapdf/content/test_canvas.rb +28 -36
- data/test/hexapdf/content/test_color_space.rb +4 -0
- data/test/hexapdf/content/test_graphics_state.rb +2 -0
- data/test/hexapdf/content/test_operator.rb +6 -7
- data/test/hexapdf/content/test_parser.rb +2 -2
- data/test/hexapdf/content/test_processor.rb +1 -1
- data/test/hexapdf/document/test_files.rb +1 -0
- data/test/hexapdf/document/test_images.rb +1 -1
- data/test/hexapdf/encryption/common.rb +3 -3
- data/test/hexapdf/encryption/test_aes.rb +10 -4
- data/test/hexapdf/encryption/test_identity.rb +1 -1
- data/test/hexapdf/encryption/test_security_handler.rb +13 -17
- data/test/hexapdf/encryption/test_standard_security_handler.rb +12 -12
- data/test/hexapdf/filter/test_ascii85_decode.rb +2 -3
- data/test/hexapdf/filter/test_ascii_hex_decode.rb +6 -1
- data/test/hexapdf/filter/test_flate_decode.rb +2 -2
- data/test/hexapdf/filter/test_lzw_decode.rb +10 -10
- data/test/hexapdf/filter/test_predictor.rb +10 -2
- data/test/hexapdf/filter/test_run_length_decode.rb +1 -1
- data/test/hexapdf/font/cmap/test_parser.rb +40 -40
- data/test/hexapdf/font/cmap/test_writer.rb +29 -29
- data/test/hexapdf/font/test_true_type_wrapper.rb +3 -2
- data/test/hexapdf/font/true_type/common.rb +2 -0
- data/test/hexapdf/font/true_type/table/test_cmap.rb +1 -1
- data/test/hexapdf/font/true_type/table/test_cmap_subtable.rb +5 -4
- data/test/hexapdf/font/true_type/table/test_glyf.rb +2 -2
- data/test/hexapdf/font/true_type/table/test_head.rb +2 -2
- data/test/hexapdf/font/true_type/table/test_name.rb +9 -6
- data/test/hexapdf/font/true_type/test_builder.rb +8 -3
- data/test/hexapdf/font/true_type/test_optimizer.rb +1 -2
- data/test/hexapdf/font/type1/test_afm_parser.rb +2 -2
- data/test/hexapdf/image_loader/test_jpeg.rb +1 -1
- data/test/hexapdf/image_loader/test_pdf.rb +1 -1
- data/test/hexapdf/image_loader/test_png.rb +3 -3
- data/test/hexapdf/layout/test_inline_box.rb +10 -1
- data/test/hexapdf/layout/test_line.rb +4 -4
- data/test/hexapdf/layout/test_style.rb +19 -7
- data/test/hexapdf/layout/test_text_fragment.rb +73 -27
- data/test/hexapdf/layout/test_text_layouter.rb +84 -68
- data/test/hexapdf/layout/test_text_shaper.rb +4 -6
- data/test/hexapdf/task/test_dereference.rb +2 -2
- data/test/hexapdf/task/test_optimize.rb +16 -7
- data/test/hexapdf/test_configuration.rb +1 -1
- data/test/hexapdf/test_data_dir.rb +2 -2
- data/test/hexapdf/test_dictionary.rb +6 -3
- data/test/hexapdf/test_dictionary_fields.rb +15 -14
- data/test/hexapdf/test_document.rb +47 -48
- data/test/hexapdf/test_filter.rb +30 -26
- data/test/hexapdf/test_importer.rb +14 -0
- data/test/hexapdf/test_object.rb +16 -4
- data/test/hexapdf/test_parser.rb +36 -36
- data/test/hexapdf/test_reference.rb +7 -5
- data/test/hexapdf/test_revision.rb +1 -1
- data/test/hexapdf/test_revisions.rb +90 -90
- data/test/hexapdf/test_serializer.rb +3 -2
- data/test/hexapdf/test_stream.rb +2 -4
- data/test/hexapdf/test_tokenizer.rb +2 -2
- data/test/hexapdf/test_writer.rb +80 -80
- data/test/hexapdf/test_xref_section.rb +1 -1
- data/test/hexapdf/type/annotations/test_link.rb +1 -1
- data/test/hexapdf/type/annotations/test_text.rb +3 -3
- data/test/hexapdf/type/test_font_descriptor.rb +1 -1
- data/test/hexapdf/type/test_font_simple.rb +2 -2
- data/test/hexapdf/type/test_font_type0.rb +0 -1
- data/test/hexapdf/type/test_image.rb +0 -3
- data/test/hexapdf/type/test_object_stream.rb +2 -1
- data/test/hexapdf/type/test_page.rb +5 -1
- data/test/hexapdf/type/test_page_tree_node.rb +4 -4
- data/test/hexapdf/type/test_trailer.rb +1 -1
- data/test/hexapdf/type/test_xref_stream.rb +4 -0
- data/test/hexapdf/utils/test_bit_field.rb +2 -0
- data/test/hexapdf/utils/test_bit_stream.rb +1 -1
- data/test/hexapdf/utils/test_lru_cache.rb +1 -1
- data/test/hexapdf/utils/test_sorted_tree_node.rb +10 -4
- data/test/test_helper.rb +3 -6
- metadata +3 -3
data/test/hexapdf/test_parser.rb
CHANGED
|
@@ -10,42 +10,42 @@ describe HexaPDF::Parser do
|
|
|
10
10
|
@document = HexaPDF::Document.new
|
|
11
11
|
@document.add(@document.wrap(10, oid: 1, gen: 0))
|
|
12
12
|
|
|
13
|
-
create_parser(
|
|
14
|
-
%PDF-1.7
|
|
15
|
-
|
|
16
|
-
1 0 obj
|
|
17
|
-
10
|
|
18
|
-
endobj
|
|
19
|
-
|
|
20
|
-
2 0 obj
|
|
21
|
-
[ 5 6 <</Length 10 >> (name) <4E6F762073 686D6F7A20 6B612070
|
|
22
|
-
6F702E>]
|
|
23
|
-
endobj
|
|
24
|
-
|
|
25
|
-
3 15 obj<< /Length 1 0 R/Hallo 6/Filter /Fl/DecodeParms<<>> >>stream
|
|
26
|
-
Hallo PDF!endstream
|
|
27
|
-
endobj
|
|
28
|
-
|
|
29
|
-
4 0 obj
|
|
30
|
-
<</Type /XRef /Length 3 /W [1 1 1] /Index [1 1] /Size 2 >> stream
|
|
31
|
-
\x01\x0A\x00
|
|
32
|
-
endstream
|
|
33
|
-
endobj
|
|
34
|
-
|
|
35
|
-
xref
|
|
36
|
-
0 4
|
|
37
|
-
0000000000 65535 f
|
|
38
|
-
0000000010 00000 n
|
|
39
|
-
0000000029 00000 n
|
|
40
|
-
0000000000 65535 f
|
|
41
|
-
3 1
|
|
42
|
-
0000000556 00000 n
|
|
43
|
-
trailer
|
|
44
|
-
<< /Test (now) >>
|
|
45
|
-
startxref
|
|
46
|
-
308
|
|
47
|
-
%%EOF
|
|
48
|
-
EOF
|
|
13
|
+
create_parser(<<~EOF)
|
|
14
|
+
%PDF-1.7
|
|
15
|
+
|
|
16
|
+
1 0 obj
|
|
17
|
+
10
|
|
18
|
+
endobj
|
|
19
|
+
|
|
20
|
+
2 0 obj
|
|
21
|
+
[ 5 6 <</Length 10 >> (name) <4E6F762073 686D6F7A20 6B612070
|
|
22
|
+
6F702E>]
|
|
23
|
+
endobj
|
|
24
|
+
|
|
25
|
+
3 15 obj<< /Length 1 0 R/Hallo 6/Filter /Fl/DecodeParms<<>> >>stream
|
|
26
|
+
Hallo PDF!endstream
|
|
27
|
+
endobj
|
|
28
|
+
|
|
29
|
+
4 0 obj
|
|
30
|
+
<</Type /XRef /Length 3 /W [1 1 1] /Index [1 1] /Size 2 >> stream
|
|
31
|
+
\x01\x0A\x00
|
|
32
|
+
endstream
|
|
33
|
+
endobj
|
|
34
|
+
|
|
35
|
+
xref
|
|
36
|
+
0 4
|
|
37
|
+
0000000000 65535 f
|
|
38
|
+
0000000010 00000 n
|
|
39
|
+
0000000029 00000 n
|
|
40
|
+
0000000000 65535 f
|
|
41
|
+
3 1
|
|
42
|
+
0000000556 00000 n
|
|
43
|
+
trailer
|
|
44
|
+
<< /Test (now) >>
|
|
45
|
+
startxref
|
|
46
|
+
308
|
|
47
|
+
%%EOF
|
|
48
|
+
EOF
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
def create_parser(str)
|
|
@@ -15,11 +15,13 @@ describe HexaPDF::Reference do
|
|
|
15
15
|
assert_raises(ArgumentError) { HexaPDF::Reference.new(5, 'b') }
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
it "is sortable" do
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
it "is sortable w.r.t to other objects implementing #oid and #gen" do
|
|
19
|
+
obj = Object.new
|
|
20
|
+
obj.define_singleton_method(:oid) { 1 }
|
|
21
|
+
obj.define_singleton_method(:gen) { 0 }
|
|
22
|
+
assert_equal([obj, HexaPDF::Reference.new(1, 1), HexaPDF::Reference.new(5, 7)],
|
|
23
|
+
[HexaPDF::Reference.new(5, 7), HexaPDF::Reference.new(1, 1), obj].sort)
|
|
24
|
+
assert_nil(HexaPDF::Reference.new(1, 0) <=> 5)
|
|
23
25
|
end
|
|
24
26
|
|
|
25
27
|
it "is comparable to itself" do
|
|
@@ -82,7 +82,7 @@ describe HexaPDF::Revision do
|
|
|
82
82
|
assert_equal(0, obj.gen)
|
|
83
83
|
end
|
|
84
84
|
|
|
85
|
-
it "loads an object that is defined in the cross-reference section
|
|
85
|
+
it "loads an object that is defined in the cross-reference section using the object number" do
|
|
86
86
|
obj = @rev.object(2)
|
|
87
87
|
refute_nil(obj)
|
|
88
88
|
end
|
|
@@ -7,65 +7,65 @@ require 'stringio'
|
|
|
7
7
|
|
|
8
8
|
describe HexaPDF::Revisions do
|
|
9
9
|
before do
|
|
10
|
-
@io = StringIO.new(
|
|
11
|
-
%PDF-1.7
|
|
12
|
-
1 0 obj
|
|
13
|
-
10
|
|
14
|
-
endobj
|
|
15
|
-
|
|
16
|
-
2 0 obj
|
|
17
|
-
20
|
|
18
|
-
endobj
|
|
19
|
-
|
|
20
|
-
xref
|
|
21
|
-
0 3
|
|
22
|
-
0000000000 65535 f
|
|
23
|
-
0000000009 00000 n
|
|
24
|
-
0000000028 00000 n
|
|
25
|
-
trailer
|
|
26
|
-
<< /Size 3 >>
|
|
27
|
-
startxref
|
|
28
|
-
47
|
|
29
|
-
%%EOF
|
|
30
|
-
|
|
31
|
-
2 0 obj
|
|
32
|
-
300
|
|
33
|
-
endobj
|
|
34
|
-
|
|
35
|
-
3 0 obj
|
|
36
|
-
<< /Type /XRef /Size 4 /Index [2 1] /W [1 1 1] /Filter /ASCIIHexDecode /Length 6
|
|
37
|
-
>>stream
|
|
38
|
-
019E00
|
|
39
|
-
endstream
|
|
40
|
-
endobj
|
|
41
|
-
|
|
42
|
-
2 0 obj
|
|
43
|
-
200
|
|
44
|
-
endobj
|
|
45
|
-
|
|
46
|
-
xref
|
|
47
|
-
2 2
|
|
48
|
-
0000000301 00000 n
|
|
49
|
-
0000000178 00000 n
|
|
50
|
-
trailer
|
|
51
|
-
<< /Size 4 /Prev 47 >>
|
|
52
|
-
startxref
|
|
53
|
-
321
|
|
54
|
-
%%EOF
|
|
55
|
-
|
|
56
|
-
2 0 obj
|
|
57
|
-
400
|
|
58
|
-
endobj
|
|
59
|
-
|
|
60
|
-
xref
|
|
61
|
-
2 1
|
|
62
|
-
0000000422 00000 n
|
|
63
|
-
trailer
|
|
64
|
-
<< /Size 4 /Prev 321 /XRefStm 178 >>
|
|
65
|
-
startxref
|
|
66
|
-
442
|
|
67
|
-
%%EOF
|
|
68
|
-
EOF
|
|
10
|
+
@io = StringIO.new(<<~EOF)
|
|
11
|
+
%PDF-1.7
|
|
12
|
+
1 0 obj
|
|
13
|
+
10
|
|
14
|
+
endobj
|
|
15
|
+
|
|
16
|
+
2 0 obj
|
|
17
|
+
20
|
|
18
|
+
endobj
|
|
19
|
+
|
|
20
|
+
xref
|
|
21
|
+
0 3
|
|
22
|
+
0000000000 65535 f
|
|
23
|
+
0000000009 00000 n
|
|
24
|
+
0000000028 00000 n
|
|
25
|
+
trailer
|
|
26
|
+
<< /Size 3 >>
|
|
27
|
+
startxref
|
|
28
|
+
47
|
|
29
|
+
%%EOF
|
|
30
|
+
|
|
31
|
+
2 0 obj
|
|
32
|
+
300
|
|
33
|
+
endobj
|
|
34
|
+
|
|
35
|
+
3 0 obj
|
|
36
|
+
<< /Type /XRef /Size 4 /Index [2 1] /W [1 1 1] /Filter /ASCIIHexDecode /Length 6
|
|
37
|
+
>>stream
|
|
38
|
+
019E00
|
|
39
|
+
endstream
|
|
40
|
+
endobj
|
|
41
|
+
|
|
42
|
+
2 0 obj
|
|
43
|
+
200
|
|
44
|
+
endobj
|
|
45
|
+
|
|
46
|
+
xref
|
|
47
|
+
2 2
|
|
48
|
+
0000000301 00000 n
|
|
49
|
+
0000000178 00000 n
|
|
50
|
+
trailer
|
|
51
|
+
<< /Size 4 /Prev 47 >>
|
|
52
|
+
startxref
|
|
53
|
+
321
|
|
54
|
+
%%EOF
|
|
55
|
+
|
|
56
|
+
2 0 obj
|
|
57
|
+
400
|
|
58
|
+
endobj
|
|
59
|
+
|
|
60
|
+
xref
|
|
61
|
+
2 1
|
|
62
|
+
0000000422 00000 n
|
|
63
|
+
trailer
|
|
64
|
+
<< /Size 4 /Prev 321 /XRefStm 178 >>
|
|
65
|
+
startxref
|
|
66
|
+
442
|
|
67
|
+
%%EOF
|
|
68
|
+
EOF
|
|
69
69
|
@doc = HexaPDF::Document.new(io: @io)
|
|
70
70
|
@revisions = @doc.revisions
|
|
71
71
|
end
|
|
@@ -82,13 +82,13 @@ EOF
|
|
|
82
82
|
it "allows deleting a revision by index" do
|
|
83
83
|
rev = @revisions.revision(0)
|
|
84
84
|
@revisions.delete(0)
|
|
85
|
-
refute(@revisions.any? {|r| r == rev})
|
|
85
|
+
refute(@revisions.any? {|r| r == rev })
|
|
86
86
|
end
|
|
87
87
|
|
|
88
88
|
it "allows deleting a revision by specifying a revision" do
|
|
89
89
|
rev = @revisions.revision(0)
|
|
90
90
|
@revisions.delete(rev)
|
|
91
|
-
refute(@revisions.any? {|r| r == rev})
|
|
91
|
+
refute(@revisions.any? {|r| r == rev })
|
|
92
92
|
end
|
|
93
93
|
|
|
94
94
|
it "fails when trying to delete the only existing revision" do
|
|
@@ -125,35 +125,35 @@ EOF
|
|
|
125
125
|
end
|
|
126
126
|
|
|
127
127
|
it "handles invalid PDFs that have a loop via the xref /Prev or /XRefStm entries" do
|
|
128
|
-
io = StringIO.new(
|
|
129
|
-
%PDF-1.7
|
|
130
|
-
1 0 obj
|
|
131
|
-
10
|
|
132
|
-
endobj
|
|
133
|
-
|
|
134
|
-
xref
|
|
135
|
-
0 2
|
|
136
|
-
0000000000 65535 f
|
|
137
|
-
0000000009 00000 n
|
|
138
|
-
trailer
|
|
139
|
-
<< /Size 2 /Prev 148>>
|
|
140
|
-
startxref
|
|
141
|
-
28
|
|
142
|
-
%%EOF
|
|
143
|
-
|
|
144
|
-
2 0 obj
|
|
145
|
-
300
|
|
146
|
-
endobj
|
|
147
|
-
|
|
148
|
-
xref
|
|
149
|
-
2 1
|
|
150
|
-
0000000301 00000 n
|
|
151
|
-
trailer
|
|
152
|
-
<< /Size 3 /Prev 28 /XRefStm 148>>
|
|
153
|
-
startxref
|
|
154
|
-
148
|
|
155
|
-
%%EOF
|
|
156
|
-
EOF
|
|
128
|
+
io = StringIO.new(<<~EOF)
|
|
129
|
+
%PDF-1.7
|
|
130
|
+
1 0 obj
|
|
131
|
+
10
|
|
132
|
+
endobj
|
|
133
|
+
|
|
134
|
+
xref
|
|
135
|
+
0 2
|
|
136
|
+
0000000000 65535 f
|
|
137
|
+
0000000009 00000 n
|
|
138
|
+
trailer
|
|
139
|
+
<< /Size 2 /Prev 148>>
|
|
140
|
+
startxref
|
|
141
|
+
28
|
|
142
|
+
%%EOF
|
|
143
|
+
|
|
144
|
+
2 0 obj
|
|
145
|
+
300
|
|
146
|
+
endobj
|
|
147
|
+
|
|
148
|
+
xref
|
|
149
|
+
2 1
|
|
150
|
+
0000000301 00000 n
|
|
151
|
+
trailer
|
|
152
|
+
<< /Size 3 /Prev 28 /XRefStm 148>>
|
|
153
|
+
startxref
|
|
154
|
+
148
|
|
155
|
+
%%EOF
|
|
156
|
+
EOF
|
|
157
157
|
doc = HexaPDF::Document.new(io: io)
|
|
158
158
|
assert_equal(2, doc.revisions.count)
|
|
159
159
|
end
|
|
@@ -47,7 +47,7 @@ describe HexaPDF::Serializer do
|
|
|
47
47
|
assert_serialized("100", 100)
|
|
48
48
|
assert_serialized("-100", -100)
|
|
49
49
|
assert_serialized("0", 0)
|
|
50
|
-
assert_serialized("1208925819614629174706176",
|
|
50
|
+
assert_serialized("1208925819614629174706176", 1_208_925_819_614_629_174_706_176)
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
it "serializes floats with a precision of 4" do
|
|
@@ -105,7 +105,8 @@ describe HexaPDF::Serializer do
|
|
|
105
105
|
assert_serialized("(D:20150416094100+01'00')", Time.new(2015, 04, 16, 9, 41, 0, 3600))
|
|
106
106
|
assert_serialized("(D:20150416094100-01'20')", Time.new(2015, 04, 16, 9, 41, 0, -4800))
|
|
107
107
|
assert_serialized("(D:20150416000000+02'00')", Date.parse("2015-04-16 9:41:00 +02:00"))
|
|
108
|
-
assert_serialized("(D:20150416094100+02'00')",
|
|
108
|
+
assert_serialized("(D:20150416094100+02'00')",
|
|
109
|
+
Time.parse("2015-04-16 9:41:00 +02:00").to_datetime)
|
|
109
110
|
ensure
|
|
110
111
|
ENV['TZ'] = tz
|
|
111
112
|
end
|
data/test/hexapdf/test_stream.rb
CHANGED
|
@@ -7,7 +7,6 @@ require 'tempfile'
|
|
|
7
7
|
require 'hexapdf/configuration'
|
|
8
8
|
require 'hexapdf/stream'
|
|
9
9
|
|
|
10
|
-
|
|
11
10
|
describe HexaPDF::StreamData do
|
|
12
11
|
it "fails if no valid source is specified on creation" do
|
|
13
12
|
assert_raises(ArgumentError) { HexaPDF::StreamData.new }
|
|
@@ -61,7 +60,6 @@ describe HexaPDF::StreamData do
|
|
|
61
60
|
end
|
|
62
61
|
end
|
|
63
62
|
|
|
64
|
-
|
|
65
63
|
describe HexaPDF::Stream do
|
|
66
64
|
include TestHelper
|
|
67
65
|
|
|
@@ -134,7 +132,7 @@ describe HexaPDF::Stream do
|
|
|
134
132
|
def encoded_data(str, encoders = [])
|
|
135
133
|
map = @document.config['filter.map']
|
|
136
134
|
tmp = feeder(str)
|
|
137
|
-
encoders.each {|e| tmp = ::Object.const_get(map[e]).encoder(tmp)}
|
|
135
|
+
encoders.each {|e| tmp = ::Object.const_get(map[e]).encoder(tmp) }
|
|
138
136
|
collector(tmp)
|
|
139
137
|
end
|
|
140
138
|
|
|
@@ -153,7 +151,7 @@ describe HexaPDF::Stream do
|
|
|
153
151
|
end
|
|
154
152
|
|
|
155
153
|
it "works with a Proc object inside StreamData" do
|
|
156
|
-
@stm.stream = HexaPDF::StreamData.new(proc {'testing'})
|
|
154
|
+
@stm.stream = HexaPDF::StreamData.new(proc { 'testing' })
|
|
157
155
|
assert_equal('testing', collector(@stm.stream_decoder))
|
|
158
156
|
end
|
|
159
157
|
|
|
@@ -21,10 +21,10 @@ describe HexaPDF::Tokenizer do
|
|
|
21
21
|
assert_equal(HexaPDF::Reference.new(2, 15), @tokenizer.next_object)
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
it "next_token: should not fail when resetting the position (due to
|
|
24
|
+
it "next_token: should not fail when resetting the position (due to use of an internal buffer)" do
|
|
25
25
|
create_tokenizer("0 1 2 3 4 " * 4000)
|
|
26
26
|
4000.times do
|
|
27
|
-
5.times {|i| assert_equal(i, @tokenizer.next_token)}
|
|
27
|
+
5.times {|i| assert_equal(i, @tokenizer.next_token) }
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
30
|
end
|
data/test/hexapdf/test_writer.rb
CHANGED
|
@@ -7,87 +7,87 @@ require 'stringio'
|
|
|
7
7
|
|
|
8
8
|
describe HexaPDF::Writer do
|
|
9
9
|
before do
|
|
10
|
-
@std_input_io = StringIO.new(
|
|
11
|
-
%PDF-1.7
|
|
12
|
-
%\xCF\xEC\xFF\xE8\xD7\xCB\xCD
|
|
13
|
-
1 0 obj
|
|
14
|
-
10
|
|
15
|
-
endobj
|
|
16
|
-
2 0 obj
|
|
17
|
-
20
|
|
18
|
-
endobj
|
|
19
|
-
xref
|
|
20
|
-
0 3
|
|
21
|
-
0000000000 65535 f
|
|
22
|
-
0000000018 00000 n
|
|
23
|
-
0000000036 00000 n
|
|
24
|
-
trailer
|
|
25
|
-
<</Size 3>>
|
|
26
|
-
startxref
|
|
27
|
-
54
|
|
28
|
-
%%EOF
|
|
29
|
-
2 0 obj
|
|
30
|
-
<</Length 10>>stream
|
|
31
|
-
Some data!
|
|
32
|
-
endstream
|
|
33
|
-
endobj
|
|
34
|
-
xref
|
|
35
|
-
2 1
|
|
36
|
-
0000000162 00000 n
|
|
37
|
-
trailer
|
|
38
|
-
<</Size 3/Prev 54>>
|
|
39
|
-
startxref
|
|
40
|
-
219
|
|
41
|
-
%%EOF
|
|
42
|
-
3 0 obj
|
|
43
|
-
<</Producer(HexaPDF version 0.
|
|
44
|
-
endobj
|
|
45
|
-
xref
|
|
46
|
-
3 1
|
|
47
|
-
0000000296 00000 n
|
|
48
|
-
trailer
|
|
49
|
-
<</Prev 219/Size 4/Root<</Type/Catalog>>/Info 3 0 R>>
|
|
50
|
-
startxref
|
|
51
|
-
348
|
|
52
|
-
%%EOF
|
|
53
|
-
EOF
|
|
10
|
+
@std_input_io = StringIO.new(<<~EOF.force_encoding(Encoding::BINARY))
|
|
11
|
+
%PDF-1.7
|
|
12
|
+
%\xCF\xEC\xFF\xE8\xD7\xCB\xCD
|
|
13
|
+
1 0 obj
|
|
14
|
+
10
|
|
15
|
+
endobj
|
|
16
|
+
2 0 obj
|
|
17
|
+
20
|
|
18
|
+
endobj
|
|
19
|
+
xref
|
|
20
|
+
0 3
|
|
21
|
+
0000000000 65535 f
|
|
22
|
+
0000000018 00000 n
|
|
23
|
+
0000000036 00000 n
|
|
24
|
+
trailer
|
|
25
|
+
<</Size 3>>
|
|
26
|
+
startxref
|
|
27
|
+
54
|
|
28
|
+
%%EOF
|
|
29
|
+
2 0 obj
|
|
30
|
+
<</Length 10>>stream
|
|
31
|
+
Some data!
|
|
32
|
+
endstream
|
|
33
|
+
endobj
|
|
34
|
+
xref
|
|
35
|
+
2 1
|
|
36
|
+
0000000162 00000 n
|
|
37
|
+
trailer
|
|
38
|
+
<</Size 3/Prev 54>>
|
|
39
|
+
startxref
|
|
40
|
+
219
|
|
41
|
+
%%EOF
|
|
42
|
+
3 0 obj
|
|
43
|
+
<</Producer(HexaPDF version 0.7.0)>>
|
|
44
|
+
endobj
|
|
45
|
+
xref
|
|
46
|
+
3 1
|
|
47
|
+
0000000296 00000 n
|
|
48
|
+
trailer
|
|
49
|
+
<</Prev 219/Size 4/Root<</Type/Catalog>>/Info 3 0 R>>
|
|
50
|
+
startxref
|
|
51
|
+
348
|
|
52
|
+
%%EOF
|
|
53
|
+
EOF
|
|
54
54
|
|
|
55
|
-
@compressed_input_io = StringIO.new(
|
|
56
|
-
%PDF-1.7
|
|
57
|
-
%\xCF\xEC\xFF\xE8\xD7\xCB\xCD
|
|
58
|
-
5 0 obj
|
|
59
|
-
<</Type/ObjStm/N 1/First 4/Filter/FlateDecode/Length 15>>stream
|
|
60
|
-
x\xDA3T0P04P\x00\x00\x04\xA1\x01#
|
|
61
|
-
endstream
|
|
62
|
-
endobj
|
|
63
|
-
2 0 obj
|
|
64
|
-
20
|
|
65
|
-
endobj
|
|
66
|
-
3 0 obj
|
|
67
|
-
<</Size 6/Type/XRef/W[1 1 2]/Index[0 4 5 1]/Filter/FlateDecode/DecodeParms<</Columns 4/Predictor 12>>/Length 31>>stream
|
|
68
|
-
x\xDAcb`\xF8\xFF\x9F\x89\x89\x95\x91\x91\xE9\x7F\x19\x03\x03\x13\x83\x10\x88he`\x00\x00B4\x04\x1E
|
|
69
|
-
endstream
|
|
70
|
-
endobj
|
|
71
|
-
startxref
|
|
72
|
-
141
|
|
73
|
-
%%EOF
|
|
74
|
-
6 0 obj
|
|
75
|
-
<</Producer(HexaPDF version 0.
|
|
76
|
-
endobj
|
|
77
|
-
2 0 obj
|
|
78
|
-
<</Length 10>>stream
|
|
79
|
-
Some data!
|
|
80
|
-
endstream
|
|
81
|
-
endobj
|
|
82
|
-
4 0 obj
|
|
83
|
-
<</Size 7/Prev 141/Root<</Type/Catalog>>/Info 6 0 R/Type/XRef/W[1 2 2]/Index[2 1 4 1 6 1]/Filter/FlateDecode/DecodeParms<</Columns 5/Predictor 12>>/Length 22>>stream
|
|
84
|
-
x\xDAcbdlc``b`\xB0\x04\x93\x93\x19\x18\x00\f\x0F\x01[
|
|
85
|
-
endstream
|
|
86
|
-
endobj
|
|
87
|
-
startxref
|
|
88
|
-
447
|
|
89
|
-
%%EOF
|
|
90
|
-
EOF
|
|
55
|
+
@compressed_input_io = StringIO.new(<<~EOF.force_encoding(Encoding::BINARY))
|
|
56
|
+
%PDF-1.7
|
|
57
|
+
%\xCF\xEC\xFF\xE8\xD7\xCB\xCD
|
|
58
|
+
5 0 obj
|
|
59
|
+
<</Type/ObjStm/N 1/First 4/Filter/FlateDecode/Length 15>>stream
|
|
60
|
+
x\xDA3T0P04P\x00\x00\x04\xA1\x01#
|
|
61
|
+
endstream
|
|
62
|
+
endobj
|
|
63
|
+
2 0 obj
|
|
64
|
+
20
|
|
65
|
+
endobj
|
|
66
|
+
3 0 obj
|
|
67
|
+
<</Size 6/Type/XRef/W[1 1 2]/Index[0 4 5 1]/Filter/FlateDecode/DecodeParms<</Columns 4/Predictor 12>>/Length 31>>stream
|
|
68
|
+
x\xDAcb`\xF8\xFF\x9F\x89\x89\x95\x91\x91\xE9\x7F\x19\x03\x03\x13\x83\x10\x88he`\x00\x00B4\x04\x1E
|
|
69
|
+
endstream
|
|
70
|
+
endobj
|
|
71
|
+
startxref
|
|
72
|
+
141
|
|
73
|
+
%%EOF
|
|
74
|
+
6 0 obj
|
|
75
|
+
<</Producer(HexaPDF version 0.7.0)>>
|
|
76
|
+
endobj
|
|
77
|
+
2 0 obj
|
|
78
|
+
<</Length 10>>stream
|
|
79
|
+
Some data!
|
|
80
|
+
endstream
|
|
81
|
+
endobj
|
|
82
|
+
4 0 obj
|
|
83
|
+
<</Size 7/Prev 141/Root<</Type/Catalog>>/Info 6 0 R/Type/XRef/W[1 2 2]/Index[2 1 4 1 6 1]/Filter/FlateDecode/DecodeParms<</Columns 5/Predictor 12>>/Length 22>>stream
|
|
84
|
+
x\xDAcbdlc``b`\xB0\x04\x93\x93\x19\x18\x00\f\x0F\x01[
|
|
85
|
+
endstream
|
|
86
|
+
endobj
|
|
87
|
+
startxref
|
|
88
|
+
447
|
|
89
|
+
%%EOF
|
|
90
|
+
EOF
|
|
91
91
|
end
|
|
92
92
|
|
|
93
93
|
def assert_document_conversion(input_io)
|