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