origami 1.2.7 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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,325 +1,305 @@
1
1
  =begin
2
2
 
3
- = File
4
- actions.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 PDF
23
+ class PDF
24
+ #
25
+ # Lookup script in the scripts name directory.
26
+ #
27
+ def get_script_by_name(name)
28
+ resolve_name Names::JAVASCRIPT, name
29
+ end
29
30
 
30
- #
31
- # Lookup script in the scripts name directory.
32
- #
33
- def get_script_by_name(name)
34
- resolve_name Names::Root::JAVASCRIPT, name
35
- end
36
-
37
- #
38
- # Calls block for each named JavaScript script.
39
- #
40
- def each_named_script(&b)
41
- each_name(Names::Root::JAVASCRIPT, &b)
42
- end
43
- end
44
-
45
- #
46
- # Class representing an action to launch in a PDF.
47
- #
48
- class Action < Dictionary
49
-
50
- include StandardObject
51
-
52
- field :Type, :Type => Name, :Default => :Action
53
- field :S, :Type => Name, :Required => true
54
- field :Next, :Type => [ Array, Dictionary ], :Version => "1.2"
55
-
56
- #
57
- # Class representing a action going to a destination in the current document.
58
- #
59
- class GoTo < Action
60
-
61
- field :S, :Type => Name, :Default => :GoTo, :Required => true
62
- field :D, :Type => [ Array, Name, ByteString ], :Required => true
63
-
64
- #
65
- # Creates a new GoTo Action.
66
- # _hash_:: A hash of options to set for this jump.
67
- #
68
- def self.[](hash = {})
69
- if hash.is_a? Destination
70
- self.new(:S => :GoTo, :D => hash)
71
- else
72
- self.new(hash)
31
+ #
32
+ # Calls block for each named JavaScript script.
33
+ #
34
+ def each_named_script(&b)
35
+ each_name(Names::JAVASCRIPT, &b)
73
36
  end
74
- end
75
-
76
- end
77
-
78
- def self.GoTo(hash = {})
79
- Action::GoTo[hash]
80
37
  end
81
38
 
82
39
  #
83
- # Class representing an action launching an URL.
40
+ # Class representing an action to launch in a PDF.
84
41
  #
85
- class URI < Action
86
-
87
- field :S, :Type => Name, :Default => :URI, :Required => true
88
- field :URI, :Type => ByteString, :Required => true
89
- field :IsMap, :Type => Boolean, :Default => false
90
-
91
- #
92
- # Creates a new URI Action.
93
- # _uri_:: The URI to launch.
94
- # _ismap_::
95
- #
96
- def self.[](uri, ismap = false)
97
- self.new(:URI => uri, :IsMap => ismap)
98
- end
99
-
100
- end
42
+ class Action < Dictionary
43
+ include StandardObject
101
44
 
102
- def self.URI(uri, ismap = false)
103
- Action::URI[uri, ismap]
104
- end
45
+ field :Type, :Type => Name, :Default => :Action
46
+ field :S, :Type => Name, :Required => true
47
+ field :Next, :Type => [ Array.of(Action), Action ], :Version => "1.2"
48
+
49
+ #
50
+ # Class representing a action going to a destination in the current document.
51
+ #
52
+ class GoTo < Action
53
+
54
+ field :S, :Type => Name, :Default => :GoTo, :Required => true
55
+ field :D, :Type => [ Destination, Name, String ], :Required => true
56
+
57
+ #
58
+ # Creates a new GoTo Action.
59
+ # _hash_:: A hash of options to set for this jump.
60
+ #
61
+ def self.[](hash = {})
62
+ if hash.is_a? Destination
63
+ self.new(:S => :GoTo, :D => hash)
64
+ else
65
+ self.new(hash)
66
+ end
67
+ end
68
+ end
105
69
 
106
- #
107
- # Class representing a JavaScript Action.
108
- #
109
- class JavaScript < Action
110
-
111
- field :S, :Type => Name, :Default => :JavaScript, :Required => true
112
- field :JS, :Type => [ Stream, String ], :Required => true
113
-
114
- #
115
- # Creates a new JavaScript Action.
116
- # _script_:: The script to be executed.
117
- #
118
- def self.[](script)
119
- self.new(:JS => script)
120
- end
121
- end
70
+ def self.GoTo(hash = {})
71
+ Action::GoTo[hash]
72
+ end
122
73
 
