origami-docspring 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/examples/attachments/attachment.rb +7 -8
  4. data/examples/attachments/nested_document.rb +6 -5
  5. data/examples/encryption/encryption.rb +5 -4
  6. data/examples/events/events.rb +7 -6
  7. data/examples/flash/flash.rb +10 -9
  8. data/examples/forms/javascript.rb +14 -13
  9. data/examples/forms/xfa.rb +67 -66
  10. data/examples/javascript/hello_world.rb +6 -5
  11. data/examples/javascript/js_emulation.rb +26 -26
  12. data/examples/loop/goto.rb +12 -11
  13. data/examples/loop/named.rb +17 -16
  14. data/examples/signature/signature.rb +11 -11
  15. data/examples/uri/javascript.rb +25 -24
  16. data/examples/uri/open-uri.rb +5 -4
  17. data/examples/uri/submitform.rb +11 -10
  18. data/lib/origami/3d.rb +330 -334
  19. data/lib/origami/acroform.rb +267 -268
  20. data/lib/origami/actions.rb +266 -278
  21. data/lib/origami/annotations.rb +659 -670
  22. data/lib/origami/array.rb +192 -196
  23. data/lib/origami/boolean.rb +66 -70
  24. data/lib/origami/catalog.rb +360 -363
  25. data/lib/origami/collections.rb +132 -133
  26. data/lib/origami/compound.rb +125 -129
  27. data/lib/origami/destinations.rb +226 -237
  28. data/lib/origami/dictionary.rb +155 -154
  29. data/lib/origami/encryption.rb +967 -923
  30. data/lib/origami/extensions/fdf.rb +270 -275
  31. data/lib/origami/extensions/ppklite.rb +323 -328
  32. data/lib/origami/filespec.rb +170 -173
  33. data/lib/origami/filters/ascii.rb +162 -167
  34. data/lib/origami/filters/ccitt/tables.rb +248 -252
  35. data/lib/origami/filters/ccitt.rb +309 -312
  36. data/lib/origami/filters/crypt.rb +31 -34
  37. data/lib/origami/filters/dct.rb +47 -50
  38. data/lib/origami/filters/flate.rb +57 -60
  39. data/lib/origami/filters/jbig2.rb +50 -53
  40. data/lib/origami/filters/jpx.rb +40 -43
  41. data/lib/origami/filters/lzw.rb +151 -155
  42. data/lib/origami/filters/predictors.rb +250 -255
  43. data/lib/origami/filters/runlength.rb +111 -115
  44. data/lib/origami/filters.rb +319 -325
  45. data/lib/origami/font.rb +173 -177
  46. data/lib/origami/functions.rb +62 -66
  47. data/lib/origami/graphics/colors.rb +203 -208
  48. data/lib/origami/graphics/instruction.rb +79 -81
  49. data/lib/origami/graphics/path.rb +141 -144
  50. data/lib/origami/graphics/patterns.rb +156 -160
  51. data/lib/origami/graphics/render.rb +51 -47
  52. data/lib/origami/graphics/state.rb +144 -142
  53. data/lib/origami/graphics/text.rb +185 -188
  54. data/lib/origami/graphics/xobject.rb +818 -804
  55. data/lib/origami/graphics.rb +25 -26
  56. data/lib/origami/header.rb +63 -65
  57. data/lib/origami/javascript.rb +718 -651
  58. data/lib/origami/linearization.rb +284 -285
  59. data/lib/origami/metadata.rb +156 -135
  60. data/lib/origami/name.rb +98 -100
  61. data/lib/origami/null.rb +49 -51
  62. data/lib/origami/numeric.rb +133 -135
  63. data/lib/origami/obfuscation.rb +180 -182
  64. data/lib/origami/object.rb +634 -631
  65. data/lib/origami/optionalcontent.rb +147 -149
  66. data/lib/origami/outline.rb +46 -48
  67. data/lib/origami/outputintents.rb +76 -77
  68. data/lib/origami/page.rb +637 -596
  69. data/lib/origami/parser.rb +214 -221
  70. data/lib/origami/parsers/fdf.rb +44 -45
  71. data/lib/origami/parsers/pdf/lazy.rb +147 -154
  72. data/lib/origami/parsers/pdf/linear.rb +104 -109
  73. data/lib/origami/parsers/pdf.rb +109 -107
  74. data/lib/origami/parsers/ppklite.rb +44 -46
  75. data/lib/origami/pdf.rb +886 -896
  76. data/lib/origami/reference.rb +116 -120
  77. data/lib/origami/signature.rb +617 -625
  78. data/lib/origami/stream.rb +560 -558
  79. data/lib/origami/string.rb +366 -368
  80. data/lib/origami/template/patterns.rb +50 -52
  81. data/lib/origami/template/widgets.rb +111 -114
  82. data/lib/origami/trailer.rb +153 -157
  83. data/lib/origami/tree.rb +55 -57
  84. data/lib/origami/version.rb +19 -19
  85. data/lib/origami/webcapture.rb +87 -90
  86. data/lib/origami/xfa/config.rb +409 -414
  87. data/lib/origami/xfa/connectionset.rb +113 -117
  88. data/lib/origami/xfa/datasets.rb +38 -42
  89. data/lib/origami/xfa/localeset.rb +33 -37
  90. data/lib/origami/xfa/package.rb +49 -52
  91. data/lib/origami/xfa/pdf.rb +54 -59
  92. data/lib/origami/xfa/signature.rb +33 -37
  93. data/lib/origami/xfa/sourceset.rb +34 -38
  94. data/lib/origami/xfa/stylesheet.rb +35 -39
  95. data/lib/origami/xfa/template.rb +1630 -1634
  96. data/lib/origami/xfa/xdc.rb +33 -37
  97. data/lib/origami/xfa/xfa.rb +132 -123
  98. data/lib/origami/xfa/xfdf.rb +34 -38
  99. data/lib/origami/xfa/xmpmeta.rb +34 -38
  100. data/lib/origami/xfa.rb +50 -53
  101. data/lib/origami/xreftable.rb +462 -462
  102. data/lib/origami.rb +37 -38
  103. data/test/test_actions.rb +22 -20
  104. data/test/test_annotations.rb +54 -52
  105. data/test/test_forms.rb +23 -21
  106. data/test/test_native_types.rb +82 -78
  107. data/test/test_object_tree.rb +25 -24
  108. data/test/test_pages.rb +43 -41
  109. data/test/test_pdf.rb +2 -0
  110. data/test/test_pdf_attachment.rb +23 -21
  111. data/test/test_pdf_create.rb +16 -15
  112. data/test/test_pdf_encrypt.rb +69 -66
  113. data/test/test_pdf_parse.rb +131 -129
  114. data/test/test_pdf_parse_lazy.rb +53 -53
  115. data/test/test_pdf_sign.rb +67 -67
  116. data/test/test_streams.rb +145 -143
  117. data/test/test_xrefs.rb +46 -45
  118. metadata +64 -8
