origami 1.2.7 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -0
  3. data/README.md +112 -0
  4. data/bin/config/pdfcop.conf.yml +232 -233
  5. data/bin/gui/about.rb +27 -37
  6. data/bin/gui/config.rb +108 -117
  7. data/bin/gui/file.rb +416 -365
  8. data/bin/gui/gtkhex.rb +1138 -1153
  9. data/bin/gui/hexview.rb +55 -57
  10. data/bin/gui/imgview.rb +48 -51
  11. data/bin/gui/menu.rb +388 -386
  12. data/bin/gui/properties.rb +114 -130
  13. data/bin/gui/signing.rb +571 -617
  14. data/bin/gui/textview.rb +77 -95
  15. data/bin/gui/treeview.rb +382 -387
  16. data/bin/gui/walker.rb +227 -232
  17. data/bin/gui/xrefs.rb +56 -60
  18. data/bin/pdf2pdfa +53 -57
  19. data/bin/pdf2ruby +212 -228
  20. data/bin/pdfcop +338 -348
  21. data/bin/pdfdecompress +58 -65
  22. data/bin/pdfdecrypt +56 -60
  23. data/bin/pdfencrypt +75 -80
  24. data/bin/pdfexplode +185 -182
  25. data/bin/pdfextract +201 -218
  26. data/bin/pdfmetadata +83 -82
  27. data/bin/pdfsh +4 -5
  28. data/bin/pdfwalker +1 -2
  29. data/bin/shell/.irbrc +45 -82
  30. data/bin/shell/console.rb +105 -130
  31. data/bin/shell/hexdump.rb +40 -64
  32. data/examples/README.md +34 -0
  33. data/examples/attachments/attachment.rb +38 -0
  34. data/examples/attachments/nested_document.rb +51 -0
  35. data/examples/encryption/encryption.rb +28 -0
  36. data/{samples/actions/triggerevents/trigger.rb → examples/events/events.rb} +13 -16
  37. data/examples/flash/flash.rb +37 -0
  38. data/{samples → examples}/flash/helloworld.swf +0 -0
  39. data/examples/forms/javascript.rb +54 -0
  40. data/examples/forms/xfa.rb +115 -0
  41. data/examples/javascript/hello_world.rb +22 -0
  42. data/examples/javascript/js_emulation.rb +54 -0
  43. data/examples/loop/goto.rb +32 -0
  44. data/examples/loop/named.rb +33 -0
  45. data/examples/signature/signature.rb +65 -0
  46. data/examples/uri/javascript.rb +56 -0
  47. data/examples/uri/open-uri.rb +21 -0
  48. data/examples/uri/submitform.rb +47 -0
  49. data/lib/origami.rb +29 -42
  50. data/lib/origami/3d.rb +350 -225
  51. data/lib/origami/acroform.rb +262 -288
  52. data/lib/origami/actions.rb +268 -288
  53. data/lib/origami/annotations.rb +697 -722
  54. data/lib/origami/array.rb +258 -184
  55. data/lib/origami/boolean.rb +74 -84
  56. data/lib/origami/catalog.rb +397 -434
  57. data/lib/origami/collections.rb +144 -0
  58. data/lib/origami/destinations.rb +233 -194
  59. data/lib/origami/dictionary.rb +253 -232
  60. data/lib/origami/encryption.rb +1274 -1243
  61. data/lib/origami/export.rb +232 -268
  62. data/lib/origami/extensions/fdf.rb +307 -220
  63. data/lib/origami/extensions/ppklite.rb +368 -435
  64. data/lib/origami/filespec.rb +197 -0
  65. data/lib/origami/filters.rb +301 -295
  66. data/lib/origami/filters/ascii.rb +177 -180
  67. data/lib/origami/filters/ccitt.rb +528 -535
  68. data/lib/origami/filters/crypt.rb +26 -35
  69. data/lib/origami/filters/dct.rb +46 -52
  70. data/lib/origami/filters/flate.rb +95 -94
  71. data/lib/origami/filters/jbig2.rb +49 -55
  72. data/lib/origami/filters/jpx.rb +38 -44
  73. data/lib/origami/filters/lzw.rb +189 -183
  74. data/lib/origami/filters/predictors.rb +221 -235
  75. data/lib/origami/filters/runlength.rb +103 -104
  76. data/lib/origami/font.rb +173 -186
  77. data/lib/origami/functions.rb +67 -81
  78. data/lib/origami/graphics.rb +25 -21
  79. data/lib/origami/graphics/colors.rb +178 -187
  80. data/lib/origami/graphics/instruction.rb +79 -85
  81. data/lib/origami/graphics/path.rb +142 -148
  82. data/lib/origami/graphics/patterns.rb +160 -167
  83. data/lib/origami/graphics/render.rb +43 -50
  84. data/lib/origami/graphics/state.rb +138 -153
  85. data/lib/origami/graphics/text.rb +188 -205
  86. data/lib/origami/graphics/xobject.rb +819 -815
  87. data/lib/origami/header.rb +63 -78
  88. data/lib/origami/javascript.rb +596 -597
  89. data/lib/origami/linearization.rb +285 -290
  90. data/lib/origami/metadata.rb +139 -148
  91. data/lib/origami/name.rb +112 -148
  92. data/lib/origami/null.rb +53 -62
  93. data/lib/origami/numeric.rb +162 -175
  94. data/lib/origami/obfuscation.rb +186 -174
  95. data/lib/origami/object.rb +593 -573
  96. data/lib/origami/outline.rb +42 -47
  97. data/lib/origami/outputintents.rb +73 -82
  98. data/lib/origami/page.rb +703 -592
  99. data/lib/origami/parser.rb +238 -290
  100. data/lib/origami/parsers/fdf.rb +41 -33
  101. data/lib/origami/parsers/pdf.rb +75 -95
  102. data/lib/origami/parsers/pdf/lazy.rb +137 -0
  103. data/lib/origami/parsers/pdf/linear.rb +64 -66
  104. data/lib/origami/parsers/ppklite.rb +34 -70
  105. data/lib/origami/pdf.rb +1030 -1005
  106. data/lib/origami/reference.rb +102 -102
  107. data/lib/origami/signature.rb +591 -609
  108. data/lib/origami/stream.rb +668 -551
  109. data/lib/origami/string.rb +397 -373
  110. data/lib/origami/template/patterns.rb +56 -0
  111. data/lib/origami/template/widgets.rb +151 -0
  112. data/lib/origami/trailer.rb +144 -158
  113. data/lib/origami/tree.rb +62 -0
  114. data/lib/origami/version.rb +23 -0
  115. data/lib/origami/webcapture.rb +88 -79
  116. data/lib/origami/xfa.rb +2863 -2882
  117. data/lib/origami/xreftable.rb +472 -384
  118. data/test/dataset/calc.pdf +85 -0
  119. data/test/dataset/crypto.pdf +82 -0
  120. data/test/dataset/empty.pdf +49 -0
  121. data/test/test_actions.rb +27 -0
  122. data/test/test_annotations.rb +90 -0
  123. data/test/test_pages.rb +31 -0
  124. data/test/test_pdf.rb +16 -0
  125. data/test/test_pdf_attachment.rb +34 -0
  126. data/test/test_pdf_create.rb +24 -0
  127. data/test/test_pdf_encrypt.rb +95 -0
  128. data/test/test_pdf_parse.rb +96 -0
  129. data/test/test_pdf_sign.rb +58 -0
  130. data/test/test_streams.rb +182 -0
  131. data/test/test_xrefs.rb +67 -0
  132. metadata +88 -58
  133. data/README +0 -67
  134. data/bin/pdf2graph +0 -121
  135. data/bin/pdfcocoon +0 -104
  136. data/lib/origami/file.rb +0 -233
  137. data/samples/README.txt +0 -45
  138. data/samples/actions/launch/calc.rb +0 -87
  139. data/samples/actions/launch/winparams.rb +0 -22
  140. data/samples/actions/loop/loopgoto.rb +0 -24
  141. data/samples/actions/loop/loopnamed.rb +0 -21
  142. data/samples/actions/named/named.rb +0 -31
  143. data/samples/actions/samba/smbrelay.rb +0 -26
  144. data/samples/actions/webbug/submitform.js +0 -26
  145. data/samples/actions/webbug/webbug-browser.rb +0 -68
  146. data/samples/actions/webbug/webbug-js.rb +0 -67
  147. data/samples/actions/webbug/webbug-reader.rb +0 -90
  148. data/samples/attachments/attach.rb +0 -40
  149. data/samples/attachments/attached.txt +0 -1
  150. data/samples/crypto/crypto.rb +0 -28
  151. data/samples/digsig/signed.rb +0 -46
  152. data/samples/exploits/cve-2008-2992-utilprintf.rb +0 -87
  153. data/samples/exploits/cve-2009-0927-geticon.rb +0 -65
  154. data/samples/exploits/exploit_customdictopen.rb +0 -55
  155. data/samples/exploits/getannots.rb +0 -69
  156. data/samples/flash/flash.rb +0 -31
  157. data/samples/javascript/attached.txt +0 -1
  158. data/samples/javascript/js.rb +0 -52
  159. data/templates/patterns.rb +0 -66
  160. data/templates/widgets.rb +0 -173
  161. data/templates/xdp.rb +0 -92
  162. data/test/ts_pdf.rb +0 -50
