origami 1.2.7 → 2.0.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 (162) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -0
  3. data/README.md +112 -0
  4. data/bin/config/pdfcop.conf.yml +232 -233
  5. data/bin/gui/about.rb +27 -37
  6. data/bin/gui/config.rb +108 -117
  7. data/bin/gui/file.rb +416 -365
  8. data/bin/gui/gtkhex.rb +1138 -1153
  9. data/bin/gui/hexview.rb +55 -57
  10. data/bin/gui/imgview.rb +48 -51
  11. data/bin/gui/menu.rb +388 -386
  12. data/bin/gui/properties.rb +114 -130
  13. data/bin/gui/signing.rb +571 -617
  14. data/bin/gui/textview.rb +77 -95
  15. data/bin/gui/treeview.rb +382 -387
  16. data/bin/gui/walker.rb +227 -232
  17. data/bin/gui/xrefs.rb +56 -60
  18. data/bin/pdf2pdfa +53 -57
  19. data/bin/pdf2ruby +212 -228
  20. data/bin/pdfcop +338 -348
  21. data/bin/pdfdecompress +58 -65
  22. data/bin/pdfdecrypt +56 -60
  23. data/bin/pdfencrypt +75 -80
  24. data/bin/pdfexplode +185 -182
  25. data/bin/pdfextract +201 -218
  26. data/bin/pdfmetadata +83 -82
  27. data/bin/pdfsh +4 -5
  28. data/bin/pdfwalker +1 -2
  29. data/bin/shell/.irbrc +45 -82
  30. data/bin/shell/console.rb +105 -130
  31. data/bin/shell/hexdump.rb +40 -64
  32. data/examples/README.md +34 -0
  33. data/examples/attachments/attachment.rb +38 -0
  34. data/examples/attachments/nested_document.rb +51 -0
  35. data/examples/encryption/encryption.rb +28 -0
  36. data/{samples/actions/triggerevents/trigger.rb → examples/events/events.rb} +13 -16
  37. data/examples/flash/flash.rb +37 -0
  38. data/{samples → examples}/flash/helloworld.swf +0 -0
  39. data/examples/forms/javascript.rb +54 -0
  40. data/examples/forms/xfa.rb +115 -0
  41. data/examples/javascript/hello_world.rb +22 -0
  42. data/examples/javascript/js_emulation.rb +54 -0
  43. data/examples/loop/goto.rb +32 -0
  44. data/examples/loop/named.rb +33 -0
  45. data/examples/signature/signature.rb +65 -0
  46. data/examples/uri/javascript.rb +56 -0
  47. data/examples/uri/open-uri.rb +21 -0
  48. data/examples/uri/submitform.rb +47 -0
  49. data/lib/origami.rb +29 -42
  50. data/lib/origami/3d.rb +350 -225
  51. data/lib/origami/acroform.rb +262 -288
  52. data/lib/origami/actions.rb +268 -288
  53. data/lib/origami/annotations.rb +697 -722
  54. data/lib/origami/array.rb +258 -184
  55. data/lib/origami/boolean.rb +74 -84
  56. data/lib/origami/catalog.rb +397 -434
  57. data/lib/origami/collections.rb +144 -0
  58. data/lib/origami/destinations.rb +233 -194
  59. data/lib/origami/dictionary.rb +253 -232
  60. data/lib/origami/encryption.rb +1274 -1243
  61. data/lib/origami/export.rb +232 -268
  62. data/lib/origami/extensions/fdf.rb +307 -220
  63. data/lib/origami/extensions/ppklite.rb +368 -435
  64. data/lib/origami/filespec.rb +197 -0
  65. data/lib/origami/filters.rb +301 -295
  66. data/lib/origami/filters/ascii.rb +177 -180
  67. data/lib/origami/filters/ccitt.rb +528 -535
  68. data/lib/origami/filters/crypt.rb +26 -35
  69. data/lib/origami/filters/dct.rb +46 -52
  70. data/lib/origami/filters/flate.rb +95 -94
  71. data/lib/origami/filters/jbig2.rb +49 -55
  72. data/lib/origami/filters/jpx.rb +38 -44
  73. data/lib/origami/filters/lzw.rb +189 -183
  74. data/lib/origami/filters/predictors.rb +221 -235
  75. data/lib/origami/filters/runlength.rb +103 -104
  76. data/lib/origami/font.rb +173 -186
  77. data/lib/origami/functions.rb +67 -81
  78. data/lib/origami/graphics.rb +25 -21
  79. data/lib/origami/graphics/colors.rb +178 -187
  80. data/lib/origami/graphics/instruction.rb +79 -85
  81. data/lib/origami/graphics/path.rb +142 -148
  82. data/lib/origami/graphics/patterns.rb +160 -167
  83. data/lib/origami/graphics/render.rb +43 -50
  84. data/lib/origami/graphics/state.rb +138 -153
  85. data/lib/origami/graphics/text.rb +188 -205
  86. data/lib/origami/graphics/xobject.rb +819 -815
  87. data/lib/origami/header.rb +63 -78
  88. data/lib/origami/javascript.rb +596 -597
  89. data/lib/origami/linearization.rb +285 -290
  90. data/lib/origami/metadata.rb +139 -148
  91. data/lib/origami/name.rb +112 -148
  92. data/lib/origami/null.rb +53 -62
  93. data/lib/origami/numeric.rb +162 -175
  94. data/lib/origami/obfuscation.rb +186 -174
  95. data/lib/origami/object.rb +593 -573
  96. data/lib/origami/outline.rb +42 -47
  97. data/lib/origami/outputintents.rb +73 -82
  98. data/lib/origami/page.rb +703 -592
  99. data/lib/origami/parser.rb +238 -290
  100. data/lib/origami/parsers/fdf.rb +41 -33
  101. data/lib/origami/parsers/pdf.rb +75 -95
  102. data/lib/origami/parsers/pdf/lazy.rb +137 -0
  103. data/lib/origami/parsers/pdf/linear.rb +64 -66
  104. data/lib/origami/parsers/ppklite.rb +34 -70
  105. data/lib/origami/pdf.rb +1030 -1005
  106. data/lib/origami/reference.rb +102 -102
  107. data/lib/origami/signature.rb +591 -609
  108. data/lib/origami/stream.rb +668 -551
  109. data/lib/origami/string.rb +397 -373
  110. data/lib/origami/template/patterns.rb +56 -0
  111. data/lib/origami/template/widgets.rb +151 -0
  112. data/lib/origami/trailer.rb +144 -158
  113. data/lib/origami/tree.rb +62 -0
  114. data/lib/origami/version.rb +23 -0
  115. data/lib/origami/webcapture.rb +88 -79
  116. data/lib/origami/xfa.rb +2863 -2882
  117. data/lib/origami/xreftable.rb +472 -384
  118. data/test/dataset/calc.pdf +85 -0
  119. data/test/dataset/crypto.pdf +82 -0
  120. data/test/dataset/empty.pdf +49 -0
  121. data/test/test_actions.rb +27 -0
  122. data/test/test_annotations.rb +90 -0
  123. data/test/test_pages.rb +31 -0
  124. data/test/test_pdf.rb +16 -0
  125. data/test/test_pdf_attachment.rb +34 -0
  126. data/test/test_pdf_create.rb +24 -0
  127. data/test/test_pdf_encrypt.rb +95 -0
  128. data/test/test_pdf_parse.rb +96 -0
  129. data/test/test_pdf_sign.rb +58 -0
  130. data/test/test_streams.rb +182 -0
  131. data/test/test_xrefs.rb +67 -0
  132. metadata +88 -58
  133. data/README +0 -67
  134. data/bin/pdf2graph +0 -121
  135. data/bin/pdfcocoon +0 -104
  136. data/lib/origami/file.rb +0 -233
  137. data/samples/README.txt +0 -45
  138. data/samples/actions/launch/calc.rb +0 -87
  139. data/samples/actions/launch/winparams.rb +0 -22
  140. data/samples/actions/loop/loopgoto.rb +0 -24
  141. data/samples/actions/loop/loopnamed.rb +0 -21
  142. data/samples/actions/named/named.rb +0 -31
  143. data/samples/actions/samba/smbrelay.rb +0 -26
  144. data/samples/actions/webbug/submitform.js +0 -26
  145. data/samples/actions/webbug/webbug-browser.rb +0 -68
  146. data/samples/actions/webbug/webbug-js.rb +0 -67
  147. data/samples/actions/webbug/webbug-reader.rb +0 -90
  148. data/samples/attachments/attach.rb +0 -40
  149. data/samples/attachments/attached.txt +0 -1
  150. data/samples/crypto/crypto.rb +0 -28
  151. data/samples/digsig/signed.rb +0 -46
  152. data/samples/exploits/cve-2008-2992-utilprintf.rb +0 -87
  153. data/samples/exploits/cve-2009-0927-geticon.rb +0 -65
  154. data/samples/exploits/exploit_customdictopen.rb +0 -55
  155. data/samples/exploits/getannots.rb +0 -69
  156. data/samples/flash/flash.rb +0 -31
  157. data/samples/javascript/attached.txt +0 -1
  158. data/samples/javascript/js.rb +0 -52
  159. data/templates/patterns.rb +0 -66
  160. data/templates/widgets.rb +0 -173
  161. data/templates/xdp.rb +0 -92
  162. data/test/ts_pdf.rb +0 -50
