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
@@ -2,122 +2,123 @@
2
2
 
3
3
  =begin
4
4
 
5
- = Author:
6
- Guillaume Delugré <guillaume/at/security-labs.org>
5
+ = Info
6
+ Prints out the metadata contained in a PDF document.
7
7
 
8
- = Info:
9
- Prints out the metadata contained in a PDF document.
8
+ = License
9
+ Copyright (C) 2016 Guillaume Delugré.
10
10
 
11
- = License:
12
- Origami is free software: you can redistribute it and/or modify
13
- it under the terms of the GNU Lesser General Public License as published by
14
- the Free Software Foundation, either version 3 of the License, or
15
- (at your option) any later version.
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.
16
15
 
17
- Origami is distributed in the hope that it will be useful,
18
- but WITHOUT ANY WARRANTY; without even the implied warranty of
19
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
- GNU Lesser General Public License for more details.
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.
21
20
 
22
- You should have received a copy of the GNU Lesser General Public License
23
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
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/>.
24
23
 
25
24
  =end
26
25
 
27
26
  begin
28
- require 'origami'
27
+ require 'origami'
29
28
  rescue LoadError
30
- ORIGAMIDIR = "#{File.dirname(__FILE__)}/../lib"
31
- $: << ORIGAMIDIR
32
- require 'origami'
29
+ $: << File.join(__dir__, '../lib')
30
+ require 'origami'
33
31
  end
34
32
  include Origami
35
33
 
34
+ require 'colorize'
36
35
  require 'optparse'
37
36
 
38
37
  class OptParser
39
- BANNER = <<USAGE
38
+ BANNER = <<USAGE
40
39
  Usage: #{$0} [<PDF-file>] [-i] [-x]
41
40
  Prints out the metadata contained in a PDF document.
42
- Bug reports or feature requests at: http://origami-pdf.googlecode.com/
41
+ Bug reports or feature requests at: http://github.com/gdelugre/origami
43
42
 
44
43
  Options:
45
44
  USAGE
46
45
 
47
- def self.parser(options)
48
- OptionParser.new do |opts|
49
- opts.banner = BANNER
46
+ def self.parser(options)
47
+ OptionParser.new do |opts|
48
+ opts.banner = BANNER
50
49
 
51
- opts.on("-i", "Extracts document info metadata") do |i|
52
- options[:doc_info] = true
53
- end
50
+ opts.on("-i", "Extracts document info metadata") do |i|
51
+ options[:doc_info] = true
52
+ end
54
53
 
55
- opts.on("-x", "Extracts XMP document metadata stream") do |i|
56
- options[:doc_stream] = true
57
- end
54
+ opts.on("-x", "Extracts XMP document metadata stream") do |i|
55
+ options[:doc_stream] = true
56
+ end
58
57
 
59
- opts.on_tail("-h", "--help", "Show this message") do
60
- puts opts
61
- exit
62
- end
58
+ opts.on("-n", "Turn off colorized output.") do
59
+ options[:disable_colors] = true
60
+ end
61
+
62
+ opts.on_tail("-h", "--help", "Show this message") do
63
+ puts opts
64
+ exit
65
+ end
66
+ end
63
67
  end
64
- end
65
68
 
66
- def self.parse(args)
67
- options =
68
- {
69
- :output => STDOUT,
70
- }
69
+ def self.parse(args)
70
+ options =
71
+ {
72
+ disable_colors: false
73
+ }
71
74
 
72
- self.parser(options).parse!(args)
75
+ self.parser(options).parse!(args)
73
76
 
74
- options
75
- end
77
+ options
78
+ end
76
79
  end
77
80
 
78
81
  begin