@@ -1,93 +1,79 @@
1
1
  =begin
2
2
 
3
- = File
4
- functions.rb
5
-
6
- = Info
7
- This file is part of Origami, PDF manipulation framework for Ruby
8
- Copyright (C) 2010 Guillaume Delugré <guillaume AT security-labs DOT org>
9
- All right reserved.
10
-
11
- Origami is free software: you can redistribute it and/or modify
12
- it under the terms of the GNU Lesser General Public License as published by
13
- the Free Software Foundation, either version 3 of the License, or
14
- (at your option) any later version.
15
-
16
- Origami is distributed in the hope that it will be useful,
17
- but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- GNU Lesser General Public License for more details.
20
-
21
- You should have received a copy of the GNU Lesser General Public License
22
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
3
+ This file is part of Origami, PDF manipulation framework for Ruby
4
+ Copyright (C) 2016 Guillaume Delugré.
23
5
 
24
- =end
25
-
26
-
27
- module Origami
28
-
29
- module Function
30
-
31
- module Type
32
- SAMPLED = 0
33
- EXPONENTIAL = 2
34
- STITCHING = 3
35
- POSTSCRIPT = 4
36
- end
37
-
38
- def self.included(receiver)
39
- receiver.field :FunctionType, :Type => Integer, :Required => true
40
- receiver.field :Domain, :Type => Array, :Required => true
41
- receiver.field :Range, :Type => Array
42
- end
43
-
44
- class Sampled < Stream
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.
45
10
 