@@ -1,75 +1,66 @@
1
1
  =begin
2
2
 
3
- = File
4
- null.rb
5
-
6
- = Info
7
- This file is part of Origami, PDF manipulation framework for Ruby
8
- Copyright (C) 2010 Guillaume Delugré <guillaume AT security-labs DOT org>
9
- All right reserved.
10
-
11
- Origami is free software: you can redistribute it and/or modify
12
- it under the terms of the GNU Lesser General Public License as published by
13
- the Free Software Foundation, either version 3 of the License, or
14
- (at your option) any later version.
15
-
16
- Origami is distributed in the hope that it will be useful,
17
- but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- GNU Lesser General Public License for more details.
20
-
21
- You should have received a copy of the GNU Lesser General Public License
22
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
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/>.
23
18
 
24
19
  =end
25
20
 
26
21
  module Origami
27
22
 
28
- class InvalidNullObjectError < InvalidObjectError #:nodoc:
29
- end
30
-
31
- #
32
- # Class representing Null Object.
33
- #
34
- class Null
35
-
36
- include Origami::Object
37
-
38
- TOKENS = %w{ null } #:nodoc:
39
-
40
- @@regexp = Regexp.new(WHITESPACES + TOKENS.first)
41
-
42
- def initialize
43
- super
44
- end
45
-
46
- def self.parse(stream, parser = nil) #:nodoc:
47
-
48
- offset = stream.pos
49
-
50
- if stream.skip(@@regexp).nil?
51
- raise InvalidNullObjectError
52
- end
53
-
54
- null = Null.new
55
- null.file_offset = offset
56
-
57
- null
23
+ class InvalidNullObjectError < InvalidObjectError #:nodoc:
58
24
  end