79
- @options = OptParser.parse(ARGV)
80
-
81
- unless @options[:doc_info] or @options[:doc_stream]
82
- @options[:doc_info] = @options[:doc_stream] = true
83
- end
84
-
85
- target = (ARGV.empty?) ? STDIN : ARGV.shift
86
- params =
87
- {
88
- :verbosity => Parser::VERBOSE_QUIET,
89
- }
90
-
91
- pdf = PDF.read(target, params)
92
-
93
- if @options[:doc_info]
94
- if pdf.has_document_info?
95
- Console.colorprint "[*] Document information dictionary:\n", Console::Colors::MAGENTA
96
-
97
- docinfo = pdf.get_document_info
98
- docinfo.each_pair do |name, item|
99
- Console.colorprint name.value.to_s.ljust(20, ' '), Console::Colors::GREEN
100
- puts ": #{item.solve.value}"
101
- end
102
- puts
82
+ @options = OptParser.parse(ARGV)
83
+
84
+ unless @options[:doc_info] or @options[:doc_stream]
85
+ @options[:doc_info] = @options[:doc_stream] = true
103
86
  end
104
- end
105
87
 
106
- if @options[:doc_stream]
107
- if pdf.has_metadata?
108
- Console.colorprint "[*] Metadata stream:\n", Console::Colors::MAGENTA
88
+ String.disable_colorization @options[:disable_colors]
89
+
90
+ target = (ARGV.empty?) ? STDIN : ARGV.shift
91
+ params =
92
+ {
93
+ verbosity: Parser::VERBOSE_QUIET,
94
+ lazy: true
95
+ }
109
96
 
110
- metadata = pdf.get_metadata
111
- metadata.each_pair do |name, item|
112
- Console.colorprint name.ljust(20, ' '), Console::Colors::GREEN
113
- puts ": #{item}"
114
- end
97
+ pdf = PDF.read(target, params)
98
+
99
+ if @options[:doc_info] and pdf.document_info?
100
+ puts "[*] Document information dictionary:".magenta
101
+
102
+ docinfo = pdf.document_info
103
+ docinfo.each_pair do |name, item|
104
+ obj = item.solve
105
+
106
+ print name.value.to_s.ljust(20, ' ').green
107
+ puts ": #{obj.respond_to?(:to_utf8) ? obj.to_utf8 : obj.value}"
108
+ end
109
+ puts
115
110
  end
116
- end
117
111
 
118
- rescue SystemExit
119
- rescue Exception => e
120
- STDERR.puts "#{e.class}: #{e.message}"
121
- exit 1
122
- end
112
+ if @options[:doc_stream] and pdf.metadata?
113
+ puts "[*] Metadata stream:".magenta
123
114
 
115
+ metadata = pdf.metadata
116
+ metadata.each_pair do |name, item|
117
+ print name.ljust(20, ' ').green
118
+ puts ": #{item}"
119
+ end
120
+ end
121
+
122
+ rescue
123
+ abort "#{$!.class}: #{$!.message}"
124
+ end
data/bin/pdfsh CHANGED
@@ -1,13 +1,12 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  begin
4
- require 'irb'
4
+ require 'irb'
5
5
  rescue LoadError
6
- abort "Error: you need to install irb to run this application."
6
+ abort "Error: you need to install irb to run this application."
7
7
  end
8
8
 
9
- $:.unshift "#{File.dirname(__FILE__)}/shell"
10
- ENV["IRBRC"] = "#{File.dirname(__FILE__)}/shell/.irbrc"
9
+ $:.unshift File.join(__dir__, 'shell')
10
+ ENV["IRBRC"] = File.join(__dir__, "shell", ".irbrc")
11
11
 
12
12
  IRB.start
13
-
@@ -1,7 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $:.unshift "#{File.dirname(__FILE__)}"
3
+ $:.unshift(__dir__)
4
4
  require 'gui/walker'
5
5
 
6
6
  PDFWalker::Walker.start(ARGV[0])
7
-
@@ -1,9 +1,8 @@
1
1
  begin
2
- require 'origami'
2
+ require 'origami'
3
3
  rescue LoadError
4
- ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
5
- $: << ORIGAMIDIR
6
- require 'origami'
4
+ $: << File.join(__dir__, '../../lib')
5
+ require 'origami'
7
6
  end
8
7
  include Origami
9
8
 
@@ -12,95 +11,59 @@ require 'readline'
12
11
 
13
12
  OPENSSL_SUPPORT = (defined?(OpenSSL).nil?) ? 'no' : 'yes'
