origami 1.2.7 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (162) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -0
  3. data/README.md +112 -0
  4. data/bin/config/pdfcop.conf.yml +232 -233
  5. data/bin/gui/about.rb +27 -37
  6. data/bin/gui/config.rb +108 -117
  7. data/bin/gui/file.rb +416 -365
  8. data/bin/gui/gtkhex.rb +1138 -1153
  9. data/bin/gui/hexview.rb +55 -57
  10. data/bin/gui/imgview.rb +48 -51
  11. data/bin/gui/menu.rb +388 -386
  12. data/bin/gui/properties.rb +114 -130
  13. data/bin/gui/signing.rb +571 -617
  14. data/bin/gui/textview.rb +77 -95
  15. data/bin/gui/treeview.rb +382 -387
  16. data/bin/gui/walker.rb +227 -232
  17. data/bin/gui/xrefs.rb +56 -60
  18. data/bin/pdf2pdfa +53 -57
  19. data/bin/pdf2ruby +212 -228
  20. data/bin/pdfcop +338 -348
  21. data/bin/pdfdecompress +58 -65
  22. data/bin/pdfdecrypt +56 -60
  23. data/bin/pdfencrypt +75 -80
  24. data/bin/pdfexplode +185 -182
  25. data/bin/pdfextract +201 -218
  26. data/bin/pdfmetadata +83 -82
  27. data/bin/pdfsh +4 -5
  28. data/bin/pdfwalker +1 -2
  29. data/bin/shell/.irbrc +45 -82
  30. data/bin/shell/console.rb +105 -130
  31. data/bin/shell/hexdump.rb +40 -64
  32. data/examples/README.md +34 -0
  33. data/examples/attachments/attachment.rb +38 -0
  34. data/examples/attachments/nested_document.rb +51 -0
  35. data/examples/encryption/encryption.rb +28 -0
  36. data/{samples/actions/triggerevents/trigger.rb → examples/events/events.rb} +13 -16
  37. data/examples/flash/flash.rb +37 -0
  38. data/{samples → examples}/flash/helloworld.swf +0 -0
  39. data/examples/forms/javascript.rb +54 -0
  40. data/examples/forms/xfa.rb +115 -0
  41. data/examples/javascript/hello_world.rb +22 -0
  42. data/examples/javascript/js_emulation.rb +54 -0
  43. data/examples/loop/goto.rb +32 -0
  44. data/examples/loop/named.rb +33 -0
  45. data/examples/signature/signature.rb +65 -0
  46. data/examples/uri/javascript.rb +56 -0
  47. data/examples/uri/open-uri.rb +21 -0
  48. data/examples/uri/submitform.rb +47 -0
  49. data/lib/origami.rb +29 -42
  50. data/lib/origami/3d.rb +350 -225
  51. data/lib/origami/acroform.rb +262 -288
  52. data/lib/origami/actions.rb +268 -288
  53. data/lib/origami/annotations.rb +697 -722
  54. data/lib/origami/array.rb +258 -184
  55. data/lib/origami/boolean.rb +74 -84
  56. data/lib/origami/catalog.rb +397 -434
  57. data/lib/origami/collections.rb +144 -0
  58. data/lib/origami/destinations.rb +233 -194
  59. data/lib/origami/dictionary.rb +253 -232
  60. data/lib/origami/encryption.rb +1274 -1243
  61. data/lib/origami/export.rb +232 -268
  62. data/lib/origami/extensions/fdf.rb +307 -220
  63. data/lib/origami/extensions/ppklite.rb +368 -435
  64. data/lib/origami/filespec.rb +197 -0
  65. data/lib/origami/filters.rb +301 -295
  66. data/lib/origami/filters/ascii.rb +177 -180
  67. data/lib/origami/filters/ccitt.rb +528 -535
  68. data/lib/origami/filters/crypt.rb +26 -35
  69. data/lib/origami/filters/dct.rb +46 -52
  70. data/lib/origami/filters/flate.rb +95 -94
  71. data/lib/origami/filters/jbig2.rb +49 -55
  72. data/lib/origami/filters/jpx.rb +38 -44
  73. data/lib/origami/filters/lzw.rb +189 -183
  74. data/lib/origami/filters/predictors.rb +221 -235
  75. data/lib/origami/filters/runlength.rb +103 -104
  76. data/lib/origami/font.rb +173 -186
  77. data/lib/origami/functions.rb +67 -81
  78. data/lib/origami/graphics.rb +25 -21
  79. data/lib/origami/graphics/colors.rb +178 -187
  80. data/lib/origami/graphics/instruction.rb +79 -85
  81. data/lib/origami/graphics/path.rb +142 -148
  82. data/lib/origami/graphics/patterns.rb +160 -167
  83. data/lib/origami/graphics/render.rb +43 -50
  84. data/lib/origami/graphics/state.rb +138 -153
  85. data/lib/origami/graphics/text.rb +188 -205
  86. data/lib/origami/graphics/xobject.rb +819 -815
  87. data/lib/origami/header.rb +63 -78
  88. data/lib/origami/javascript.rb +596 -597
  89. data/lib/origami/linearization.rb +285 -290
  90. data/lib/origami/metadata.rb +139 -148
  91. data/lib/origami/name.rb +112 -148
  92. data/lib/origami/null.rb +53 -62
  93. data/lib/origami/numeric.rb +162 -175
  94. data/lib/origami/obfuscation.rb +186 -174
  95. data/lib/origami/object.rb +593 -573
  96. data/lib/origami/outline.rb +42 -47
  97. data/lib/origami/outputintents.rb +73 -82
  98. data/lib/origami/page.rb +703 -592
  99. data/lib/origami/parser.rb +238 -290
  100. data/lib/origami/parsers/fdf.rb +41 -33
  101. data/lib/origami/parsers/pdf.rb +75 -95
  102. data/lib/origami/parsers/pdf/lazy.rb +137 -0
  103. data/lib/origami/parsers/pdf/linear.rb +64 -66
  104. data/lib/origami/parsers/ppklite.rb +34 -70
  105. data/lib/origami/pdf.rb +1030 -1005
  106. data/lib/origami/reference.rb +102 -102
  107. data/lib/origami/signature.rb +591 -609
  108. data/lib/origami/stream.rb +668 -551
  109. data/lib/origami/string.rb +397 -373
  110. data/lib/origami/template/patterns.rb +56 -0
  111. data/lib/origami/template/widgets.rb +151 -0
  112. data/lib/origami/trailer.rb +144 -158
  113. data/lib/origami/tree.rb +62 -0
  114. data/lib/origami/version.rb +23 -0
  115. data/lib/origami/webcapture.rb +88 -79
  116. data/lib/origami/xfa.rb +2863 -2882
  117. data/lib/origami/xreftable.rb +472 -384
  118. data/test/dataset/calc.pdf +85 -0
  119. data/test/dataset/crypto.pdf +82 -0
  120. data/test/dataset/empty.pdf +49 -0
  121. data/test/test_actions.rb +27 -0
  122. data/test/test_annotations.rb +90 -0
  123. data/test/test_pages.rb +31 -0
  124. data/test/test_pdf.rb +16 -0
  125. data/test/test_pdf_attachment.rb +34 -0
  126. data/test/test_pdf_create.rb +24 -0
  127. data/test/test_pdf_encrypt.rb +95 -0
  128. data/test/test_pdf_parse.rb +96 -0
  129. data/test/test_pdf_sign.rb +58 -0
  130. data/test/test_streams.rb +182 -0
  131. data/test/test_xrefs.rb +67 -0
  132. metadata +88 -58
  133. data/README +0 -67
  134. data/bin/pdf2graph +0 -121
  135. data/bin/pdfcocoon +0 -104
  136. data/lib/origami/file.rb +0 -233
  137. data/samples/README.txt +0 -45
  138. data/samples/actions/launch/calc.rb +0 -87
  139. data/samples/actions/launch/winparams.rb +0 -22
  140. data/samples/actions/loop/loopgoto.rb +0 -24
  141. data/samples/actions/loop/loopnamed.rb +0 -21
  142. data/samples/actions/named/named.rb +0 -31
  143. data/samples/actions/samba/smbrelay.rb +0 -26
  144. data/samples/actions/webbug/submitform.js +0 -26
  145. data/samples/actions/webbug/webbug-browser.rb +0 -68
  146. data/samples/actions/webbug/webbug-js.rb +0 -67
  147. data/samples/actions/webbug/webbug-reader.rb +0 -90
  148. data/samples/attachments/attach.rb +0 -40
  149. data/samples/attachments/attached.txt +0 -1
  150. data/samples/crypto/crypto.rb +0 -28
  151. data/samples/digsig/signed.rb +0 -46
  152. data/samples/exploits/cve-2008-2992-utilprintf.rb +0 -87
  153. data/samples/exploits/cve-2009-0927-geticon.rb +0 -65
  154. data/samples/exploits/exploit_customdictopen.rb +0 -55
  155. data/samples/exploits/getannots.rb +0 -69
  156. data/samples/flash/flash.rb +0 -31
  157. data/samples/javascript/attached.txt +0 -1
  158. data/samples/javascript/js.rb +0 -52
  159. data/templates/patterns.rb +0 -66
  160. data/templates/widgets.rb +0 -173
  161. data/templates/xdp.rb +0 -92
  162. data/test/ts_pdf.rb +0 -50