46
- include Function
47
-
48
- field :FunctionType, :Type => Integer, :Default => Type::SAMPLED, :Version => "1.3", :Required => true
49
- field :Range, :Type => Array, :Required => true
50
- field :Size, :Type => Array, :Required => true
51
- field :BitsPerSample, :Type => Integer, :Required => true
52
- field :Order, :Type => Integer, :Default => 1
53
- field :Encode, :Type => Array
54
- field :Decode, :Type => Array
55
-
56
- end
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.
57
15
 
58
- class Exponential < Dictionary
59
-
60
- include StandardObject
61
- include Function
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/>.
62
18
 
63
- field :FunctionType, :Type => Integer, :Default => Type::EXPONENTIAL, :Version => "1.3", :Required => true
64
- field :C0, :Type => Array, :Default => [ 0.0 ]
65
- field :C1, :Type => Array, :Default => [ 1.0 ]
66
- field :N, :Type => Number, :Required => true
67
-
68
- end
69
-
70
- class Stitching < Dictionary
71
-
72
- include StandardObject
73
- include Function
74
-
75
- field :FunctionType, :Type => Integer, :Default => Type::STITCHING, :Version => "1.3", :Required => true
76
- field :Functions, :Type => Array, :Required => true
77
- field :Bounds, :Type => Array, :Required => true
78
- field :Encode, :Type => Array, :Required => true
79
-
80
- end
81
-
82
- class PostScript < Stream
19
+ =end
83
20
 
