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