@@ -1,118 +1,117 @@
1
1
  =begin
2
2
 
3
- = File
4
- filters/runlength.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
 
26
21
  module Origami
27
-
28
- module Filter
29
-
30
- class InvalidRunLengthDataError < InvalidFilterDataError #:nodoc:
31
- end
32
-
33
- #
34
- # Class representing a Filter used to encode and decode data using RLE compression algorithm.
35
- #
36
- class RunLength
37
- include Filter
38
-
39
- EOD = 128 #:nodoc:
40
-
41
- #
42
- # Encodes data using RLE compression method.
43
- # _stream_:: The data to encode.
44
- #
45
- def encode(stream)
46
-
47
- result = ""
48
- i = 0
49
-
50
- while i < stream.size
51
-
52
- #
53
- # How many identical bytes coming?
54
- #
55
- length = 1
56
- while i+1 < stream.size and length < EOD and stream[i] == stream[i+1]
57
- length = length + 1
58
- i = i + 1
59
- end
60
-
61
- #
62
- # If more than 1, then compress them.
63
- #
64
- if length > 1
65
- result << (257 - length).chr << stream[i,1]
66
-
67
- #
68
- # Otherwise how many different bytes to copy ?
69
- #
70
- else
71
- j = i
72
- while j+1 < stream.size and (j - i + 1) < EOD and stream[j] != stream[j+1]
73
- j = j + 1
74
- end
75
22
 