84
- include Function
85
21
 
86
- field :FunctionType, :Type => Integer, :Default => Type::POSTSCRIPT, :Version => "1.3", :Required => true
87
- field :Range, :Type => Array, :Required => true
22
+ module Origami
88
23
 
24
+ module Function
25
+
26
+ module Type
27
+ SAMPLED = 0
28
+ EXPONENTIAL = 2
29
+ STITCHING = 3
30
+ POSTSCRIPT = 4
31
+ end
32
+
33
+ def self.included(receiver)
34
+ receiver.field :FunctionType, :Type => Integer, :Required => true
35
+ receiver.field :Domain, :Type => Array.of(Number), :Required => true
36
+ receiver.field :Range, :Type => Array.of(Number)
37
+ end
38
+
39
+ class Sampled < Stream
40
+ include Function
41
+
42
+ field :FunctionType, :Type => Integer, :Default => Type::SAMPLED, :Version => "1.3", :Required => true
43
+ field :Range, :Type => Array.of(Number), :Required => true
44
+ field :Size, :Type => Array.of(Integer), :Required => true
45
+ field :BitsPerSample, :Type => Integer, :Required => true
46
+ field :Order, :Type => Integer, :Default => 1
47
+ field :Encode, :Type => Array.of(Number)
48
+ field :Decode, :Type => Array.of(Number)
49
+ end
50
+
51
+ class Exponential < Dictionary
52
+ include StandardObject
53
+ include Function
54
+
55
+ field :FunctionType, :Type => Integer, :Default => Type::EXPONENTIAL, :Version => "1.3", :Required => true
56
+ field :C0, :Type => Array.of(Number), :Default => [ 0.0 ]
57
+ field :C1, :Type => Array.of(Number), :Default => [ 1.0 ]
58
+ field :N, :Type => Number, :Required => true
59
+ end
60
+
61
+ class Stitching < Dictionary
62
+ include StandardObject
63
+ include Function
64
+
65
+ field :FunctionType, :Type => Integer, :Default => Type::STITCHING, :Version => "1.3", :Required => true
66
+ field :Functions, :Type => Array, :Required => true
67
+ field :Bounds, :Type => Array.of(Number), :Required => true
68
+ field :Encode, :Type => Array.of(Number), :Required => true
69
+ end
70
+
71
+ class PostScript < Stream
72
+ include Function
73
+
74
+ field :FunctionType, :Type => Integer, :Default => Type::POSTSCRIPT, :Version => "1.3", :Required => true
75
+ field :Range, :Type => Array.of(Number), :Required => true
76
+ end
89
77
  end
90
78
 
91
- end
92
-
93
79
  end
@@ -1,28 +1,33 @@
1
1
  =begin
2
2
 
3
- = File
4
- graphics.rb
5
-
6
- = Info
7
- This file is part of Origami, PDF manipulation framework for Ruby
8
- Copyright (C) 2010 Guillaume Delugré <guillaume AT security-labs DOT org>
9
- All right reserved.
10
-
11
- Origami is free software: you can redistribute it and/or modify
12
- it under the terms of the GNU Lesser General Public License as published by
13
- the Free Software Foundation, either version 3 of the License, or
14
- (at your option) any later version.
15
-
16
- Origami is distributed in the hope that it will be useful,
17
- but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- GNU Lesser General Public License for more details.
20
-
21
- You should have received a copy of the GNU Lesser General Public License
22
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
3
+ This file is part of Origami, PDF manipulation framework for Ruby
4
+ Copyright (C) 2016 Guillaume Delugré.
5
+
6
+ Origami is free software: you can redistribute it and/or modify
7
+ it under the terms of the GNU Lesser General Public License as published by
8
+ the Free Software Foundation, either version 3 of the License, or
9
+ (at your option) any later version.
10
+
11
+ Origami is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU Lesser General Public License for more details.
15
+
16
+ You should have received a copy of the GNU Lesser General Public License
17
+ along with Origami. If not, see <http://www.gnu.org/licenses/>.
23
18
 