59
-
25
+
60
26
  #
61
- # Returns *nil*.
27
+ # Class representing Null Object.
62
28
  #
63
- def value
64
- nil
65
- end
66
-
67
- def to_s #:nodoc:
68
- super(TOKENS.first)
29
+ class Null
30
+ include Origami::Object
31
+
32
+ TOKENS = %w{ null } #:nodoc:
33
+ @@regexp = Regexp.new(WHITESPACES + TOKENS.first)
34
+
35
+ def initialize
36
+ super
37
+ end
38
+
39
+ def self.parse(stream, parser = nil) #:nodoc:
40
+ offset = stream.pos
41
+
42
+ if stream.skip(@@regexp).nil?
43
+ raise InvalidNullObjectError
44
+ end
45
+
46
+ null = Null.new
47
+ null.file_offset = offset
48
+
49
+ null
50
+ end
51
+
52
+ #
53
+ # Returns *nil*.
54
+ #
55
+ def value
56
+ nil
57
+ end
58
+
59
+ def to_s #:nodoc:
60
+ super(TOKENS.first)
61
+ end
62
+
63
+ def self.native_type ; Null end
69
64
  end
70
65
 
71
- def self.native_type ; Null end
72
-
73
- end
74
-
75
66
  end
@@ -1,25 +1,20 @@
1
1
  =begin
2
2
 
3
- = File
4
- numeric.rb
5
-
6
- = Info
7
- This file is part of Origami, PDF manipulation framework for Ruby
8
- Copyright (C) 2010 Guillaume Delugré <guillaume AT security-labs DOT org>
9
- All right reserved.
10
-
11
- Origami is free software: you can redistribute it and/or modify
12
- it under the terms of the GNU Lesser General Public License as published by
13
- the Free Software Foundation, either version 3 of the License, or
14
- (at your option) any later version.
15
-
16
- Origami is distributed in the hope that it will be useful,
17
- but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- GNU Lesser General Public License for more details.
20
-
21
- You should have received a copy of the GNU Lesser General Public License
22
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
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/>.
23
18
 
24
19
  =end
25
20
 
@@ -27,176 +22,168 @@ require 'delegate'
27
22
 
28
23
  module Origami
29
24
 