76
- length = j - i
77
- result << length.chr << stream[i, length+1]
23
+ module Filter
78
24
 
79
- i = j
80
- end
81
-
82
- i = i + 1
25
+ class InvalidRunLengthDataError < DecodeError #:nodoc:
83
26
  end
84
27
 
85
- result << EOD.chr
86
- end
87
-
88
-
89
- #
90
- # Decodes data using RLE decompression method.
91
- # _stream_:: The data to decode.
92
- #
93
- def decode(stream)
94
- raise InvalidRunLengthDataError, "No end marker" unless stream.include?(EOD.chr)
95
-
96
- i = 0
97
- result = ""
98
- until stream[i].ord == EOD do
99
-
100
- length = stream[i].ord
101
- if length < EOD
102
- result << stream[i + 1, length + 1]
103
- i = i + length + 2
104
- else
105
- result << stream[i + 1,1] * (257 - length)
106
- i = i + 2
107
- end
108
-
28
+ #
29
+ # Class representing a Filter used to encode and decode data using RLE compression algorithm.
30
+ #
31
+ class RunLength
32
+ include Filter
33
+
34
+ EOD = 128 #:nodoc:
35
+
36
+ #
37
+ # Encodes data using RLE compression method.
38
+ # _stream_:: The data to encode.
39
+ #
40
+ def encode(stream)
41
+ result = "".b
42
+ i = 0
43
+
44
+ while i < stream.size
45
+ #
46
+ # How many identical bytes coming?
47
+ #
48
+ length = 1
49
+ while i+1 < stream.size and length < EOD and stream[i] == stream[i+1]
50
+ length = length + 1
51
+ i = i + 1
52
+ end
53
+
54
+ #
55
+ # If more than 1, then compress them.
56
+ #
57
+ if length > 1
58
+ result << (257 - length).chr << stream[i]
59
+ #
60
+ # Otherwise how many different bytes to copy?
61
+ #
62
+ else
63
+ j = i
64
+ while j+1 < stream.size and (j - i + 1) < EOD and stream[j] != stream[j+1]
65
+ j = j + 1
66
+ end
67
+
68
+ length = j - i
69
+ result << length.chr << stream[i, length+1]
70
+
71
+ i = j
72
+ end
73
+
74
+ i = i + 1
75
+ end
76
+
77
+ result << EOD.chr
78
+ end
79
+
80
+ #
81
+ # Decodes data using RLE decompression method.
82
+ # _stream_:: The data to decode.
83
+ #
84
+ def decode(stream)
85
+ result = "".b
86
+ return result if stream.empty?
87
+
88
+ i = 0
89
+ until i >= stream.length or stream[i].ord == EOD do
90
+
91
+ # At least two bytes are required.
92
+ if i > stream.length - 2
93
+ raise InvalidRunLengthDataError.new("Truncated run-length data", input_data: stream, decoded_data: result)
94
+ end
95
+
96
+ length = stream[i].ord
97
+ if length < EOD
98
+ result << stream[i + 1, length + 1]
99
+ i = i + length + 2
100
+ else
101
+ result << stream[i + 1] * (257 - length)
102
+ i = i + 2
103
+ end
104
+ end
105
+
106
+ # Check if offset is beyond the end of data.
107
+ if i >= stream.length
108
+ raise InvalidRunLengthDataError.new("Truncated run-length data", input_data: stream, decoded_data: result)
109
+ end
110
+
111
+ result
112
+ end
109
113
  end