24
19
  =end
25
20
 
21
+ module Origami
22
+
23
+ module Graphics
24
+ #
25
+ # Common graphics Exception class for errors.
26
+ #
27
+ class Error < Origami::Error; end
28
+ end
29
+ end
30
+
26
31
  require 'origami/graphics/instruction'
27
32
  require 'origami/graphics/colors'
28
33
  require 'origami/graphics/path'
@@ -31,4 +36,3 @@ require 'origami/graphics/patterns'
31
36
  require 'origami/graphics/text'
32
37
  require 'origami/graphics/state'
33
38
  require 'origami/graphics/render'
34
-
@@ -1,213 +1,204 @@
1
1
  =begin
2
2
 
3
- = File
4
- graphics/colors.rb
5
-
6
- = Info
7
- This file is part of Origami, PDF manipulation framework for Ruby
8
- Copyright (C) 2010 Guillaume Delugré <guillaume AT security-labs DOT org>
9
- All right reserved.
10
-
11
- Origami is free software: you can redistribute it and/or modify
12
- it under the terms of the GNU Lesser General Public License as published by
13
- the Free Software Foundation, either version 3 of the License, or
14
- (at your option) any later version.
15
-
16
- Origami is distributed in the hope that it will be useful,
17
- but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- GNU Lesser General Public License for more details.
20
-
21
- You should have received a copy of the GNU Lesser General Public License
22
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
3
+ This file is part of Origami, PDF manipulation framework for Ruby
4
+ Copyright (C) 2016 Guillaume Delugré.
23
5
 
24
- =end
25
-
26
- begin
27
- require 'color'
28
- rescue LoadError
29
- end
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.
30
10
 
31
- module Origami
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.
32
15
 
33
- module Graphics
34
-
35
- class InvalidColorError < Exception; end
36
- module Color
37
-
38
- module Intent
39
- ABSOLUTE = :AbsoluteColorimetric
40
- RELATIVE = :RelativeColorimetric
41
- SATURATION = :Saturation
42
- PERCEPTUAL = :Perceptual
43
- end
44
-
45
- module BlendMode
46
- NORMAL = :Normal
47
- COMPATIBLE = :Compatible
48
- MULTIPLY = :Multiply
49
- SCREEN = :Screen
50
- OVERLAY = :Overlay
51
- DARKEN = :Darken
52
- LIGHTEN = :Lighten
53
- COLORDODGE = :ColorDodge
54
- COLORBURN = :ColorBurn
55
- HARDLIGHT = :HardLight
56
- SOFTLIGHt = :SoftLight
57
- DIFFERENCE = :Difference
58
- EXCLUSION = :Exclusion
59
- end
60
-
61
- module Space
62
- DEVICE_GRAY = :DeviceGray
63
- DEVICE_RGB = :DeviceRGB
64
- DEVICE_CMYK = :DeviceCMYK
65
- end
66
-
67
- def self.cmyk_to_rgb(c, m, y, k)
68
- r = 1 - (( c * ( 1 - k ) + k ))
69
- g = 1 - (( m * ( 1 - k ) + k ))
70
- b = 1 - (( y * ( 1 - k ) + k ))
71
-
72
- [ r, g, b ]
73
- end
74
-
75
- def self.gray_to_rgb(g)
76
- [ g, g, g ]
77
- end
78
-
79
- #
80
- # Class representing an embedded ICC Profile stream.
81
- #
82
- class ICCProfile < Stream
83
- field :N, :Type => Integer, :Required => true, :Version => '1.3'
84
- field :Alternate, :Type => [ Name, Array ]
85
- field :Range, :Type => Array
86
- field :Metadata, :Type => Stream, :Version => '1.4'
87
- end
88
-
89
- class GrayScale
90
- attr_accessor :g
91
-
92
- def initialize(g)
93
- @g = g
94
- end
95
- end
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/>.
96
18
 
97
- class RGB
98
- attr_accessor :r,:g,:b
19
+ =end
99
20
 
100
- def initialize(r,g,b)
101
- @r,@g,@b = r,g,b
102
- end
103
- end
21
+ module Origami
104
22
 