123
- def self.JavaScript(script)
124
- Action::JavaScript[script]
125
- end
74
+ #
75
+ # Class representing an action launching an URL.
76
+ #
77
+ class URI < Action
78
+
79
+ field :S, :Type => Name, :Default => :URI, :Required => true
80
+ field :URI, :Type => String, :Required => true
81
+ field :IsMap, :Type => Boolean, :Default => false
82
+
83
+ #
84
+ # Creates a new URI Action.
85
+ # _uri_:: The URI to launch.
86
+ # _ismap_::
87
+ #
88
+ def self.[](uri, ismap = false)
89
+ self.new(:URI => uri, :IsMap => ismap)
90
+ end
91
+ end
126
92
 
127
- #
128
- # Class representing an Action which run a command on the current system.
129
- #
130
- class Launch < Action
131
-
132
- field :S, :Type => Name, :Default => :Launch, :Required => true
133
- field :F, :Type => [ ByteString, Dictionary ]
134
- field :Win, :Type => Dictionary
135
- field :Mac, :Type => Object
136
- field :Unix, :Type => Object
137
- field :NewWindow, :Type => Boolean
138
-
139
- #
140
- # Dictionary for passing parameter to Windows applications during Launch.
141
- #
142
- class WindowsLaunchParams < Dictionary
143
-
144
- include StandardObject
145
-
146
- field :F, :Type => ByteString, :Required => true
147
- field :D, :Type => ByteString
148
- field :O, :Type => ByteString, :Default => "open"
149
- field :P, :Type => ByteString
93
+ def self.URI(uri, ismap = false)
94
+ Action::URI[uri, ismap]
95
+ end
150
96
 
151
- end
152
- end
153
-
154
- #
155
- # Class representing a Named Action.
156
- # Named actions are predefined GoTo actions.
157
- #
158
- class Named < Action
159
-
160
- field :S, :Type => Name, :Default => :Named, :Required => true
161
- field :N, :Type => Name, :Required => true
162
-
163
- def self.[](type)
164
- self.new(:N => type)
165
- end
166
-
167
- NEXTPAGE = self[:NextPage]
168
- PREVPAGE = self[:PrevPage]
169
- FIRSTPAGE = self[:FirstPage]
170
- LASTPAGE = self[:LastPage]
171
- PRINT = self[:Print]
172
- end
97
+ #
98
+ # Class representing a JavaScript Action.
99
+ #
100
+ class JavaScript < Action
101
+
102
+ field :S, :Type => Name, :Default => :JavaScript, :Required => true
103
+ field :JS, :Type => [ Stream, String ], :Required => true
104
+
105
+ #
106
+ # Creates a new JavaScript Action.
107
+ # _script_:: The script to be executed.
108
+ #
109
+ def self.[](script)
110
+ self.new(:JS => script)
111
+ end
112
+ end
173
113
 
174
- def self.Named(type)
175
- Action::Named[type]
176
- end
177
-
178
- #
179
- # Class representing a GoTo Action to an external file.
180
- #
181
- class GoToR < Action
182
-
183
- field :S, :Type => Name, :Default => :GoToR, :Required => true
184
- field :F, :Type => [ ByteString, Dictionary ], :Required => true
185
- field :D, :Type => [ Array, Name, ByteString ], :Required => true
186
- field :NewWindow, :Type => Boolean, :Version => "1.2"
187
-
188
- #
189
- # Creates a new GoTo remote Action.
190
- # _file_:: A FileSpec describing the file.
191
- # _dest_:: A Destination in the file.
192
- # _newwindow_:: Specifies whether the file has to be opened in a new window.
193
- #
194
- def self.[](file, dest = Destination::GlobalFit.new(0), newwindow = false)
195
- self.new(:F => file, :D => dest, :NewWindow => newwindow)
196
- end
197
-
198
- end
114
+ def self.JavaScript(script)
115
+ Action::JavaScript[script]
116
+ end
199
117
 
