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/lib/origami/null.rb
CHANGED
|
@@ -1,75 +1,66 @@
|
|
|
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
|
|
|
26
21
|
module Origami
|
|
27
22
|
|
|
28
|
-
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
#
|
|
32
|
-
# Class representing Null Object.
|
|
33
|
-
#
|
|
34
|
-
class Null
|
|
35
|
-
|
|
36
|
-
include Origami::Object
|
|
37
|
-
|
|
38
|
-
TOKENS = %w{ null } #:nodoc:
|
|
39
|
-
|
|
40
|
-
@@regexp = Regexp.new(WHITESPACES + TOKENS.first)
|
|
41
|
-
|
|
42
|
-
def initialize
|
|
43
|
-
super
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def self.parse(stream, parser = nil) #:nodoc:
|
|
47
|
-
|
|
48
|
-
offset = stream.pos
|
|
49
|
-
|
|
50
|
-
if stream.skip(@@regexp).nil?
|
|
51
|
-
raise InvalidNullObjectError
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
null = Null.new
|
|
55
|
-
null.file_offset = offset
|
|
56
|
-
|
|
57
|
-
null
|
|
23
|
+
class InvalidNullObjectError < InvalidObjectError #:nodoc:
|
|
58
24
|
end
|
|
59
|
-
|
|
25
|
+
|
|
60
26
|
#
|
|
61
|
-
#
|
|
27
|
+
# Class representing Null Object.
|
|
62
28
|
#
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
29
|
+
class Null
|
|
30
|
+
include Origami::Object
|
|
31
|
+
|
|
32
|
+
TOKENS = %w{ null } #:nodoc:
|
|
33
|
+
@@regexp = Regexp.new(WHITESPACES + TOKENS.first)
|
|
34
|
+
|
|
35
|
+
def initialize
|
|
36
|
+
super
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def self.parse(stream, parser = nil) #:nodoc:
|
|
40
|
+
offset = stream.pos
|
|
41
|
+
|
|
42
|
+
if stream.skip(@@regexp).nil?
|
|
43
|
+
raise InvalidNullObjectError
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
null = Null.new
|
|
47
|
+
null.file_offset = offset
|
|
48
|
+
|
|
49
|
+
null
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
#
|
|
53
|
+
# Returns *nil*.
|
|
54
|
+
#
|
|
55
|
+
def value
|
|
56
|
+
nil
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def to_s #:nodoc:
|
|
60
|
+
super(TOKENS.first)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def self.native_type ; Null end
|
|
69
64
|
end
|
|
70
65
|
|
|
71
|
-
def self.native_type ; Null end
|
|
72
|
-
|
|
73
|
-
end
|
|
74
|
-
|
|
75
66
|
end
|
data/lib/origami/numeric.rb
CHANGED
|
@@ -1,25 +1,20 @@
|
|
|
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
|
|
|
@@ -27,176 +22,168 @@ require 'delegate'
|
|
|
27
22
|
|
|
28
23
|
module Origami
|
|
29
24
|
|
|
30
|
-
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
#
|
|
34
|
-
# Class representing a PDF number (Integer, or Real).
|
|
35
|
-
#
|
|
36
|
-
module Number
|
|
37
|
-
include Origami::Object
|
|
38
|
-
|
|
39
|
-
def ~
|
|
40
|
-
self.class.new(~self.to_i)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def |(val)
|
|
44
|
-
self.class.new(self.to_i | val)
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def &(val)
|
|
48
|
-
self.class.new(self.to_i & val)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def ^(val)
|
|
52
|
-
self.class.new(self.to_i ^ val)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def <<(val)
|
|
56
|
-
self.class.new(self.to_i << val)
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def >>(val)
|
|
60
|
-
self.class.new(self.to_i >> val)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def +(val)
|
|
64
|
-
self.class.new(self.to_i + val)
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def -(val)
|
|
68
|
-
self.class.new(self.to_i - val)
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def -@
|
|
72
|
-
self.class.new(-self.to_i)
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def *(val)
|
|
76
|
-
self.class.new(self.to_i * val)
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def /(val)
|
|
80
|
-
self.class.new(self.to_i / val)
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
def abs
|
|
84
|
-
self.class.new(self.to_i.abs)
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def **(val)
|
|
88
|
-
self.class.new(self.to_i ** val)
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
def to_s
|
|
92
|
-
super(value.to_s)
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
module ClassMethods #:nodoc:all
|
|
96
|
-
def native_type; Number end
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
def self.included(receiver) #:nodoc:
|
|
100
|
-
receiver.extend(ClassMethods)
|
|
25
|
+
class InvalidIntegerObjectError < InvalidObjectError #:nodoc:
|
|
101
26
|
end
|
|
102
|
-
|
|
103
|
-
def self.native_type; Number end #:nodoc:
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
#
|
|
107
|
-
# Class representing an Integer Object.
|
|
108
|
-
#
|
|
109
|
-
class Integer < DelegateClass(Bignum)
|
|
110
|
-
|
|
111
|
-
include Number
|
|
112
|
-
|
|
113
|
-
TOKENS = [ "(\\+|-)?[\\d]+[^.]?" ] #:nodoc:
|
|
114
|
-
|
|
115
|
-
REGEXP_TOKEN = Regexp.new(TOKENS.first)
|
|
116
|
-
|
|
117
|
-
@@regexp = Regexp.new(WHITESPACES + "((\\+|-)?[\\d]+)")
|
|
118
27
|
|
|
119
28
|
#
|
|
120
|
-
#
|
|
121
|
-
# _i_:: The Integer value.
|
|
29
|
+
# Class representing a PDF number (Integer, or Real).
|
|
122
30
|
#
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
unless i.is_a?(::Integer)
|
|
126
|
-
raise TypeError, "Expected type Fixnum or Bignum, received #{i.class}."
|
|
127
|
-
end
|
|
31
|
+
module Number
|
|
32
|
+
include Origami::Object
|
|
128
33
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
34
|
+
def ~
|
|
35
|
+
self.class.new(~self.to_i)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def |(val)
|
|
39
|
+
self.class.new(self.to_i | val)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def &(val)
|
|
43
|
+
self.class.new(self.to_i & val)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def ^(val)
|
|
47
|
+
self.class.new(self.to_i ^ val)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def <<(val)
|
|
51
|
+
self.class.new(self.to_i << val)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def >>(val)
|
|
55
|
+
self.class.new(self.to_i >> val)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def +(val)
|
|
59
|
+
self.class.new(self.to_i + val)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def -(val)
|
|
63
|
+
self.class.new(self.to_i - val)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def -@
|
|
67
|
+
self.class.new(-self.to_i)
|
|
68
|
+
end
|
|
133
69
|
|
|
134
|
-
|
|
70
|
+
def *(val)
|
|
71
|
+
self.class.new(self.to_i * val)
|
|
72
|
+
end
|
|
135
73
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
74
|
+
def /(val)
|
|
75
|
+
self.class.new(self.to_i / val)
|
|
76
|
+
end
|
|
139
77
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
78
|
+
def abs
|
|
79
|
+
self.class.new(self.to_i.abs)
|
|
80
|
+
end
|
|
143
81
|
|
|
144
|
-
|
|
82
|
+
def **(val)
|
|
83
|
+
self.class.new(self.to_i ** val)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def to_s
|
|
87
|
+
super(value.to_s)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
module ClassMethods #:nodoc:all
|
|
91
|
+
def native_type; Number end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def self.included(receiver) #:nodoc:
|
|
95
|
+
receiver.extend(ClassMethods)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def self.native_type; Number end #:nodoc:
|
|
145
99
|
end
|
|
146
|
-
|
|
147
|
-
alias value to_i
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
class InvalidRealObjectError < InvalidObjectError #:nodoc:
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
#
|
|
154
|
-
# Class representing a Real number Object.
|
|
155
|
-
# PDF real numbers are arbitrary precision numbers, depending on architectures.
|
|
156
|
-
#
|
|
157
|
-
class Real < DelegateClass(Float)
|
|
158
|
-
|
|
159
|
-
include Number
|
|
160
|
-
|
|
161
|
-
TOKENS = [ "(\\+|-)?([\\d]*\\.[\\d]+|[\\d]+\\.[\\d]*)([eE](\\+|-)?[\\d]+)?" ] #:nodoc:
|
|
162
|
-
|
|
163
|
-
REGEXP_TOKEN = Regexp.new(TOKENS.first)
|
|
164
|
-
|
|
165
|
-
@@regexp = Regexp.new(WHITESPACES + "(" + TOKENS.first + ")")
|
|
166
|
-
|
|
100
|
+
|
|
167
101
|
#
|
|
168
|
-
#
|
|
169
|
-
# _f_:: The new Real value.
|
|
102
|
+
# Class representing an Integer Object.
|
|
170
103
|
#
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
104
|
+
class Integer < DelegateClass(Bignum)
|
|
105
|
+
include Number
|
|
106
|
+
|
|
107
|
+
TOKENS = [ "(\\+|-)?[\\d]+[^.]?" ] #:nodoc:
|
|
108
|
+
REGEXP_TOKEN = Regexp.new(TOKENS.first)
|
|
109
|
+
|
|
110
|
+
@@regexp = Regexp.new(WHITESPACES + "(?<int>(\\+|-)?[\\d]+)")
|
|
111
|
+
|
|
112
|
+
#
|
|
113
|
+
# Creates a new Integer from a Ruby Fixnum / Bignum.
|
|
114
|
+
# _i_:: The Integer value.
|
|
115
|
+
#
|
|
116
|
+
def initialize(i = 0)
|
|
117
|
+
unless i.is_a?(::Integer)
|
|
118
|
+
raise TypeError, "Expected type Fixnum or Bignum, received #{i.class}."
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
super(i)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def self.parse(stream, parser = nil) #:nodoc:
|
|
125
|
+
offset = stream.pos
|
|
126
|
+
|
|
127
|
+
if not stream.scan(@@regexp)
|
|
128
|
+
raise InvalidIntegerObjectError, "Invalid integer format"
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
value = stream['int'].to_i
|
|
132
|
+
int = Integer.new(value)
|
|
133
|
+
int.file_offset = offset
|
|
134
|
+
|
|
135
|
+
int
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
alias value to_i
|
|
178
139
|
end
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
offset = stream.pos
|
|
183
|
-
|
|
184
|
-
if not stream.scan(@@regexp)
|
|
185
|
-
raise InvalidRealObjectError, "Invalid real number format"
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
value = stream[2].to_f
|
|
189
|
-
real = Real.new(value)
|
|
190
|
-
real.file_offset = offset
|
|
191
|
-
|
|
192
|
-
real
|
|
140
|
+
|
|
141
|
+
class InvalidRealObjectError < InvalidObjectError #:nodoc:
|
|
193
142
|
end
|
|
194
|
-
|
|
195
|
-
alias value to_f
|
|
196
143
|
|
|
197
|
-
|
|
198
|
-
|
|
144
|
+
#
|
|
145
|
+
# Class representing a Real number Object.
|
|
146
|
+
# PDF real numbers are arbitrary precision numbers, depending on architectures.
|
|
147
|
+
#
|
|
148
|
+
class Real < DelegateClass(Float)
|
|
149
|
+
include Number
|
|
150
|
+
|
|
151
|
+
TOKENS = [ "(\\+|-)?([\\d]*\\.[\\d]+|[\\d]+\\.[\\d]*)([eE](\\+|-)?[\\d]+)?" ] #:nodoc:
|
|
152
|
+
REGEXP_TOKEN = Regexp.new(TOKENS.first)
|
|
153
|
+
|
|
154
|
+
@@regexp = Regexp.new(WHITESPACES + "(?<real>#{TOKENS.first})")
|
|
155
|
+
|
|
156
|
+
#
|
|
157
|
+
# Creates a new Real from a Ruby Float.
|
|
158
|
+
# _f_:: The new Real value.
|
|
159
|
+
#
|
|
160
|
+
def initialize(f = 0)
|
|
161
|
+
unless f.is_a?(Float)
|
|
162
|
+
raise TypeError, "Expected type Float, received #{f.class}."
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
super(f)
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def self.parse(stream, parser = nil) #:nodoc:
|
|
169
|
+
offset = stream.pos
|
|
170
|
+
|
|
171
|
+
if not stream.scan(@@regexp)
|
|
172
|
+
raise InvalidRealObjectError, "Invalid real number format"
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
value = stream['real'].to_f
|
|
176
|
+
real = Real.new(value)
|
|
177
|
+
real.file_offset = offset
|
|
178
|
+
|
|
179
|
+
real
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
alias value to_f
|
|
183
|
+
|
|
184
|
+
def to_s
|
|
185
|
+
sprintf("%f", self).sub(/\.0*$|(\.\d*[^0])0*$/, '\1')
|
|
186
|
+
end
|
|
199
187
|
end
|
|
200
|
-
end
|
|
201
188
|
|
|
202
189
|
end
|