14
13
  JAVASCRIPT_SUPPORT = (defined?(PDF::JavaScript::Engine).nil?) ? 'no' : 'yes'
15
- DEFAULT_BANNER = "Welcome to the PDF shell (Origami release #{Origami::VERSION}) [OpenSSL: #{OPENSSL_SUPPORT}, JavaScript: #{JAVASCRIPT_SUPPORT}]\n\n"
14
+ DEFAULT_BANNER = "Welcome to the PDF shell (Origami release #{Origami::VERSION}) [OpenSSL: #{OPENSSL_SUPPORT}, JavaScript: #{JAVASCRIPT_SUPPORT}]\n"
16
15
 
17
16
  def set_completion
18
-
19
- completionProc = proc { |input|
20
- bind = IRB.conf[:MAIN_CONTEXT].workspace.binding
21
-
22
- validClasses = Origami.constants.reject do |name|
23
- obj = Origami.const_get(name)
24
- (not obj.is_a?(Module) and not obj.is_a?(Class)) or obj <= Exception
25
- end
26
-
27
- case input
28
-
29
- # # Classes
30
- # when /^([A-Z][^:\.\(]*)$/
31
- # classname = $1
32
- # candidates = validClasses
33
- # return candidates.grep(/^#{classname}/)
34
- #
35
- # # Methods
36
- # when /^([^:.\(]*)\.([^:.]*)$/
37
- # classname = $1
38
- # method = Regexp.quote($2)
39
- # candidates = []
40
- # if validClasses.include? $1
41
- # begin
42
- # candidates = eval("Origami::#{classname}.methods", bind)
43
- # rescue Exception
44
- # candidates = []
45
- # end
46
- # return candidates.grep(/^#{method}/).collect{|e| classname + "." + e}
47
- # else
48
- # begin
49
- # var = $1.dup
50
- # classname = eval("#{classname}.class", bind).to_s
51
- # if validClasses.include?(classname.split("::").last)
52
- # candidates = eval("#{classname}.public_instance_methods", bind)
53
- # end
54
- # rescue Exception => e
55
- # candidates = []
56
- # end
57
- # return candidates.grep(/^#{method}/).collect{|e| var + "." + e}
58
- # end
59
- #
60
- # Mod/class
61
- when /^(.*)::$/
62
- begin
63
- space = eval("Origami::#{$1}", bind)
64
- rescue Exception
65
- return []
66
- end
67
-
68
- return space.constants.reject{|const| space.const_get(const) <= Exception}
69
-
70
- when /^(.*).$/
71
- begin
72
- space = eval($1, bind)
73
- rescue
74
- return []
17
+ completionProc = proc { |input|
18
+ bind = IRB.conf[:MAIN_CONTEXT].workspace.binding
19
+
20
+ case input
21
+ when /^(.*)::$/
22
+ begin
23
+ space = eval("Origami::#{$1}", bind)
24
+ rescue Exception
25
+ return []
26
+ end
27
+
28
+ return space.constants.reject{|const| space.const_get(const) <= Exception}
29
+
30
+ when /^(.*).$/
31
+ begin
32
+ space = eval($1, bind)
33
+ rescue
34
+ return []
35
+ end
36
+
37
+ return space.public_methods
75
38
  end
39
+ }
76
40
 
77
- return space.public_methods
41
+ if Readline.respond_to?("basic_word_break_characters=")
42
+ Readline.basic_word_break_characters= " \t\n\"\\'`><=;|&{("
78
43
  end
79
- }
80
-
81
- if Readline.respond_to?("basic_word_break_characters=")
82
- Readline.basic_word_break_characters= " \t\n\"\\'`><=;|&{("
83
- end
84
- Readline.completion_append_character = nil
85
- Readline.completion_proc = completionProc
86
44
 
45
+ Readline.completion_append_character = nil
46
+ Readline.completion_proc = completionProc
87
47
  end
88
48
 
89
49
  def set_prompt