200
- def self.GoToR(file, dest = Destination::GlobalFit.new(0), newwindow = false)
201
- Action::GoToR[file, dest, newwindow]
202
- end
203
-
204
- #
205
- # Class representing a GoTo Action to an embedded pdf file.
206
- #
207
- class GoToE < Action
208
-
209
- field :S, :Type => Name, :Default => :GoToE, :Required => true
210
- field :F, :Type => [ Dictionary, ByteString ]
211
- field :D, :Type => [ Array, Name, ByteString ], :Required => true
212
- field :NewWindow, :Type => Boolean
213
- field :T, :Type => Dictionary
214
-
215
- #
216
- # A class representing a target for a GoToE to an embedded file.
217
- #
218
- class EmbeddedTarget < Dictionary
219
-
220
- include StandardObject
221
-
222
- module Relationship
223
- PARENT = :P
224
- CHILD = :C
118
+ #
119
+ # Class representing an Action which run a command on the current system.
120
+ #
121
+ class Launch < Action
122
+
123
+ #
124
+ # Dictionary for passing parameter to Windows applications during Launch.
125
+ #
126
+ class WindowsLaunchParams < Dictionary
127
+ include StandardObject
128
+
129
+ field :F, :Type => String, :Required => true
130
+ field :D, :Type => String
131
+ field :O, :Type => String, :Default => "open"
132
+ field :P, :Type => String
133
+ end
134
+
135
+ field :S, :Type => Name, :Default => :Launch, :Required => true
136
+ field :F, :Type => [ String, FileSpec ]
137
+ field :Win, :Type => WindowsLaunchParams
138
+ field :Mac, :Type => Object
139
+ field :Unix, :Type => Object
140
+ field :NewWindow, :Type => Boolean
225
141
  end
226
142
 
227
- field :R, :Type => Name, :Required => true
228
- field :N, :Type => ByteString
229
- field :P, :Type => [ Integer, ByteString ]
230
- field :A, :Type => [ Integer, ByteString ]
231
- field :T, :Type => Dictionary
232
-
233
- end
234
-
235
- def self.[](filename, dest, newwindow = false)
236
- self.new(:T => EmbeddedTarget.new(:R => :C, :N => filename), :D => dest, :NewWindow => newwindow)
237
- end
238
-
239
- end
143
+ #
144
+ # Class representing a Named Action.
145
+ # Named actions are predefined GoTo actions.
146
+ #
147
+ class Named < Action
240
148
 
241
- def self.GoToE(filename, dest, newwindow = false)
242
- Action::GoToE[filename, dest, newwindow]
243
- end
244
-
245
- #
246
- # (PDF 1.2) Send data to a uniform resource locator. p703
247
- #
248
- class SubmitForm < Action
249
-
250
- module Flags
251
- INCLUDEEXCLUDE = 1 << 0
252
- INCLUDENOVALUEFIELDS = 1 << 1
253
- EXPORTFORMAT = 1 << 2
254
- GETMETHOD = 1 << 3
255
- SUBMITCOORDINATES = 1 << 4
256
- XFDF = 1 << 5
257
- INCLUDEAPPENDSAVES = 1 << 6
258
- INCLUDEANNOTATIONS = 1 << 7
259
- SUBMITPDF = 1 << 8
260
- CANONICALFORMAT = 1 << 9
261
- EXCLNONUSERANNOTS = 1 << 10
262
- EXCLFKEY = 1 << 11
263
- EMBEDFORM = 1 << 12
264
- end
265
-
266
- field :S, :Type => Name, :Default => :SubmitForm, :Required => true
267
- field :F, :Type => Dictionary
268
- field :Fields, :Type => Array
269
- field :Flags, :Type => Integer, :Default => 0
270
-
271
- def self.[](url, fields = [], flags = 0)
272
- url = FileSpec.new(:FS => :URL, :F => url) unless url.is_a? FileSpec
273
- self.new(:F => url, :Fields => fields, :Flags => flags)
274
- end
275
-
276
- end
149
+ field :S, :Type => Name, :Default => :Named, :Required => true
150
+ field :N, :Type => Name, :Required => true
277
151
 