@@ -1,170 +1,166 @@
1
- =begin
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # This file is part of Origami, PDF manipulation framework for Ruby
5
+ # Copyright (C) 2016 Guillaume Delugré.
6
+ #
7
+ # Origami is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published by
9
+ # the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # Origami is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with Origami. If not, see <http://www.gnu.org/licenses/>.
19
+ #
2
20
 
3
- This file is part of Origami, PDF manipulation framework for Ruby
4
- Copyright (C) 2016 Guillaume Delugré.
21
+ require 'origami/filters/predictors'
5
22
 
6
- Origami is free software: you can redistribute it and/or modify
7
- it under the terms of the GNU Lesser General Public License as published by
8
- the Free Software Foundation, either version 3 of the License, or
9
- (at your option) any later version.
23
+ module Origami
24
+ module Filter
25
+ class InvalidLZWDataError < DecodeError # :nodoc:
26
+ end
10
27
 
11
- Origami is distributed in the hope that it will be useful,
12
- but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- GNU Lesser General Public License for more details.
28
+ #
29
+ # Class representing a filter used to encode and decode data with LZW compression algorithm.
30
+ #
31
+ class LZW
32
+ include Filter
33
+ include Predictor
34
+
35
+ EOD = 257 # :nodoc:
36
+ CLEARTABLE = 256 # :nodoc:
37
+
38
+ #
39
+ # Encodes given data using LZW compression method.
40
+ # _stream_:: The data to encode.
41
+ #
42
+ def encode(string)
43
+ input = pre_prediction(string)
44
+
45
+ table, codesize = reset_state
46
+ result = Utils::BitWriter.new
47
+ result.write(CLEARTABLE, codesize)
48
+
49
+ s = ''
50
+ input.each_byte do |byte|
51
+ char = byte.chr
52
+
53
+ if table.size == 4096
54
+ result.write(CLEARTABLE, codesize)
55
+ table, _ = reset_state
56
+ end
57
+
58
+ codesize = table.size.bit_length
59
+
60
+ it = s + char
61
+ if table.has_key?(it)
62
+ s = it
63
+ else
64
+ result.write(table[s], codesize)
65
+ table[it] = table.size
66
+ s = char
67
+ end
68
+ end
15
69
 