105
- class CMYK
106
- attr_accessor :c,:m,:y,:k
23
+ module Graphics
107
24
 
108
- def initialize(c,m,y,k)
109
- @c,@m,@y,@k = c,m,y,k
25
+ class InvalidColorError < Error #:nodoc:
110
26
  end
111
- end
112
-
113
- def Color.to_a(color)
114
- return color if color.is_a?(::Array)
115
-
116
- if (color.respond_to? :r and color.respond_to? :g and color.respond_to? :b)
117
- r = (color.respond_to?(:r) ? color.r : color[0]).to_f / 255
118
- g = (color.respond_to?(:g) ? color.g : color[1]).to_f / 255
119
- b = (color.respond_to?(:b) ? color.b : color[2]).to_f / 255
120
- return [r, g, b]
121
-
122
- elsif (color.respond_to? :c and color.respond_to? :m and color.respond_to? :y and color.respond_to? :k)
123
- c = (color.respond_to?(:c) ? color.c : color[0]).to_f
124
- m = (color.respond_to?(:m) ? color.m : color[1]).to_f
125
- y = (color.respond_to?(:y) ? color.y : color[2]).to_f
126
- k = (color.respond_to?(:k) ? color.k : color[3]).to_f
127
- return [c,m,y,k]
128
-
129
- elsif color.respond_to?:g or (0.0..1.0) === color
130
- g = color.respond_to?(:g) ? color.g : color
131
- return [ g ]
132
-
133
- else
134
- raise TypeError, "Invalid color : #{color}"
27
+
28
+ module Color
29
+
30
+ module Intent
31
+ ABSOLUTE = :AbsoluteColorimetric
32
+ RELATIVE = :RelativeColorimetric
33
+ SATURATION = :Saturation
34
+ PERCEPTUAL = :Perceptual
35
+ end
36
+
37
+ module BlendMode
38
+ NORMAL = :Normal
39
+ COMPATIBLE = :Compatible
40
+ MULTIPLY = :Multiply
41
+ SCREEN = :Screen
42
+ OVERLAY = :Overlay
43
+ DARKEN = :Darken
44
+ LIGHTEN = :Lighten
45
+ COLORDODGE = :ColorDodge
46
+ COLORBURN = :ColorBurn
47
+ HARDLIGHT = :HardLight
48
+ SOFTLIGHt = :SoftLight
49
+ DIFFERENCE = :Difference
50
+ EXCLUSION = :Exclusion
51
+ end
52
+
53
+ module Space
54
+ DEVICE_GRAY = :DeviceGray
55
+ DEVICE_RGB = :DeviceRGB
56
+ DEVICE_CMYK = :DeviceCMYK
57
+ end
58
+
59
+ def self.cmyk_to_rgb(c, m, y, k)
60
+ r = 1 - (( c * ( 1 - k ) + k ))
61
+ g = 1 - (( m * ( 1 - k ) + k ))
62
+ b = 1 - (( y * ( 1 - k ) + k ))
63
+
64
+ [ r, g, b ]
65
+ end
66
+
67
+ def self.gray_to_rgb(g)
68
+ [ g, g, g ]
69
+ end
70
+
71
+ #
72
+ # Class representing an embedded ICC Profile stream.
73
+ #
74
+ class ICCProfile < Stream
75
+ field :N, :Type => Integer, :Required => true, :Version => '1.3'
76
+ field :Alternate, :Type => [ Name, Array ]
77
+ field :Range, :Type => Array
78
+ field :Metadata, :Type => Stream, :Version => '1.4'
79
+ end
80
+
81
+ class GrayScale
82
+ attr_accessor :g
83
+
84
+ def initialize(g)
85
+ @g = g
86
+ end
87
+ end
88
+
89
+ class RGB
90
+ attr_accessor :r,:g,:b
91
+
92
+ def initialize(r,g,b)
93
+ @r,@g,@b = r,g,b
94
+ end
95
+ end
96
+
97
+ class CMYK
98
+ attr_accessor :c,:m,:y,:k
99
+
100
+ def initialize(c,m,y,k)
101
+ @c,@m,@y,@k = c,m,y,k
102
+ end
103
+ end
104
+
105
+ def Color.to_a(color)
106
+ return color if color.is_a?(::Array)
107
+
108
+ if (color.respond_to? :r and color.respond_to? :g and color.respond_to? :b)
109
+ r = (color.respond_to?(:r) ? color.r : color[0]).to_f / 255
110
+ g = (color.respond_to?(:g) ? color.g : color[1]).to_f / 255
111
+ b = (color.respond_to?(:b) ? color.b : color[2]).to_f / 255
112
+ return [r, g, b]
113
+
114
+ elsif (color.respond_to? :c and color.respond_to? :m and color.respond_to? :y and color.respond_to? :k)
115
+ c = (color.respond_to?(:c) ? color.c : color[0]).to_f
116
+ m = (color.respond_to?(:m) ? color.m : color[1]).to_f
117
+ y = (color.respond_to?(:y) ? color.y : color[2]).to_f
118
+ k = (color.respond_to?(:k) ? color.k : color[3]).to_f
119
+ return [c,m,y,k]
120
+
121
+ elsif color.respond_to?:g or (0.0..1.0) === color
122
+ g = color.respond_to?(:g) ? color.g : color
123
+ return [ g ]
124
+
125
+ else
126
+ raise TypeError, "Invalid color : #{color}"
127
+ end
128
+ end
135
129
  end