50
+ IRB.conf[:PROMPT][:PDFSH] = {
51
+ PROMPT_C: "?>> ",
52
+ RETURN: "%s\n",
53
+ PROMPT_I: ">>> ",
54
+ PROMPT_N: ">>> ",
55
+ PROMPT_S: nil
56
+ }
57
+
58
+ IRB.conf[:PROMPT_MODE] = :PDFSH
59
+ IRB.conf[:AUTO_INDENT] = true
60
+ end
90
61
 
91
- IRB.conf[:PROMPT][:PDFSH] = {
92
- :PROMPT_C => "?>> ",
93
- :RETURN => "%s\n",
94
- :PROMPT_I => ">>> ",
95
- :PROMPT_N => ">>> ",
96
- :PROMPT_S => nil
97
- }
98
-
99
- IRB.conf[:PROMPT_MODE] = :PDFSH
62
+ # Print the shell banner.
63
+ puts DEFAULT_BANNER.green
100
64
 
101
- end
65
+ # Import the type conversion helper routines.
66
+ TOPLEVEL_BINDING.eval("using Origami::TypeConversion")
102
67
 
103
- Console.colorprint(DEFAULT_BANNER, Console::Colors::GREEN)
104
68
  #set_completion
105
69
  set_prompt
106
-
@@ -1,150 +1,125 @@
1
1
  =begin
2
2
 
3
- = File
4
- console.rb
5
-
6
- = Info
7
- This file is part of Origami, PDF manipulation framework for Ruby
8
- Copyright (C) 2010 Guillaume Delugré <guillaume@security-labs.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
 
21
+ require 'tempfile'
26
22
  require 'hexdump'
23
+ require 'colorize'
27
24
 
28
- if RUBY_VERSION < '1.9'
29
- def Kernel.spawn(cmd)
30
- fork do
31
- exec(cmd)
32
- end
33
- end
34
- end
25
+ String.disable_colorization(false)
35
26
 
36
27
  module Origami
37
-
38
- module Object
39
- def inspect
40
- to_s
28
+ module Object
29
+ def inspect
30
+ to_s
31
+ end
41
32
  end
42
- end
43
-
44
- unless RUBY_VERSION < '1.9'
45
- require 'tempfile'
46
33
 
47
34
  class Stream
48
- def edit(editor = ENV['EDITOR'])
49
- tmpfile = Tempfile.new("origami")
50
- tmpfile.write(self.data)
51
- tmpfile.close
52
-
53
- Process.wait Kernel.spawn "#{editor} #{tmpfile.path}"
54
-
55
- self.data = File.read(tmpfile.path)
56
- tmpfile.unlink
57
-
58
- true
59
- end
60
-
61
- def inspect
62
- self.data.hexdump
63
- end
64
- end
35
+ def edit(editor = ENV['EDITOR'])
36
+ Tempfile.open("origami") do |tmpfile|
37
+ tmpfile.write(self.data)
38
+ tmpfile.flush
65
39
 
66
- class Page
67
- def edit
68
- self.Contents.edit
69
- end
70
- end
71
- end
72
-
73
- class PDF
74
-
75
- if defined?(PDF::JavaScript::Engine)
76
- class JavaScript::Engine
77
- def shell
78
- while (print 'js> '; line = gets)
79
- begin
80
- puts exec(line)
81
- rescue V8::JSError => e
82
- puts "Error: #{e.message}"
40
+ Process.wait Kernel.spawn "#{editor} #{tmpfile.path}"
41
+
42
+ self.data = File.read(tmpfile.path)
43
+ tmpfile.unlink
83
44
  end
84
- end
45
+
46
+ true
47
+ end
48
+
49
+ def inspect
50
+ self.data.hexdump
85
51
  end
86
- end
87
52
  end