16
- You should have received a copy of the GNU Lesser General Public License
17
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
70
+ result.write(table[s], codesize) unless s.empty?
71
+ result.write(EOD, codesize)
72
+
73
+ result.final.to_s
74
+ end
75
+
76
+ #
77
+ # Decodes given data using LZW compression method.
78
+ # _stream_:: The data to decode.
79
+ #
80
+ def decode(string)
81
+ result = "".b
82
+ bstring = Utils::BitReader.new(string)
83
+ table, codesize = reset_state
84
+ prevbyte = nil
85
+
86
+ until bstring.eod?
87
+ byte = bstring.read(codesize)
88
+ break if byte == EOD
89
+
90
+ if byte == CLEARTABLE
91
+ table, codesize = reset_state
92
+ prevbyte = nil
93
+ redo
94
+ end
95
+
96
+ begin
97
+ codesize = decode_codeword_size(table)
98
+ result << decode_byte(table, prevbyte, byte, codesize)
99
+ rescue InvalidLZWDataError => error
100
+ error.message.concat " (bit pos #{bstring.pos - codesize})"
101
+ error.input_data = string
102
+ error.decoded_data = result
103
+ raise(error)
104
+ end
105
+
106
+ prevbyte = byte
107
+ end
18
108
 
19
- =end
109
+ post_prediction(result)
110
+ end
20
111
 
21
- require 'origami/filters/predictors'
112
+ private
22
113
 
23
- module Origami
114
+ def decode_codeword_size(table)
115
+ case table.size
116
+ when 258...510 then 9
117
+ when 510...1022 then 10
118
+ when 1022...2046 then 11
119
+ when 2046...4095 then 12
120
+ else
121
+ raise InvalidLZWDataError, "LZW table is full and no clear flag was set"
122
+ end
123
+ end
124
+
125
+ def decode_byte(table, previous_byte, byte, codesize) # :nodoc:
126
+ # Ensure the codeword can be decoded in the current state.
127
+ check_codeword(table, previous_byte, byte, codesize)
128
+
129
+ if previous_byte.nil?
130
+ table.key(byte)
131
+ else
132
+ if table.value?(byte)
133
+ entry = table.key(byte)
134
+ else
135
+ entry = table.key(previous_byte)
136
+ entry += entry[0, 1]
137
+ end
24
138
 
25
- module Filter
139
+ table[table.key(previous_byte) + entry[0, 1]] = table.size
26
140
 
27
- class InvalidLZWDataError < DecodeError #:nodoc:
141
+ entry
28
142
  end
143
+ end
29
144
 