136
- end
137
130
  end
138
131
 
139
- end
132
+ class PDF::Instruction
140
133
 
141
- class PDF::Instruction
134
+ insn 'CS', Name do |canvas, cs| canvas.gs.stroking_colorspace = cs end
135
+ insn 'cs', Name do |canvas, cs| canvas.gs.nonstroking_colorspace = cs end
136
+ insn 'SC', '*' do |canvas, *c| canvas.gs.stroking_color = c end
137
+ insn 'sc', '*' do |canvas, *c| canvas.gs.nonstroking_color = c end
142
138
 
143
- insn 'CS', Name do |canvas, cs| canvas.gs.stroking_colorspace = cs end
144
- insn 'cs', Name do |canvas, cs| canvas.gs.nonstroking_colorspace = cs end
145
- insn 'SC', '*' do |canvas, *c| canvas.gs.stroking_color = c end
146
- insn 'sc', '*' do |canvas, *c| canvas.gs.nonstroking_color = c end
147
-
148
- insn 'G', Real do |canvas, c|
149
- unless (0..1).include? c
150
- raise Graphics::InvalidColorError,
151
- "Not a valid color for DeviceGray: #{c}"
152
- end
139
+ insn 'G', Real do |canvas, c|
140
+ unless (0..1).include? c
141
+ raise Graphics::InvalidColorError,
142
+ "Not a valid color for DeviceGray: #{c}"
143
+ end
153
144
 
154
- canvas.gs.stroking_colorspace = Graphics::Color::Space::DEVICE_GRAY
155
- canvas.gs.stroking_color = [ c ]
156
- end
157
-
158
- insn 'g', Real do |canvas, c|
159
- unless (0..1).include? c
160
- raise Graphics::InvalidColorError,
161
- "Not a valid color for DeviceGray: #{c}"
162
- end
163
-
164
- canvas.gs.nonstroking_colorspace = Graphics::Color::Space::DEVICE_GRAY
165
- canvas.gs.nonstroking_color = [ c ]
166
- end
145
+ canvas.gs.stroking_colorspace = Graphics::Color::Space::DEVICE_GRAY
146
+ canvas.gs.stroking_color = [ c ]
147
+ end
167
148
 
168
- insn 'RG', Real, Real, Real do |canvas, r,g,b|
169
- c = [ r, g, b ]
170
- unless c.all? {|b| (0..1).include? b}
171
- raise Graphics::InvalidColorError,
172
- "Not a valid color for DeviceRGB: #{c.inspect}"
173
- end
149
+ insn 'g', Real do |canvas, c|
150
+ unless (0..1).include? c
151
+ raise Graphics::InvalidColorError,
152
+ "Not a valid color for DeviceGray: #{c}"
153
+ end
174
154
 
