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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +66 -0
- data/README.md +112 -0
- data/bin/config/pdfcop.conf.yml +232 -233
- data/bin/gui/about.rb +27 -37
- data/bin/gui/config.rb +108 -117
- data/bin/gui/file.rb +416 -365
- data/bin/gui/gtkhex.rb +1138 -1153
- data/bin/gui/hexview.rb +55 -57
- data/bin/gui/imgview.rb +48 -51
- data/bin/gui/menu.rb +388 -386
- data/bin/gui/properties.rb +114 -130
- data/bin/gui/signing.rb +571 -617
- data/bin/gui/textview.rb +77 -95
- data/bin/gui/treeview.rb +382 -387
- data/bin/gui/walker.rb +227 -232
- data/bin/gui/xrefs.rb +56 -60
- data/bin/pdf2pdfa +53 -57
- data/bin/pdf2ruby +212 -228
- data/bin/pdfcop +338 -348
- data/bin/pdfdecompress +58 -65
- data/bin/pdfdecrypt +56 -60
- data/bin/pdfencrypt +75 -80
- data/bin/pdfexplode +185 -182
- data/bin/pdfextract +201 -218
- data/bin/pdfmetadata +83 -82
- data/bin/pdfsh +4 -5
- data/bin/pdfwalker +1 -2
- data/bin/shell/.irbrc +45 -82
- data/bin/shell/console.rb +105 -130
- data/bin/shell/hexdump.rb +40 -64
- data/examples/README.md +34 -0
- data/examples/attachments/attachment.rb +38 -0
- data/examples/attachments/nested_document.rb +51 -0
- data/examples/encryption/encryption.rb +28 -0
- data/{samples/actions/triggerevents/trigger.rb → examples/events/events.rb} +13 -16
- data/examples/flash/flash.rb +37 -0
- data/{samples → examples}/flash/helloworld.swf +0 -0
- data/examples/forms/javascript.rb +54 -0
- data/examples/forms/xfa.rb +115 -0
- data/examples/javascript/hello_world.rb +22 -0
- data/examples/javascript/js_emulation.rb +54 -0
- data/examples/loop/goto.rb +32 -0
- data/examples/loop/named.rb +33 -0
- data/examples/signature/signature.rb +65 -0
- data/examples/uri/javascript.rb +56 -0
- data/examples/uri/open-uri.rb +21 -0
- data/examples/uri/submitform.rb +47 -0
- data/lib/origami.rb +29 -42
- data/lib/origami/3d.rb +350 -225
- data/lib/origami/acroform.rb +262 -288
- data/lib/origami/actions.rb +268 -288
- data/lib/origami/annotations.rb +697 -722
- data/lib/origami/array.rb +258 -184
- data/lib/origami/boolean.rb +74 -84
- data/lib/origami/catalog.rb +397 -434
- data/lib/origami/collections.rb +144 -0
- data/lib/origami/destinations.rb +233 -194
- data/lib/origami/dictionary.rb +253 -232
- data/lib/origami/encryption.rb +1274 -1243
- data/lib/origami/export.rb +232 -268
- data/lib/origami/extensions/fdf.rb +307 -220
- data/lib/origami/extensions/ppklite.rb +368 -435
- data/lib/origami/filespec.rb +197 -0
- data/lib/origami/filters.rb +301 -295
- data/lib/origami/filters/ascii.rb +177 -180
- data/lib/origami/filters/ccitt.rb +528 -535
- data/lib/origami/filters/crypt.rb +26 -35
- data/lib/origami/filters/dct.rb +46 -52
- data/lib/origami/filters/flate.rb +95 -94
- data/lib/origami/filters/jbig2.rb +49 -55
- data/lib/origami/filters/jpx.rb +38 -44
- data/lib/origami/filters/lzw.rb +189 -183
- data/lib/origami/filters/predictors.rb +221 -235
- data/lib/origami/filters/runlength.rb +103 -104
- data/lib/origami/font.rb +173 -186
- data/lib/origami/functions.rb +67 -81
- data/lib/origami/graphics.rb +25 -21
- data/lib/origami/graphics/colors.rb +178 -187
- data/lib/origami/graphics/instruction.rb +79 -85
- data/lib/origami/graphics/path.rb +142 -148
- data/lib/origami/graphics/patterns.rb +160 -167
- data/lib/origami/graphics/render.rb +43 -50
- data/lib/origami/graphics/state.rb +138 -153
- data/lib/origami/graphics/text.rb +188 -205
- data/lib/origami/graphics/xobject.rb +819 -815
- data/lib/origami/header.rb +63 -78
- data/lib/origami/javascript.rb +596 -597
- data/lib/origami/linearization.rb +285 -290
- data/lib/origami/metadata.rb +139 -148
- data/lib/origami/name.rb +112 -148
- data/lib/origami/null.rb +53 -62
- data/lib/origami/numeric.rb +162 -175
- data/lib/origami/obfuscation.rb +186 -174
- data/lib/origami/object.rb +593 -573
- data/lib/origami/outline.rb +42 -47
- data/lib/origami/outputintents.rb +73 -82
- data/lib/origami/page.rb +703 -592
- data/lib/origami/parser.rb +238 -290
- data/lib/origami/parsers/fdf.rb +41 -33
- data/lib/origami/parsers/pdf.rb +75 -95
- data/lib/origami/parsers/pdf/lazy.rb +137 -0
- data/lib/origami/parsers/pdf/linear.rb +64 -66
- data/lib/origami/parsers/ppklite.rb +34 -70
- data/lib/origami/pdf.rb +1030 -1005
- data/lib/origami/reference.rb +102 -102
- data/lib/origami/signature.rb +591 -609
- data/lib/origami/stream.rb +668 -551
- data/lib/origami/string.rb +397 -373
- data/lib/origami/template/patterns.rb +56 -0
- data/lib/origami/template/widgets.rb +151 -0
- data/lib/origami/trailer.rb +144 -158
- data/lib/origami/tree.rb +62 -0
- data/lib/origami/version.rb +23 -0
- data/lib/origami/webcapture.rb +88 -79
- data/lib/origami/xfa.rb +2863 -2882
- data/lib/origami/xreftable.rb +472 -384
- data/test/dataset/calc.pdf +85 -0
- data/test/dataset/crypto.pdf +82 -0
- data/test/dataset/empty.pdf +49 -0
- data/test/test_actions.rb +27 -0
- data/test/test_annotations.rb +90 -0
- data/test/test_pages.rb +31 -0
- data/test/test_pdf.rb +16 -0
- data/test/test_pdf_attachment.rb +34 -0
- data/test/test_pdf_create.rb +24 -0
- data/test/test_pdf_encrypt.rb +95 -0
- data/test/test_pdf_parse.rb +96 -0
- data/test/test_pdf_sign.rb +58 -0
- data/test/test_streams.rb +182 -0
- data/test/test_xrefs.rb +67 -0
- metadata +88 -58
- data/README +0 -67
- data/bin/pdf2graph +0 -121
- data/bin/pdfcocoon +0 -104
- data/lib/origami/file.rb +0 -233
- data/samples/README.txt +0 -45
- data/samples/actions/launch/calc.rb +0 -87
- data/samples/actions/launch/winparams.rb +0 -22
- data/samples/actions/loop/loopgoto.rb +0 -24
- data/samples/actions/loop/loopnamed.rb +0 -21
- data/samples/actions/named/named.rb +0 -31
- data/samples/actions/samba/smbrelay.rb +0 -26
- data/samples/actions/webbug/submitform.js +0 -26
- data/samples/actions/webbug/webbug-browser.rb +0 -68
- data/samples/actions/webbug/webbug-js.rb +0 -67
- data/samples/actions/webbug/webbug-reader.rb +0 -90
- data/samples/attachments/attach.rb +0 -40
- data/samples/attachments/attached.txt +0 -1
- data/samples/crypto/crypto.rb +0 -28
- data/samples/digsig/signed.rb +0 -46
- data/samples/exploits/cve-2008-2992-utilprintf.rb +0 -87
- data/samples/exploits/cve-2009-0927-geticon.rb +0 -65
- data/samples/exploits/exploit_customdictopen.rb +0 -55
- data/samples/exploits/getannots.rb +0 -69
- data/samples/flash/flash.rb +0 -31
- data/samples/javascript/attached.txt +0 -1
- data/samples/javascript/js.rb +0 -52
- data/templates/patterns.rb +0 -66
- data/templates/widgets.rb +0 -173
- data/templates/xdp.rb +0 -92
- data/test/ts_pdf.rb +0 -50
data/bin/pdfmetadata
CHANGED
|
@@ -2,122 +2,123 @@
|
|
|
2
2
|
|
|
3
3
|
=begin
|
|
4
4
|
|
|
5
|
-
=
|
|
6
|
-
|
|
5
|
+
= Info
|
|
6
|
+
Prints out the metadata contained in a PDF document.
|
|
7
7
|
|
|
8
|
-
=
|
|
9
|
-
|
|
8
|
+
= License
|
|
9
|
+
Copyright (C) 2016 Guillaume Delugré.
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
23
|
-
|
|
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
|
-
|
|
27
|
+
require 'origami'
|
|
29
28
|
rescue LoadError
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
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://
|
|
41
|
+
Bug reports or feature requests at: http://github.com/gdelugre/origami
|
|
43
42
|
|
|
44
43
|
Options:
|
|
45
44
|
USAGE
|
|
46
45
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
46
|
+
def self.parser(options)
|
|
47
|
+
OptionParser.new do |opts|
|
|
48
|
+
opts.banner = BANNER
|
|
50
49
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
opts.on("-i", "Extracts document info metadata") do |i|
|
|
51
|
+
options[:doc_info] = true
|
|
52
|
+
end
|
|
54
53
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
54
|
+
opts.on("-x", "Extracts XMP document metadata stream") do |i|
|
|
55
|
+
options[:doc_stream] = true
|
|
56
|
+
end
|
|
58
57
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
def self.parse(args)
|
|
70
|
+
options =
|
|
71
|
+
{
|
|
72
|
+
disable_colors: false
|
|
73
|
+
}
|
|
71
74
|
|
|
72
|
-
|
|
75
|
+
self.parser(options).parse!(args)
|
|
73
76
|
|
|
74
|
-
|
|
75
|
-
|
|
77
|
+
options
|
|
78
|
+
end
|
|
76
79
|
end
|
|
77
80
|
|
|
78
81
|
begin
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
puts ":
|
|
114
|
-
|
|
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
|
-
|
|
119
|
-
|
|
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
|
-
|
|
4
|
+
require 'irb'
|
|
5
5
|
rescue LoadError
|
|
6
|
-
|
|
6
|
+
abort "Error: you need to install irb to run this application."
|
|
7
7
|
end
|
|
8
8
|
|
|
9
|
-
$:.unshift
|
|
10
|
-
ENV["IRBRC"] =
|
|
9
|
+
$:.unshift File.join(__dir__, 'shell')
|
|
10
|
+
ENV["IRBRC"] = File.join(__dir__, "shell", ".irbrc")
|
|
11
11
|
|
|
12
12
|
IRB.start
|
|
13
|
-
|
data/bin/pdfwalker
CHANGED
data/bin/shell/.irbrc
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
begin
|
|
2
|
-
|
|
2
|
+
require 'origami'
|
|
3
3
|
rescue LoadError
|
|
4
|
-
|
|
5
|
-
|
|
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
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
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
|
-
|
|
92
|
-
|
|
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
|
-
|
|
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
|
-
|
data/bin/shell/console.rb
CHANGED
|
@@ -1,150 +1,125 @@
|
|
|
1
1
|
=begin
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
45
|
+
|
|
46
|
+
true
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def inspect
|
|
50
|
+
self.data.hexdump
|
|
85
51
|
end
|
|
86
|
-
end
|
|
87
52
|
end
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
146
|
-
|
|
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
|