110
-
111
- result
112
- end
114
+ RL = RunLength
113
115
 
114
116
  end
115
- RL = RunLength
116
- end
117
117
  end
118
-
@@ -1,209 +1,196 @@
1
1
  =begin
2
2
 
3
- = File
4
- font.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
 
26
21
  module Origami
27
22
 
28
- #
29
- # Embedded font stream.
30
- #
31
- class FontStream < Stream
32
-
33
- field :Subtype, :Type => Name
34
- field :Length1, :Type => Integer
35
- field :Length2, :Type => Integer
36
- field :Length3, :Type => Integer
37
-
38
- end
39
-
40
- #
41
- # Class representing a font details in a document.
42
- #
43
- class FontDescriptor < Dictionary
44
-
45
- include StandardObject
46
-
47
- FIXEDPITCH = 1 << 1
48
- SERIF = 1 << 2
49
- SYMBOLIC = 1 << 3
50
- SCRIPT = 1 << 4
51
- NONSYMBOLIC = 1 << 6
52
- ITALIC = 1 << 7
53
- ALLCAP = 1 << 17
54
- SMALLCAP = 1 << 18
55
- FORCEBOLD = 1 << 19
56
-
57
- field :Type, :Type => Name, :Default => :FontDescriptor, :Required => true
58
- field :FontName, :Type => Name, :Required => true
59
- field :FontFamily, :Type => ByteString, :Version => "1.5"
60
- field :FontStretch, :Type => Name, :Default => :Normal, :Version => "1.5"
61
- field :FontWeight, :Type => Integer, :Default => 400, :Version => "1.5"
62
- field :Flags, :Type => Integer, :Required => true
63
- field :FontBBox, :Type => Array
64
- field :ItalicAngle, :Type => Number, :Required => true
65
- field :Ascent, :Type => Number
66
- field :Descent, :Type => Number
67
- field :Leading, :Type => Number, :Default => 0
68
- field :CapHeight, :Type => Number
69
- field :XHeight, :Type => Number, :Default => 0
70
- field :StemV, :Type => Number
71
- field :StemH, :Type => Number, :Default => 0
72
- field :AvgWidth, :Type => Number, :Default => 0
73
- field :MaxWidth, :Type => Number, :Default => 0
74
- field :MissingWidth, :Type => Number, :Default => 0
75
- field :FontFile, :Type => FontStream
76
- field :FontFile2, :Type => FontStream, :Version => "1.1"
77
- field :FontFile3, :Type => FontStream, :Version => "1.2"
78
- field :CharSet, :Type => ByteString, :Version => "1.1"
79
-
80
- end
81
-
82
- #
83
- # Class representing a character encoding in a document.
84
- #
85
- class Encoding < Dictionary
86
-
87
- include StandardObject
88
-
89
- field :Type, :Type => Name, :Default => :Encoding
90
- field :BaseEncoding, :Type => Name
91
- field :Differences, :Type => Array
92
-
93
- end
94
-
95
- #
96
- # Class representing a rendering font in a document.
97
- #
98
- class Font < Dictionary
99
-
100
- include StandardObject
101
-
102
- field :Type, :Type => Name, :Default => :Font, :Required => true
103
- field :Subtype, :Type => Name, :Required => true
104
- field :Name, :Type => Name
105
- field :FirstChar, :Type => Integer
106
- field :LastChar, :Type => Integer
107
- field :Widths, :Type => Array
108
- field :FontDescriptor, :Type => FontDescriptor
109
- field :Encoding, :Type => [ Name, Encoding ], :Default => :MacRomanEncoding
110
- field :ToUnicode, :Type => Stream, :Version => "1.2"
111
-
112
- # TODO: Type0 and CID Fonts
113
-
114
23
  #