175
- canvas.gs.stroking_colorspace = Graphics::Color::Space::DEVICE_RGB
176
- canvas.gs.stroking_color = c
177
- end
155
+ canvas.gs.nonstroking_colorspace = Graphics::Color::Space::DEVICE_GRAY
156
+ canvas.gs.nonstroking_color = [ c ]
157
+ end
178
158
 
179
- insn 'rg', Real, Real, Real do |canvas, r,g,b|
180
- c = [ r, g, b ]
181
- unless c.all? {|b| (0..1).include? b}
182
- raise Graphics::InvalidColorError,
183
- "Not a valid color for DeviceRGB: #{c.inspect}"
184
- end
159
+ insn 'RG', Real, Real, Real do |canvas, r,g,b|
160
+ color = [ r, g, b ]
161
+ unless color.all? {|comp| (0..1).include? comp}
162
+ raise Graphics::InvalidColorError,
163
+ "Not a valid color for DeviceRGB: #{color.inspect}"
164
+ end
185
165
 
186
- canvas.gs.nonstroking_colorspace = Graphics::Color::Space::DEVICE_RGB
187
- canvas.gs.nonstroking_color = c
188
- end
166
+ canvas.gs.stroking_colorspace = Graphics::Color::Space::DEVICE_RGB
167
+ canvas.gs.stroking_color = color
168
+ end
189
169
 
190
- insn 'K', Real, Real, Real, Real do |canvas, c,m,y,k|
191
- c = [ c, m, y, k ]
192
- unless c.all? {|b| (0..1).include? b}
193
- raise Graphics::InvalidColorError,
194
- "Not a valid color for DeviceCMYK: #{c.inspect}"
195
- end
170
+ insn 'rg', Real, Real, Real do |canvas, r,g,b|
171
+ color = [ r, g, b ]
172
+ unless color.all? {|comp| (0..1).include? comp}
173
+ raise Graphics::InvalidColorError,
174
+ "Not a valid color for DeviceRGB: #{color.inspect}"
175
+ end
196
176
 
197
- canvas.gs.stroking_colorspace = Graphics::Color::Space::DEVICE_CMYK
198
- canvas.gs.stroking_color = c
199
- end
177
+ canvas.gs.nonstroking_colorspace = Graphics::Color::Space::DEVICE_RGB
178
+ canvas.gs.nonstroking_color = color
179
+ end
200
180
 
201
- insn 'k', Real, Real, Real, Real do |canvas, c,m,y,k|
202
- c = [ c, m, y, k ]
203
- unless c.all? {|b| (0..1).include? b}
204
- raise Graphics::InvalidColorError,
205
- "Not a valid color for DeviceCMYK: #{c.inspect}"
206
- end
181
+ insn 'K', Real, Real, Real, Real do |canvas, c,m,y,k|
182
+ color = [ c, m, y, k ]
183
+ unless color.all? {|comp| (0..1).include? comp}
184
+ raise Graphics::InvalidColorError,
185
+ "Not a valid color for DeviceCMYK: #{color.inspect}"
186
+ end
207
187
 
208
- canvas.gs.nonstroking_colorspace = Graphics::Color::Space::DEVICE_CMYK
209
- canvas.gs.nonstroking_color = c
188
+ canvas.gs.stroking_colorspace = Graphics::Color::Space::DEVICE_CMYK
189
+ canvas.gs.stroking_color = color
190
+ end
191
+
192
+ insn 'k', Real, Real, Real, Real do |canvas, c,m,y,k|
193
+ color = [ c, m, y, k ]
194
+ unless color.all? {|comp| (0..1).include? comp}
195
+ raise Graphics::InvalidColorError,
196
+ "Not a valid color for DeviceCMYK: #{color.inspect}"
197
+ end
198
+
199
+ canvas.gs.nonstroking_colorspace = Graphics::Color::Space::DEVICE_CMYK
200
+ canvas.gs.nonstroking_color = color
201
+ end
210
202
  end
211
- end
212
203
 
213
- end # module Origami
204
+ end