278
- def self.SubmitForm(url, fields = [], flags = 0)
279
- Action::SubmitForm[url, fields, flags]
280
- end
152
+ def self.[](type)
153
+ self.new(:N => type)
154
+ end
281
155
 
282
- class ImportData < Action
156
+ NEXT_PAGE = self[:NextPage]
157
+ PREV_PAGE = self[:PrevPage]
158
+ FIRST_PAGE = self[:FirstPage]
159
+ LAST_PAGE = self[:LastPage]
160
+ PRINT = self[:Print]
161
+ end
283
162
 
284
- field :S, :Type => Name, :Default => :ImportData, :Required => true
285
- field :F, :Type => Dictionary, :Required => true
163
+ def self.Named(type)
164
+ Action::Named[type]
165
+ end
286
166
 
287
- def self.[](file)
288
- file = FileSpec.new(:FS => :File, :F => file) unless file.is_a? FileSpec
289
- self.new(:F => file)
290
- end
291
-
292
- end
167
+ #
168
+ # Class representing a GoTo Action to an external file.
169
+ #
170
+ class GoToR < Action
171
+
172
+ field :S, :Type => Name, :Default => :GoToR, :Required => true
173
+ field :F, :Type => [ String, FileSpec ], :Required => true
174
+ field :D, :Type => [ Destination, Name, String ], :Required => true
175
+ field :NewWindow, :Type => Boolean, :Version => "1.2"
176
+
177
+ #
178
+ # Creates a new GoTo remote Action.
179
+ # _file_:: A FileSpec describing the file.
180
+ # _dest_:: A Destination in the file.
181
+ # _new_window_:: Specifies whether the file has to be opened in a new window.
182
+ #
183
+ def self.[](file, dest: Destination::GlobalFit[0], new_window: false)
184
+ self.new(:F => file, :D => dest, :NewWindow => new_window)
185
+ end
186
+ end
293
187
 
294
- def self.ImportData(file)
295
- Action::ImportData[file]
296
- end
188
+ def self.GoToR(file, dest: Destination::GlobalFit[0], new_window: false)
189
+ Action::GoToR[file, dest: dest, new_window: new_window]
190
+ end
297
191
 
298
- class RichMediaExecute < Action
192
+ #
193
+ # Class representing a GoTo Action to an embedded pdf file.
194
+ #
195
+ class GoToE < Action
196
+
197
+ #
198
+ # A class representing a target for a GoToE to an embedded file.
199
+ #
200
+ class EmbeddedTarget < Dictionary
201
+ include StandardObject
202
+
203
+ module Relationship
204
+ PARENT = :P
205
+ CHILD = :C
206
+ end
207
+
208
+ field :R, :Type => Name, :Required => true
209
+ field :N, :Type => String
210
+ field :P, :Type => [ Integer, String ]
211
+ field :A, :Type => [ Integer, String ]
212
+ field :T, :Type => Dictionary
213
+ end
214
+
215
+ field :S, :Type => Name, :Default => :GoToE, :Required => true
216
+ field :F, :Type => [ String, FileSpec ]
217
+ field :D, :Type => [ Destination, Name, String ], :Required => true
218
+ field :NewWindow, :Type => Boolean
219
+ field :T, :Type => EmbeddedTarget
220
+
221
+ def self.[](filename, dest: Destination::GlobalFit[0], new_window: false)
222
+ self.new(:T => EmbeddedTarget.new(:R => :C, :N => filename), :D => dest, :NewWindow => new_window)
223
+ end
224
+ end
299
225
 
300
- field :S, :Type => Name, :Default => :RichMediaExecute, :Version => "1.7", :ExtensionLevel => 3, :Required => true
301
- field :TA, :Type => Dictionary, :Version => "1.7", :ExtensionLevel => 3, :Required => true
302
- field :TI, :Type => Dictionary, :Version => "1.7", :ExtensionLevel => 3
303
- field :CMD, :Type => Dictionary, :Version => "1.7", :ExtensionLevel => 3, :Required => true
226
+ def self.GoToE(filename, dest: Destination::GlobalFit[0], new_window: false)
227
+ Action::GoToE[filename, dest: dest, new_window: new_window]
228
+ end
304
229
 