88
-
89
- class Revision
90
- def to_s
91
- Console.colorprint("---------- Body ----------\n", Console::Colors::WHITE, true)
92
- @body.each_value { |obj|
93
- Console.colorprint("#{obj.reference.to_s.rjust(8,' ')}".ljust(10), Console::Colors::MAGENTA)
94
- Console.colorprint("#{obj.type}\n", Console::Colors::YELLOW)
95
- }
96
- #colorprint("---------- Xrefs -----------\n", Colors::BRIGHT_WHITE, true)
97
- #set_fg_color(Colors::BLUE, true) {
98
- # if not @xreftable
99
- # puts " [x] No xref table found."
100
- # else
101
- # @xreftable.to_s.each_line { |line|
102
- # puts " " + line
103
- # }
104
- # end
105
- #}
106
- Console.colorprint("---------- Trailer ---------\n", Console::Colors::WHITE, true)
107
- if not @trailer.dictionary
108
- Console.set_fg_color(Console::Colors::BLUE, true) {
109
- puts " [x] No trailer found."
110
- }
111
- else
112
- @trailer.dictionary.each_pair { |entry, value|
113
- Console.colorprint(" [*] ", Console::Colors::MAGENTA)
114
- Console.colorprint("#{entry.to_s}: ", Console::Colors::YELLOW)
115
- Console.colorprint("#{value.to_s}\n", Console::Colors::RED)
116
- }
117
- Console.colorprint(" [+] ", Console::Colors::MAGENTA)
118
- Console.colorprint("startxref: ", Console::Colors::YELLOW)
119
- Console.colorprint("#{@trailer.startxref}\n", Console::Colors::RED)
53
+
54
+ class Page < Dictionary
55
+ def edit
56
+ each_content_stream do |stream|
57
+ stream.edit
58
+ end
120
59
  end
121
- end
122
-
123
- def inspect
124
- to_s
125
- end
126
- end
127
-
128
- def to_s
129
- puts
130
-
131
- Console.colorprint("---------- Header ----------\n", Console::Colors::WHITE, true)
132
- Console.colorprint(" [+] ", Console::Colors::MAGENTA)
133
- Console.colorprint("Major version: ", Console::Colors::YELLOW)
134
- Console.colorprint("#{@header.majorversion}\n", Console::Colors::RED)
135
- Console.colorprint(" [+] ", Console::Colors::MAGENTA)
136
- Console.colorprint("Minor version: ", Console::Colors::YELLOW)
137
- Console.colorprint("#{@header.minorversion}\n", Console::Colors::RED)
138
-
139
- @revisions.each { |revision|
140
- revision.to_s
141
- }
142
- puts
143
60
  end
144
-
145
- def inspect
146
- to_s
61
+
62
+ class PDF
63
+ if defined?(PDF::JavaScript::Engine)
64
+ class JavaScript::Engine
65
+ def shell
66
+ while (print 'js> '.magenta; line = gets)
67
+ begin
68
+ puts exec(line)
69
+ rescue V8::JSError => e
70
+ puts "Error: #{e.message}"
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+ class Revision
78
+ def to_s
79
+ puts "---------- Body ----------".white.bold
80
+ @body.each_value { |obj|
81
+ print "#{obj.reference.to_s.rjust(8,' ')}".ljust(10).magenta
82
+ puts "#{obj.type}".yellow
83
+ }
84
+
85
+ puts "---------- Trailer ---------".white.bold
86
+ if not @trailer.dictionary
87
+ puts " [x] No trailer found.".blue
88
+ else
89
+ @trailer.dictionary.each_pair { |entry, value|
90
+ print " [*] ".magenta
91
+ print "#{entry.to_s}: ".yellow
92
+ puts "#{value.to_s}".red
93
+ }
94
+
95
+ print " [+] ".magenta
96
+ print "startxref: ".yellow
97
+ puts "#{@trailer.startxref}".red
98
+ end
99
+ end
100
+
101
+ def inspect
102
+ to_s
103
+ end
104
+ end
105
+
106
+ def to_s
107
+ puts
108
+
109
+ puts "---------- Header ----------".white.bold
110
+ print " [+] ".magenta
111
+ print "Version: ".yellow
112
+ puts "#{@header.major_version}.#{@header.minor_version}".red
113
+
114
+ @revisions.each { |revision|
115
+ revision.to_s
116
+ }
117
+ puts
118
+ end
119
+
120
+ def inspect
121
+ to_s
122
+ end
147
123
  end
148
- end
149
- end
150
124
 
125
+ end