30
- class InvalidIntegerObjectError < InvalidObjectError #:nodoc:
31
- end
32
-
33
- #
34
- # Class representing a PDF number (Integer, or Real).
35
- #
36
- module Number
37
- include Origami::Object
38
-
39
- def ~
40
- self.class.new(~self.to_i)
41
- end
42
-
43
- def |(val)
44
- self.class.new(self.to_i | val)
45
- end
46
-
47
- def &(val)
48
- self.class.new(self.to_i & val)
49
- end
50
-
51
- def ^(val)
52
- self.class.new(self.to_i ^ val)
53
- end
54
-
55
- def <<(val)
56
- self.class.new(self.to_i << val)
57
- end
58
-
59
- def >>(val)
60
- self.class.new(self.to_i >> val)
61
- end
62
-
63
- def +(val)
64
- self.class.new(self.to_i + val)
65
- end
66
-
67
- def -(val)
68
- self.class.new(self.to_i - val)
69
- end
70
-
71
- def -@
72
- self.class.new(-self.to_i)
73
- end
74
-
75
- def *(val)
76
- self.class.new(self.to_i * val)
77
- end
78
-
79
- def /(val)
80
- self.class.new(self.to_i / val)
81
- end
82
-
83
- def abs
84
- self.class.new(self.to_i.abs)
85
- end
86
-
87
- def **(val)
88
- self.class.new(self.to_i ** val)
89
- end
90
-
91
- def to_s
92
- super(value.to_s)
93
- end
94
-
95
- module ClassMethods #:nodoc:all
96
- def native_type; Number end
97
- end
98
-
99
- def self.included(receiver) #:nodoc:
100
- receiver.extend(ClassMethods)
25
+ class InvalidIntegerObjectError < InvalidObjectError #:nodoc:
101
26
  end
102
-
103
- def self.native_type; Number end #:nodoc:
104
- end
105
-
106
- #
107
- # Class representing an Integer Object.
108
- #
109
- class Integer < DelegateClass(Bignum)
110
-
111
- include Number
112
-
113
- TOKENS = [ "(\\+|-)?[\\d]+[^.]?" ] #:nodoc:
114
-
115
- REGEXP_TOKEN = Regexp.new(TOKENS.first)
116
-
117
- @@regexp = Regexp.new(WHITESPACES + "((\\+|-)?[\\d]+)")
118
27
 
119
28
  #
120
- # Creates a new Integer from a Ruby Fixnum / Bignum.
121
- # _i_:: The Integer value.
29
+ # Class representing a PDF number (Integer, or Real).
122
30
  #
123
- def initialize(i = 0)
124
-
125
- unless i.is_a?(::Integer)
126
- raise TypeError, "Expected type Fixnum or Bignum, received #{i.class}."
127
- end
31
+ module Number
32
+ include Origami::Object
128
33
 
129
- super(i)
130
- end
131
-
132
- def self.parse(stream, parser = nil) #:nodoc:
34
+ def ~
35
+ self.class.new(~self.to_i)
36
+ end
37
+
38
+ def |(val)
39
+ self.class.new(self.to_i | val)
40
+ end
41
+
42
+ def &(val)
43
+ self.class.new(self.to_i & val)
44
+ end
45
+
46
+ def ^(val)
47
+ self.class.new(self.to_i ^ val)
48
+ end
49
+
50
+ def <<(val)
51
+ self.class.new(self.to_i << val)
52
+ end
53
+
54
+ def >>(val)
55
+ self.class.new(self.to_i >> val)
56
+ end
57
+
58
+ def +(val)
59
+ self.class.new(self.to_i + val)
60
+ end
61
+
62
+ def -(val)
63
+ self.class.new(self.to_i - val)
64
+ end
65
+
66
+ def -@
67
+ self.class.new(-self.to_i)
68
+ end
133
69
 
134
- offset = stream.pos
70
+ def *(val)
71
+ self.class.new(self.to_i * val)
72
+ end
135
73
 
136
- if not stream.scan(@@regexp)
137
- raise InvalidIntegerObjectError, "Invalid integer format"
138
- end
74
+ def /(val)
75
+ self.class.new(self.to_i / val)
76
+ end
139
77
 
140
- value = stream[2].to_i
141
- int = Integer.new(value)
142
- int.file_offset = offset
78
+ def abs
79
+ self.class.new(self.to_i.abs)
80
+ end
143
81
 
144
- int
82
+ def **(val)
83
+ self.class.new(self.to_i ** val)
84
+ end
85
+
86
+ def to_s
87
+ super(value.to_s)
88
+ end
89
+
90
+ module ClassMethods #:nodoc:all
91
+ def native_type; Number end
92
+ end
93
+
94
+ def self.included(receiver) #:nodoc:
95
+ receiver.extend(ClassMethods)
96
+ end
97
+
98
+ def self.native_type; Number end #:nodoc:
145
99
  end
