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,211 +1,206 @@
1
- =begin
2
-
3
- This file is part of Origami, PDF manipulation framework for Ruby
4
- Copyright (C) 2016 Guillaume Delugré.
5
-
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.
10
-
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.
15
-
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/>.
18
-
19
- =end
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
+ #
20
20
 
21
21
  module Origami
22
+ module Filter
23
+ class InvalidASCIIHexStringError < DecodeError # :nodoc:
24
+ end
22
25
 
23
- module Filter
24
-
25
- class InvalidASCIIHexStringError < DecodeError #:nodoc:
26
+ #
27
+ # Class representing a filter used to encode and decode data written into hexadecimal.
28
+ #
29
+ class ASCIIHex
30
+ include Filter
31
+
32
+ EOD = ">" # :nodoc:
33
+
34
+ #
35
+ # Encodes given data into upcase hexadecimal representation.
36
+ # _stream_:: The data to encode.
37
+ #
38
+ def encode(stream)
39
+ stream.unpack("H*").join.upcase
40
+ end
41
+
42
+ #
43
+ # Decodes given data writen into upcase hexadecimal representation.
44
+ # _string_:: The data to decode.
45
+ #
46
+ def decode(string)
47
+ input = string.include?(EOD) ? string[0...string.index(EOD)] : string
48
+ digits = input.delete(" \f\t\r\n\0")
49
+
50
+ # Ensure every digit is in the hexadecimal charset.
51
+ unless digits =~ /^\h*$/
52
+ digits = digits.match(/^\h*/).to_s
53
+
54
+ raise InvalidASCIIHexStringError.new("Invalid characters", input_data: string, decoded_data: [digits].pack('H*'))
26
55
  end
27
56
 
28
- #
29
- # Class representing a filter used to encode and decode data written into hexadecimal.
30
- #
31
- class ASCIIHex
32
- include Filter
57
+ [digits].pack "H*"
58
+ end
59
+ end
60
+ AHx = ASCIIHex
33
61
 
34
- EOD = ">" #:nodoc:
62
+ class InvalidASCII85StringError < DecodeError # :nodoc:
63
+ end
35
64
 
36
- #
37
- # Encodes given data into upcase hexadecimal representation.
38
- # _stream_:: The data to encode.
39
- #
40
- def encode(stream)
41
- stream.unpack("H*").join.upcase
42
- end
65
+ #
66
+ # Class representing a filter used to encode and decode data written in base85 encoding.
67
+ #
68
+ class ASCII85
69
+ include Filter
43
70
 
44
- #
45
- # Decodes given data writen into upcase hexadecimal representation.
46
- # _string_:: The data to decode.
47
- #
48
- def decode(string)
49
- input = string.include?(EOD) ? string[0...string.index(EOD)] : string
50
- digits = input.delete(" \f\t\r\n\0")
71
+ EOD = "~>" # :nodoc:
51
72
 
52
- # Ensure every digit is in the hexadecimal charset.
53
- unless digits =~ /^\h*$/
54
- digits = digits.match(/^\h*/).to_s
73
+ #
74
+ # Encodes given data into base85.
75
+ # _stream_:: The data to encode.
76
+ #
77
+ def encode(stream)
78
+ i = 0
79
+ code = "".b
80
+ input = stream.dup
55
81
 
56
- raise InvalidASCIIHexStringError.new("Invalid characters", input_data: string, decoded_data: [ digits ].pack('H*'))
57
- end
82
+ while i < input.size
58
83
 
59
- [ digits ].pack "H*"
60
- end
84
+ if input.length - i < 4
85
+ addend = 4 - (input.length - i)
86
+ input << "\0" * addend
87
+ else
88
+ addend = 0
89
+ end
61
90
 
62
- end
63
- AHx = ASCIIHex
91
+ # Encode the 4 bytes input value into a 5 character string.
92
+ value = input[i, 4].unpack1("L>")
93
+ outblock = encode_block(value)
64
94
 
65
- class InvalidASCII85StringError < DecodeError #:nodoc:
66
- end
95
+ outblock = "z" if (outblock == "!!!!!") && (addend == 0)
67
96
 
68
- #
69
- # Class representing a filter used to encode and decode data written in base85 encoding.
70
- #
71
- class ASCII85
72
- include Filter
97
+ if addend != 0
98
+ outblock = outblock[0, 4 - addend + 1]
99
+ end
73
100
 
74
- EOD = "~>" #:nodoc:
101
+ code << outblock
75
102
 
76
- #
77
- # Encodes given data into base85.
78
- # _stream_:: The data to encode.
79
- #
80
- def encode(stream)
81
- i = 0
82
- code = "".b
83
- input = stream.dup
103
+ i += 4
104
+ end
84
105
 
85
- while i < input.size do
106
+ code
107
+ end
86
108
 
87
- if input.length - i < 4
88
- addend = 4 - (input.length - i)
89
- input << "\0" * addend
90
- else
91
- addend = 0
92
- end
109
+ #
110
+ # Decodes the given data encoded in base85.
111
+ # _string_:: The data to decode.
112
+ #
113
+ def decode(string)
114
+ input = filter_input(string)
93
115
 
94
- # Encode the 4 bytes input value into a 5 character string.
95
- value = input[i, 4].unpack("L>")[0]
96
- outblock = encode_block(value)
116
+ i = 0
117
+ result = ''.b
97
118
 