115
- # Type1 Fonts.
24
+ # Embedded font stream.
116
25
  #
117
- class Type1 < Font
118
-
119
- field :BaseFont, :Type => Name, :Required => true
120
- field :Subtype, :Type => Name, :Default => :Type1, :Required => true
121
-
122
- #
123
- # 14 standard Type1 fonts.
124
- #
125
- module Standard
126
-
127
- class TimesRoman < Type1
128
- field :BaseFont, :Type => Name, :Default => :"Times-Roman", :Required => true
129
- end
130
-
131
- class Helvetica < Type1
132
- field :BaseFont, :Type => Name, :Default => :Helvetica, :Required => true
133
- end
134
-
135
- class Courier < Type1
136
- field :BaseFont, :Type => Name, :Default => :Courier, :Required => true
137
- end
138
-
139
- class Symbol < Type1
140
- field :BaseFont, :Type => Name, :Default => :Symbol, :Required => true
141
- end
142
-
143
- class TimesBold < Type1
144
- field :BaseFont, :Type => Name, :Default => :"Times-Bold", :Required => true
145
- end
146
-
147
- class HelveticaBold < Type1
148
- field :BaseFont, :Type => Name, :Default => :"Helvetica-Bold", :Required => true
149
- end
150
-
151
- class CourierBold < Type1
152
- field :BaseFont, :Type => Name, :Default => :"Courier-Bold", :Required => true
153
- end
154
-
155
- class ZapfDingbats < Type1
156
- field :BaseFont, :Type => Name, :Default => :ZapfDingbats, :Required => true
157
- end
158
-
159
- class TimesItalic < Type1
160
- field :BaseFont, :Type => Name, :Default => :"Times-Italic", :Required => true
161
- end
162
-
163
- class HelveticaOblique < Type1
164
- field :BaseFont, :Type => Name, :Default => :"Helvetica-Oblique", :Required => true
165
- end
166
-
167
- class CourierOblique < Type1
168
- field :BaseFont, :Type => Name, :Default => :"Courier-Oblique", :Required => true
169
- end
170
-
171
- class TimesBoldItalic < Type1
172
- field :BaseFont, :Type => Name, :Default => :"Times-BoldItalic", :Required => true
173
- end
174
-
175
- class HelveticaBoldOblique < Type1
176
- field :BaseFont, :Type => Name, :Default => :"Helvetica-BoldOblique", :Required => true
177
- end
178
-
179
- class CourierBoldOblique < Type1
180
- field :BaseFont, :Type => Name, :Default => :"Courier-BoldOblique", :Required => true
181
- end
182
-
183
- end
26
+ class FontStream < Stream
27
+ field :Subtype, :Type => Name
28
+ field :Length1, :Type => Integer
29
+ field :Length2, :Type => Integer
30
+ field :Length3, :Type => Integer
31
+ field :Metadata, :Type => MetadataStream
32
+ end
184
33
 