146
-
147
- alias value to_i
148
- end
149
-
150
- class InvalidRealObjectError < InvalidObjectError #:nodoc:
151
- end
152
-
153
- #
154
- # Class representing a Real number Object.
155
- # PDF real numbers are arbitrary precision numbers, depending on architectures.
156
- #
157
- class Real < DelegateClass(Float)
158
-
159
- include Number
160
-
161
- TOKENS = [ "(\\+|-)?([\\d]*\\.[\\d]+|[\\d]+\\.[\\d]*)([eE](\\+|-)?[\\d]+)?" ] #:nodoc:
162
-
163
- REGEXP_TOKEN = Regexp.new(TOKENS.first)
164
-
165
- @@regexp = Regexp.new(WHITESPACES + "(" + TOKENS.first + ")")
166
-
100
+
167
101
  #
168
- # Creates a new Real from a Ruby Float.
169
- # _f_:: The new Real value.
102
+ # Class representing an Integer Object.
170
103
  #
171
- def initialize(f = 0)
172
-
173
- unless f.is_a?(Float)
174
- raise TypeError, "Expected type Float, received #{f.class}."
175
- end
176
-
177
- super(f)
104
+ class Integer < DelegateClass(Bignum)
105
+ include Number
106
+
107
+ TOKENS = [ "(\\+|-)?[\\d]+[^.]?" ] #:nodoc:
108
+ REGEXP_TOKEN = Regexp.new(TOKENS.first)
109
+
110
+ @@regexp = Regexp.new(WHITESPACES + "(?<int>(\\+|-)?[\\d]+)")
111
+
112
+ #
113
+ # Creates a new Integer from a Ruby Fixnum / Bignum.
114
+ # _i_:: The Integer value.
115
+ #
116
+ def initialize(i = 0)
117
+ unless i.is_a?(::Integer)
118
+ raise TypeError, "Expected type Fixnum or Bignum, received #{i.class}."
119
+ end
120
+
121
+ super(i)
122
+ end
123
+
124
+ def self.parse(stream, parser = nil) #:nodoc:
125
+ offset = stream.pos
126
+
127
+ if not stream.scan(@@regexp)
128
+ raise InvalidIntegerObjectError, "Invalid integer format"
129
+ end
130
+
131
+ value = stream['int'].to_i
132
+ int = Integer.new(value)
133
+ int.file_offset = offset
134
+
135
+ int
136
+ end
137
+
138
+ alias value to_i
178
139
  end
179
-
180
- def self.parse(stream, parser = nil) #:nodoc:
181
-
182
- offset = stream.pos
183
-
184
- if not stream.scan(@@regexp)
185
- raise InvalidRealObjectError, "Invalid real number format"
186
- end
187
-
188
- value = stream[2].to_f
189
- real = Real.new(value)
190
- real.file_offset = offset
191
-
192
- real
140
+
141
+ class InvalidRealObjectError < InvalidObjectError #:nodoc:
193
142
  end
194
-
195
- alias value to_f
196
143
 
197
- def to_s
198
- sprintf("%f", self).sub(/\.0*$|(\.\d*[^0])0*$/, '\1')
144
+ #
145
+ # Class representing a Real number Object.
146
+ # PDF real numbers are arbitrary precision numbers, depending on architectures.
147
+ #
148
+ class Real < DelegateClass(Float)
149
+ include Number
150
+
151
+ TOKENS = [ "(\\+|-)?([\\d]*\\.[\\d]+|[\\d]+\\.[\\d]*)([eE](\\+|-)?[\\d]+)?" ] #:nodoc:
152
+ REGEXP_TOKEN = Regexp.new(TOKENS.first)
153
+
154
+ @@regexp = Regexp.new(WHITESPACES + "(?<real>#{TOKENS.first})")
155
+
156
+ #
157
+ # Creates a new Real from a Ruby Float.
158
+ # _f_:: The new Real value.
159
+ #
160
+ def initialize(f = 0)
161
+ unless f.is_a?(Float)
162
+ raise TypeError, "Expected type Float, received #{f.class}."
163
+ end
164
+
165
+ super(f)
166
+ end
167
+
168
+ def self.parse(stream, parser = nil) #:nodoc:
169
+ offset = stream.pos
170
+
171
+ if not stream.scan(@@regexp)
172
+ raise InvalidRealObjectError, "Invalid real number format"
173
+ end
174
+
175
+ value = stream['real'].to_f
176
+ real = Real.new(value)
177
+ real.file_offset = offset
178
+
179
+ real
180
+ end
181
+
182
+ alias value to_f
183
+
184
+ def to_s
185
+ sprintf("%f", self).sub(/\.0*$|(\.\d*[^0])0*$/, '\1')
186
+ end
199
187
  end
200
- end
201
188
 
202
189
  end