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,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