34
+ #
35
+ # Class representing a font details in a document.
36
+ #
37
+ class FontDescriptor < Dictionary
38
+ include StandardObject
39
+
40
+ FIXEDPITCH = 1 << 1
41
+ SERIF = 1 << 2
42
+ SYMBOLIC = 1 << 3
43
+ SCRIPT = 1 << 4
44
+ NONSYMBOLIC = 1 << 6
45
+ ITALIC = 1 << 7
46
+ ALLCAP = 1 << 17
47
+ SMALLCAP = 1 << 18
48
+ FORCEBOLD = 1 << 19
49
+
50
+ field :Type, :Type => Name, :Default => :FontDescriptor, :Required => true
51
+ field :FontName, :Type => Name, :Required => true
52
+ field :FontFamily, :Type => String, :Version => "1.5"
53
+ field :FontStretch, :Type => Name, :Default => :Normal, :Version => "1.5"
54
+ field :FontWeight, :Type => Integer, :Default => 400, :Version => "1.5"
55
+ field :Flags, :Type => Integer, :Required => true
56
+ field :FontBBox, :Type => Rectangle
57
+ field :ItalicAngle, :Type => Number, :Required => true
58
+ field :Ascent, :Type => Number
59
+ field :Descent, :Type => Number
60
+ field :Leading, :Type => Number, :Default => 0
61
+ field :CapHeight, :Type => Number
62
+ field :XHeight, :Type => Number, :Default => 0
63
+ field :StemV, :Type => Number
64
+ field :StemH, :Type => Number, :Default => 0
65
+ field :AvgWidth, :Type => Number, :Default => 0
66
+ field :MaxWidth, :Type => Number, :Default => 0
67
+ field :MissingWidth, :Type => Number, :Default => 0
68
+ field :FontFile, :Type => FontStream
69
+ field :FontFile2, :Type => FontStream, :Version => "1.1"
70
+ field :FontFile3, :Type => FontStream, :Version => "1.2"
71
+ field :CharSet, :Type => String, :Version => "1.1"
185
72
  end
186
73
 
187
74
  #
188
- # TrueType Fonts
75
+ # Class representing a character encoding in a document.
189
76
  #
190
- class TrueType < Font
191
- field :Subtype, :Type => Name, :Default => :TrueType, :Required => true
77
+ class Encoding < Dictionary
78
+ include StandardObject
79
+
80
+ field :Type, :Type => Name, :Default => :Encoding
81
+ field :BaseEncoding, :Type => Name
82
+ field :Differences, :Type => Array
192
83
  end
193
84
 
194
85
  #
195
- # Type 3 Fonts
86
+ # Class representing a rendering font in a document.
196
87
  #