30
- #
31
- # Class representing a filter used to encode and decode data with LZW compression algorithm.
32
- #
33
- class LZW
34
- include Filter
35
- include Predictor
36
-
37
- EOD = 257 #:nodoc:
38
- CLEARTABLE = 256 #:nodoc:
39
-
40
- #
41
- # Encodes given data using LZW compression method.
42
- # _stream_:: The data to encode.
43
- #
44
- def encode(string)
45
- input = pre_prediction(string)
46
-
47
- table, codesize = reset_state
48
- result = Utils::BitWriter.new
49
- result.write(CLEARTABLE, codesize)
50
-
51
- s = ''
52
- input.each_byte do |byte|
53
- char = byte.chr
54
-
55
- if table.size == 4096
56
- result.write(CLEARTABLE, codesize)
57
- table, _ = reset_state
58
- end
59
-
60
- codesize = table.size.bit_length
61
-
62
- it = s + char
63
- if table.has_key?(it)
64
- s = it
65
- else
66
- result.write(table[s], codesize)
67
- table[it] = table.size
68
- s = char
69
- end
70
- end
71
-
72
- result.write(table[s], codesize) unless s.empty?
73
- result.write(EOD, codesize)
74
-
75
- result.final.to_s
76
- end
77
-
78
- #
79
- # Decodes given data using LZW compression method.
80
- # _stream_:: The data to decode.
81
- #
82
- def decode(string)
83
- result = "".b
84
- bstring = Utils::BitReader.new(string)
85
- table, codesize = reset_state
86
- prevbyte = nil
87
-
88
- until bstring.eod? do
89
- byte = bstring.read(codesize)
90
- break if byte == EOD
91
-
92
- if byte == CLEARTABLE
93
- table, codesize = reset_state
94
- prevbyte = nil
95
- redo
96
- end
97
-
98
- begin
99
- codesize = decode_codeword_size(table)
100
- result << decode_byte(table, prevbyte, byte, codesize)
101
- rescue InvalidLZWDataError => error
102
- error.message.concat " (bit pos #{bstring.pos - codesize})"
103
- error.input_data = string
104
- error.decoded_data = result
105
- raise(error)
106
- end
107
-
108
- prevbyte = byte
109
- end
110
-
111
- post_prediction(result)
112
- end
113
-
114
- private
115
-
116
- def decode_codeword_size(table)
117
- case table.size
118
- when 258...510 then 9
119
- when 510...1022 then 10
120
- when 1022...2046 then 11
121
- when 2046...4095 then 12
122
- else
123
- raise InvalidLZWDataError, "LZW table is full and no clear flag was set"
124
- end
125
- end
126
-
127
- def decode_byte(table, previous_byte, byte, codesize) #:nodoc:
128
-
129
- # Ensure the codeword can be decoded in the current state.
130
- check_codeword(table, previous_byte, byte, codesize)
131
-
132
- if previous_byte.nil?
133
- table.key(byte)
134
- else
135
- if table.value?(byte)
136
- entry = table.key(byte)
137
- else
138
- entry = table.key(previous_byte)
139
- entry += entry[0, 1]
140
- end
141
-
142
- table[table.key(previous_byte) + entry[0,1]] = table.size
143
-
144
- entry
145
- end
146
- end
147
-
148
- def check_codeword(table, previous_byte, byte, codesize) #:nodoc:
149
- if (previous_byte.nil? and not table.value?(byte)) or (previous_byte and not table.value?(previous_byte))
150
- codeword = previous_byte || byte
151
- raise InvalidLZWDataError, "No entry for codeword #{codeword.to_s(2).rjust(codesize, '0')}"
152
- end
153
- end
154
-
155
- def reset_state #:nodoc:
156
- table = {}
157
- 256.times do |i|
158
- table[i.chr] = i
159
- end
160
-
161
- table[CLEARTABLE] = CLEARTABLE
162
- table[EOD] = EOD
163
-
164
- # Codeword table, codeword size
165
- [table, 9]
166
- end
145
+ def check_codeword(table, previous_byte, byte, codesize) # :nodoc:
146
+ if (previous_byte.nil? && !table.value?(byte)) || (previous_byte && !table.value?(previous_byte))
147
+ codeword = previous_byte || byte
148
+ raise InvalidLZWDataError, "No entry for codeword #{codeword.to_s(2).rjust(codesize, "0")}"
167
149
  end
150
+ end
151
+
152
+ def reset_state # :nodoc:
153
+ table = {}
154
+ 256.times do |i|
155
+ table[i.chr] = i
156
+ end
157
+
158
+ table[CLEARTABLE] = CLEARTABLE
159
+ table[EOD] = EOD
168
160
 
161
+ # Codeword table, codeword size
162
+ [table, 9]
163
+ end
169
164
  end
165
+ end
170
166
  end