98
- outblock = "z" if outblock == "!!!!!" and addend == 0
119
+ while i < input.size
99
120
 
100
- if addend != 0
101
- outblock = outblock[0, 4 - addend + 1]
102
- end
121
+ outblock = ""
122
+ value = 0
123
+ addend = 0
103
124
 
104
- code << outblock
125
+ if input[i] == "z"
126
+ codelen = 1
127
+ else
128
+ codelen = 5
105
129
 
106
- i = i + 4
107
- end
130
+ if input.length - i < codelen
131
+ raise InvalidASCII85StringError.new("Invalid length", input_data: string, decoded_data: result) if input.length - i == 1
108
132
 
109
- code
133
+ addend = codelen - (input.length - i)
134
+ input << "u" * addend
110
135
  end
111
136
 
112
- #
113
- # Decodes the given data encoded in base85.
114
- # _string_:: The data to decode.
115
- #
116
- def decode(string)
117
- input = filter_input(string)
118
-
119
- i = 0
120
- result = ''.b
121
-
122
- while i < input.size
123
-
124
- outblock = ""
125
- value = 0
126
- addend = 0
127
-
128
- if input[i] == "z"
129
- codelen = 1
130
- else
131
- codelen = 5
132
-
133
- if input.length - i < codelen
134
- raise InvalidASCII85StringError.new("Invalid length", input_data: string, decoded_data: result) if input.length - i == 1
135
-
136
- addend = codelen - (input.length - i)
137
- input << "u" * addend
138
- end
139
-
140
- # Decode the 5 characters input block into a 32 bit integer.
141
- begin
142
- value = decode_block input[i, codelen]
143
- rescue InvalidASCII85StringError => error
144
- error.input_data = string
145
- error.decoded_data = result
146
- raise(error)
147
- end
148
- end
149
-
150
- outblock = [ value ].pack "L>"
151
- outblock = outblock[0, 4 - addend]
137
+ # Decode the 5 characters input block into a 32 bit integer.
138
+ begin
139
+ value = decode_block input[i, codelen]
140
+ rescue InvalidASCII85StringError => error
141
+ error.input_data = string
142
+ error.decoded_data = result
143
+ raise(error)
144
+ end
145
+ end
152
146
 
153
- result << outblock
147
+ outblock = [value].pack "L>"
148
+ outblock = outblock[0, 4 - addend]
154
149
 
155
- i = i + codelen
156
- end
150
+ result << outblock
157
151
 
158
- result
159
- end
152
+ i += codelen
153
+ end
160
154
 
161
- private
155
+ result
156
+ end
162
157
 
163
- def filter_input(string)
164
- string = string[0, string.index(EOD)] if string.include?(EOD)
165
- string.delete(" \f\t\r\n\0")
166
- end
158
+ private
167
159
 
168
- #
169
- # Encodes an integer value into an ASCII85 block of 5 characters.
170
- #
171
- def encode_block(value)
172
- block = "".b
160
+ def filter_input(string)
161
+ string = string[0, string.index(EOD)] if string.include?(EOD)
162
+ string.delete(" \f\t\r\n\0")
163
+ end
173
164
 
174
- 5.times do |p|
175
- c = value / 85 ** (4 - p)
176
- block << ("!".ord + c).chr
165
+ #
166
+ # Encodes an integer value into an ASCII85 block of 5 characters.
167
+ #
168
+ def encode_block(value)
169
+ block = "".b
177
170
 
178
- value -= c * 85 ** (4 - p)
179
- end
180
-
181
- block
182
- end
171
+ 5.times do |p|
172
+ c = value / 85**(4 - p)
173
+ block << ("!".ord + c).chr
183
174
 
184
- #
185
- # Decodes a 5 character ASCII85 block into an integer value.
186
- #
187
- def decode_block(block)
188
- value = 0
175
+ value -= c * 85**(4 - p)
176
+ end
189
177
 
190
- 5.times do |i|
191
- byte = block[i].ord
178
+ block
179
+ end
192
180
 
193
- if byte > "u".ord or byte < "!".ord
194
- raise InvalidASCII85StringError, "Invalid character sequence: #{block.inspect}"
195
- else
196
- value += (byte - "!".ord) * 85 ** (4 - i)
197
- end
198
- end
181
+ #
182
+ # Decodes a 5 character ASCII85 block into an integer value.
183
+ #
184
+ def decode_block(block)
185
+ value = 0
199
186
 
200
- if value >= (1 << 32)
201
- raise InvalidASCII85StringError, "Invalid value (#{value}) for block #{block.inspect}"
202
- end
187
+ 5.times do |i|
188
+ byte = block[i].ord
203
189
 
204
- value
205
- end
190
+ if (byte > "u".ord) || (byte < "!".ord)
191
+ raise InvalidASCII85StringError, "Invalid character sequence: #{block.inspect}"
192
+ else
193
+ value += (byte - "!".ord) * 85**(4 - i)
194
+ end
195
+ end
206
196
 
197
+ if value >= (1 << 32)
198
+ raise InvalidASCII85StringError, "Invalid value (#{value}) for block #{block.inspect}"
207
199
  end
208
- A85 = ASCII85
209
200
 
201
+ value
202
+ end
210
203
  end
204
+ A85 = ASCII85
205
+ end
211
206
  end