197
- class Type3 < Font
88
+ class Font < Dictionary
89
+ include StandardObject
90
+
91
+ field :Type, :Type => Name, :Default => :Font, :Required => true
92
+ field :Subtype, :Type => Name, :Required => true
93
+ field :Name, :Type => Name
94
+ field :FirstChar, :Type => Integer
95
+ field :LastChar, :Type => Integer
96
+ field :Widths, :Type => Array.of(Number)
97
+ field :FontDescriptor, :Type => FontDescriptor
98
+ field :Encoding, :Type => [ Name, Encoding ], :Default => :MacRomanEncoding
99
+ field :ToUnicode, :Type => Stream, :Version => "1.2"
100
+
101
+ # TODO: Type0 and CID Fonts
102
+
103
+ #
104
+ # Type1 Fonts.
105
+ #
106
+ class Type1 < Font
107
+
108
+ field :BaseFont, :Type => Name, :Required => true
109
+ field :Subtype, :Type => Name, :Default => :Type1, :Required => true
110
+
111
+ #
112
+ # 14 standard Type1 fonts.
113
+ #
114
+ module Standard
115
+
116
+ class TimesRoman < Type1
117
+ field :BaseFont, :Type => Name, :Default => :"Times-Roman", :Required => true
118
+ end
119
+
120
+ class Helvetica < Type1
121
+ field :BaseFont, :Type => Name, :Default => :Helvetica, :Required => true
122
+ end
123
+
124
+ class Courier < Type1
125
+ field :BaseFont, :Type => Name, :Default => :Courier, :Required => true
126
+ end
127
+
128
+ class Symbol < Type1
129
+ field :BaseFont, :Type => Name, :Default => :Symbol, :Required => true
130
+ end
131
+
132
+ class TimesBold < Type1
133
+ field :BaseFont, :Type => Name, :Default => :"Times-Bold", :Required => true
134
+ end
135
+
136
+ class HelveticaBold < Type1
137
+ field :BaseFont, :Type => Name, :Default => :"Helvetica-Bold", :Required => true
138
+ end
139
+
140
+ class CourierBold < Type1
141
+ field :BaseFont, :Type => Name, :Default => :"Courier-Bold", :Required => true
142
+ end
143
+
144
+ class ZapfDingbats < Type1
145
+ field :BaseFont, :Type => Name, :Default => :ZapfDingbats, :Required => true
146
+ end
147
+
148
+ class TimesItalic < Type1
149
+ field :BaseFont, :Type => Name, :Default => :"Times-Italic", :Required => true
150
+ end
151
+
152
+ class HelveticaOblique < Type1
153
+ field :BaseFont, :Type => Name, :Default => :"Helvetica-Oblique", :Required => true
154
+ end
155
+
156
+ class CourierOblique < Type1
157
+ field :BaseFont, :Type => Name, :Default => :"Courier-Oblique", :Required => true
158
+ end
159
+
160
+ class TimesBoldItalic < Type1
161
+ field :BaseFont, :Type => Name, :Default => :"Times-BoldItalic", :Required => true
162
+ end
163
+
164
+ class HelveticaBoldOblique < Type1
165
+ field :BaseFont, :Type => Name, :Default => :"Helvetica-BoldOblique", :Required => true
166
+ end
167
+
168
+ class CourierBoldOblique < Type1
169
+ field :BaseFont, :Type => Name, :Default => :"Courier-BoldOblique", :Required => true
170
+ end
171
+ end
172
+ end
198
173
 
199
- field :Subtype, :Type => Name, :Default => :Type3, :Required => true
200
- field :FontBBox, :Type => Array, :Required => true
201
- field :FontMatrix, :Type => Array, :Required => true
202
- field :CharProcs, :Type => Dictionary, :Required => true
203
- field :Resources, :Type => Dictionary, :Version => "1.2"
174
+ #
175
+ # TrueType Fonts
176
+ #
177
+ class TrueType < Font
178
+ field :Subtype, :Type => Name, :Default => :TrueType, :Required => true
179
+ field :BaseFont, :Type => Name, :Required => true
180
+ end
204
181
 
182
+ #
183
+ # Type 3 Fonts
184
+ #
185
+ class Type3 < Font
186
+ include ResourcesHolder
187
+
188
+ field :Subtype, :Type => Name, :Default => :Type3, :Required => true
189
+ field :FontBBox, :Type => Rectangle, :Required => true
190
+ field :FontMatrix, :Type => Array.of(Number, length: 6), :Required => true
191
+ field :CharProcs, :Type => Dictionary, :Required => true
192
+ field :Resources, :Type => Resources, :Version => "1.2"
193
+ end
205
194
  end
206
195
 
207
- end
208
-
209
196
  end