305
- class Command < Dictionary
306
- include StandardObject
230
+ #
231
+ # Class representing a SubmitForm action.
232
+ #
233
+ class SubmitForm < Action
234
+ module Flags
235
+ INCLUDEEXCLUDE = 1 << 0
236
+ INCLUDENOVALUEFIELDS = 1 << 1
237
+ EXPORTFORMAT = 1 << 2
238
+ GETMETHOD = 1 << 3
239
+ SUBMITCOORDINATES = 1 << 4
240
+ XFDF = 1 << 5
241
+ INCLUDEAPPENDSAVES = 1 << 6
242
+ INCLUDEANNOTATIONS = 1 << 7
243
+ SUBMITPDF = 1 << 8
244
+ CANONICALFORMAT = 1 << 9
245
+ EXCLNONUSERANNOTS = 1 << 10
246
+ EXCLFKEY = 1 << 11
247
+ EMBEDFORM = 1 << 12
248
+ end
249
+
250
+ field :S, :Type => Name, :Default => :SubmitForm, :Required => true
251
+ field :F, :Type => FileSpec
252
+ field :Fields, :Type => Array
253
+ field :Flags, :Type => Integer, :Default => 0
254
+
255
+ def self.[](url, fields = [], flags = 0)
256
+ url = FileSpec.new(:FS => :URL, :F => url) unless url.is_a? FileSpec
257
+ self.new(:F => url, :Fields => fields, :Flags => flags)
258
+ end
259
+ end
307
260
 
308
- field :Type, :Type => Name, :Default => :RichMediaCommand, :Version => "1.7", :ExtensionLevel => 3
309
- field :C, :Type => String, :Version => "1.7", :ExtensionLevel => 3, :Required => true
310
- field :A, :Type => Object, :Version => "1.7", :ExtensionLevel => 3
311
- end
261
+ def self.SubmitForm(url, fields = [], flags = 0)
262
+ Action::SubmitForm[url, fields, flags]
263
+ end
312
264
 
313
- def self.[](annotation, command, *params)
314
- self.new(:TA => annotation, :CMD => Command.new(:C => command, :A => params))
315
- end
316
-
317
- end
265
+ class ImportData < Action
318
266
 
319
- def self.RichMediaExecute(annotation, command, *params)
320
- Action::RichMediaExecute[annotation, command, *params]
267
+ field :S, :Type => Name, :Default => :ImportData, :Required => true
268
+ field :F, :Type => Dictionary, :Required => true
269
+
270
+ def self.[](file)
271
+ file = FileSpec.new(:FS => :File, :F => file) unless file.is_a? FileSpec
272
+ self.new(:F => file)
273
+ end
274
+ end
275
+
276
+ def self.ImportData(file)
277
+ Action::ImportData[file]
278
+ end
279
+
280
+ class RichMediaExecute < Action
281
+
282
+ class Command < Dictionary
283
+ include StandardObject
284
+
285
+ field :Type, :Type => Name, :Default => :RichMediaCommand, :Version => "1.7", :ExtensionLevel => 3
286
+ field :C, :Type => String, :Version => "1.7", :ExtensionLevel => 3, :Required => true
287
+ field :A, :Type => Object, :Version => "1.7", :ExtensionLevel => 3
288
+ end
289
+
290
+ field :S, :Type => Name, :Default => :RichMediaExecute, :Version => "1.7", :ExtensionLevel => 3, :Required => true
291
+ field :TA, :Type => Annotation::RichMedia, :Version => "1.7", :ExtensionLevel => 3, :Required => true
292
+ field :TI, :Type => Annotation::RichMedia::Instance, :Version => "1.7", :ExtensionLevel => 3
293
+ field :CMD, :Type => Command, :Version => "1.7", :ExtensionLevel => 3, :Required => true
294
+
295
+ def self.[](annotation, command, *params)
296
+ self.new(:TA => annotation, :CMD => Command.new(:C => command, :A => params))
297
+ end
298
+ end
299
+
300
+ def self.RichMediaExecute(annotation, command, *params)
301
+ Action::RichMediaExecute[annotation, command, *params]
302
+ end
321
303
  end
322
-
323
- end
324
304
 
325
305
  end