origami 1.2.5 → 1.2.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/gui/config.rb +0 -4
- data/bin/gui/imgview.rb +2 -2
- data/bin/gui/menu.rb +11 -3
- data/bin/gui/treeview.rb +9 -3
- data/bin/pdfexplode +220 -0
- data/bin/pdfextract +3 -0
- data/lib/origami/acroform.rb +2 -2
- data/lib/origami/actions.rb +62 -35
- data/lib/origami/annotations.rb +3 -2
- data/lib/origami/array.rb +27 -4
- data/lib/origami/boolean.rb +2 -2
- data/lib/origami/catalog.rb +45 -45
- data/lib/origami/dictionary.rb +87 -14
- data/lib/origami/encryption.rb +46 -24
- data/lib/origami/file.rb +1 -2
- data/lib/origami/filters/ccitt.rb +118 -66
- data/lib/origami/filters/flate.rb +5 -1
- data/lib/origami/filters.rb +84 -2
- data/lib/origami/font.rb +71 -71
- data/lib/origami/graphics/patterns.rb +2 -1
- data/lib/origami/graphics/xobject.rb +123 -1
- data/lib/origami/javascript.rb +2 -1
- data/lib/origami/name.rb +2 -2
- data/lib/origami/null.rb +2 -2
- data/lib/origami/numeric.rb +11 -3
- data/lib/origami/object.rb +37 -16
- data/lib/origami/page.rb +135 -71
- data/lib/origami/parser.rb +11 -4
- data/lib/origami/parsers/pdf/linear.rb +1 -0
- data/lib/origami/parsers/pdf.rb +10 -0
- data/lib/origami/pdf.rb +10 -70
- data/lib/origami/reference.rb +4 -5
- data/lib/origami/signature.rb +22 -8
- data/lib/origami/stream.rb +41 -20
- data/lib/origami/string.rb +15 -6
- data/lib/origami/trailer.rb +9 -5
- data/lib/origami.rb +19 -0
- data/samples/actions/loop/loopgoto.rb +1 -1
- data/samples/actions/loop/loopnamed.rb +2 -2
- data/samples/actions/named/named.rb +1 -1
- data/samples/actions/samba/smbrelay.rb +1 -1
- data/samples/actions/triggerevents/trigger.rb +13 -13
- data/samples/actions/webbug/webbug-browser.rb +1 -1
- data/samples/actions/webbug/webbug-js.rb +1 -1
- data/samples/actions/webbug/webbug-reader.rb +1 -1
- data/samples/attachments/attach.rb +2 -2
- data/samples/exploits/cve-2008-2992-utilprintf.rb +1 -1
- data/samples/exploits/cve-2009-0927-geticon.rb +1 -1
- data/samples/exploits/exploit_customdictopen.rb +2 -2
- data/samples/exploits/getannots.rb +1 -1
- data/samples/javascript/js.rb +2 -2
- data/test/ts_pdf.rb +23 -23
- metadata +71 -86
@@ -300,13 +300,14 @@ module Origami
|
|
300
300
|
# Encodes data using CCITT-facsimile compression method.
|
301
301
|
#
|
302
302
|
def encode(stream)
|
303
|
-
|
304
|
-
|
303
|
+
mode = @params.has_key?(:K) ? @params.K.value : 0
|
304
|
+
|
305
|
+
unless mode.is_a?(::Integer) and mode <= 0
|
305
306
|
raise NotImplementedError, "CCITT encoding scheme not supported"
|
306
307
|
end
|
307
308
|
|
308
309
|
columns = @params.has_key?(:Columns) ? @params.Columns.value : (stream.size << 3)
|
309
|
-
unless columns.is_a?(::Integer) and columns > 0 and columns % 8 == 0
|
310
|
+
unless columns.is_a?(::Integer) and columns > 0 #and columns % 8 == 0
|
310
311
|
raise CCITTFaxFilterError, "Invalid value for parameter `Columns'"
|
311
312
|
end
|
312
313
|
|
@@ -314,42 +315,24 @@ module Origami
|
|
314
315
|
raise CCITTFaxFilterError, "Data size is not a multiple of image width"
|
315
316
|
end
|
316
317
|
|
317
|
-
|
318
|
-
|
318
|
+
colors = (@params.BlackIs1 == true) ? [0,1] : [1,0]
|
319
|
+
white, _black = colors
|
319
320
|
bitr = Utils::BitReader.new(stream)
|
320
321
|
bitw = Utils::BitWriter.new
|
321
322
|
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
# Process each bit in line.
|
329
|
-
begin
|
330
|
-
if bitr.read(1) == current_color
|
331
|
-
scan_len += 1
|
332
|
-
else
|
333
|
-
if current_color == white
|
334
|
-
put_white_bits(bitw, scan_len)
|
335
|
-
else
|
336
|
-
put_black_bits(bitw, scan_len)
|
337
|
-
end
|
338
|
-
|
339
|
-
current_color ^= 1
|
340
|
-
scan_len = 1
|
341
|
-
end
|
342
|
-
end while bitr.pos % columns != 0
|
343
|
-
|
344
|
-
if current_color == white
|
345
|
-
put_white_bits(bitw, scan_len)
|
346
|
-
else
|
347
|
-
put_black_bits(bitw, scan_len)
|
348
|
-
end
|
323
|
+
# Group 4 requires an imaginary white line
|
324
|
+
if mode < 0
|
325
|
+
prev_line = Utils::BitWriter.new
|
326
|
+
write_bit_range(prev_line, white, columns)
|
327
|
+
prev_line = Utils::BitReader.new(prev_line.final.to_s)
|
328
|
+
end
|
349
329
|
|
350
|
-
|
351
|
-
|
352
|
-
|
330
|
+
until bitr.eod?
|
331
|
+
case
|
332
|
+
when mode == 0
|
333
|
+
encode_one_dimensional_line(bitr, bitw, columns, colors)
|
334
|
+
when mode < 0
|
335
|
+
encode_two_dimensional_line(bitr, bitw, columns, colors, prev_line)
|
353
336
|
end
|
354
337
|
end
|
355
338
|
|
@@ -363,21 +346,27 @@ module Origami
|
|
363
346
|
# Decodes data using CCITT-facsimile compression method.
|
364
347
|
#
|
365
348
|
def decode(stream)
|
366
|
-
|
349
|
+
mode = @params.has_key?(:K) ? @params.K.value : 0
|
350
|
+
|
351
|
+
unless mode.is_a?(::Integer) and mode <= 0
|
367
352
|
raise NotImplementedError, "CCITT encoding scheme not supported"
|
368
353
|
end
|
369
354
|
|
370
355
|
columns = @params.has_key?(:Columns) ? @params.Columns.value : 1728
|
371
|
-
unless columns.is_a?(::Integer) and columns > 0 and columns % 8 == 0
|
356
|
+
unless columns.is_a?(::Integer) and columns > 0 #and columns % 8 == 0
|
372
357
|
raise CCITTFaxFilterError, "Invalid value for parameter `Columns'"
|
373
358
|
end
|
374
359
|
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
360
|
+
colors = (@params.BlackIs1 == true) ? [0,1] : [1,0]
|
361
|
+
white, _black = colors
|
362
|
+
params =
|
363
|
+
{
|
364
|
+
:is_aligned? => (@params.EncodedByteAlign == true),
|
365
|
+
:has_eob? => (@params.EndOfBlock.nil? or @params.EndOfBlock == true),
|
366
|
+
:has_eol? => (@params.EndOfLine == true)
|
367
|
+
}
|
379
368
|
|
380
|
-
unless has_eob
|
369
|
+
unless params[:has_eob?]
|
381
370
|
unless @params.has_key?(:Rows) and @params.Rows.is_a?(::Integer) and @params.Rows.value > 0
|
382
371
|
raise CCITTFaxFilterError, "Invalid value for parameter `Rows'"
|
383
372
|
end
|
@@ -388,16 +377,21 @@ module Origami
|
|
388
377
|
bitr = Utils::BitReader.new(stream)
|
389
378
|
bitw = Utils::BitWriter.new
|
390
379
|
|
380
|
+
# Group 4 requires an imaginary white line
|
381
|
+
if mode < 0
|
382
|
+
prev_line = Utils::BitWriter.new
|
383
|
+
write_bit_range(prev_line, white, columns)
|
384
|
+
prev_line = Utils::BitReader.new(prev_line.final.to_s)
|
385
|
+
end
|
386
|
+
|
391
387
|
until bitr.eod? or rows == 0
|
392
|
-
current_color = white
|
393
|
-
|
394
388
|
# realign the read line on a 8-bit boundary if required
|
395
|
-
if
|
389
|
+
if params[:is_aligned?] and bitr.pos % 8 != 0
|
396
390
|
bitr.pos += 8 - (bitr.pos % 8)
|
397
391
|
end
|
398
392
|
|
399
393
|
# received return-to-control code
|
400
|
-
if has_eob and bitr.peek(RTC[1]) == RTC[0]
|
394
|
+
if params[:has_eob?] and bitr.peek(RTC[1]) == RTC[0]
|
401
395
|
bitr.pos += RTC[1]
|
402
396
|
break
|
403
397
|
end
|
@@ -407,41 +401,99 @@ module Origami
|
|
407
401
|
raise InvalidCCITTFaxDataError.new(
|
408
402
|
"No end-of-line pattern found (at bit pos #{bitr.pos}/#{bitr.size}})",
|
409
403
|
bitw.final.to_s
|
410
|
-
)if has_eol
|
404
|
+
) if params[:has_eol?]
|
411
405
|
else
|
412
406
|
bitr.pos += EOL[1]
|
413
407
|
end
|
414
408
|
|
415
|
-
|
416
|
-
|
409
|
+
case
|
410
|
+
when mode == 0
|
411
|
+
decode_one_dimensional_line(bitr, bitw, columns, colors)
|
412
|
+
when mode < 0
|
413
|
+
decode_two_dimensional_line(bitr, bitw, columns, colors, prev_line)
|
414
|
+
end
|
415
|
+
|
416
|
+
|
417
|
+
rows -= 1 unless params[:has_eob?]
|
418
|
+
end
|
419
|
+
|
420
|
+
bitw.final.to_s
|
421
|
+
end
|
422
|
+
|
423
|
+
private
|
424
|
+
|
425
|
+
def encode_one_dimensional_line(input, output, columns, colors) #:nodoc:
|
426
|
+
output.write(*EOL)
|
427
|
+
scan_len = 0
|
428
|
+
white, black = colors
|
429
|
+
current_color = white
|
430
|
+
|
431
|
+
# Process each bit in line.
|
432
|
+
begin
|
433
|
+
if input.read(1) == current_color
|
434
|
+
scan_len += 1
|
435
|
+
else
|
417
436
|
if current_color == white
|
418
|
-
|
437
|
+
put_white_bits(output, scan_len)
|
419
438
|
else
|
420
|
-
|
439
|
+
put_black_bits(output, scan_len)
|
421
440
|
end
|
422
441
|
|
423
|
-
raise InvalidCCITTFaxDataError.new(
|
424
|
-
"Unfinished line (at bit pos #{bitr.pos}/#{bitr.size}})",
|
425
|
-
bitw.final.to_s
|
426
|
-
) if bit_length.nil?
|
427
|
-
|
428
|
-
line_length += bit_length
|
429
|
-
raise InvalidCCITTFaxDataError.new(
|
430
|
-
"Line is too long (at bit pos #{bitr.pos}/#{bitr.size}})",
|
431
|
-
bitw.final.to_s
|
432
|
-
) if line_length > columns
|
433
|
-
|
434
|
-
write_bit_range(bitw, current_color, bit_length)
|
435
442
|
current_color ^= 1
|
443
|
+
scan_len = 1
|
436
444
|
end
|
445
|
+
end while input.pos % columns != 0
|
437
446
|
|
438
|
-
|
447
|
+
if current_color == white
|
448
|
+
put_white_bits(output, scan_len)
|
449
|
+
else
|
450
|
+
put_black_bits(output, scan_len)
|
439
451
|
end
|
440
452
|
|
441
|
-
|
453
|
+
# Align encoded lign on a 8-bit boundary.
|
454
|
+
if @params.EncodedByteAlign == true and output.pos % 8 != 0
|
455
|
+
output.write(0, 8 - (output.pos % 8))
|
456
|
+
end
|
442
457
|
end
|
443
458
|
|
444
|
-
|
459
|
+
def encode_two_dimensional_line(input, output, columns, colors, prev_line) #:nodoc:
|
460
|
+
raise NotImplementedError, "CCITT two-dimensional encoding scheme not supported."
|
461
|
+
|
462
|
+
white, black = colors
|
463
|
+
current_color = white
|
464
|
+
end
|
465
|
+
|
466
|
+
def decode_one_dimensional_line(input, output, columns, colors) #:nodoc:
|
467
|
+
white, black = colors
|
468
|
+
current_color = white
|
469
|
+
|
470
|
+
line_length = 0
|
471
|
+
while line_length < columns
|
472
|
+
if current_color == white
|
473
|
+
bit_length = get_white_bits(input)
|
474
|
+
else
|
475
|
+
bit_length = get_black_bits(input)
|
476
|
+
end
|
477
|
+
|
478
|
+
raise InvalidCCITTFaxDataError.new(
|
479
|
+
"Unfinished line (at bit pos #{input.pos}/#{input.size}})",
|
480
|
+
output.final.to_s
|
481
|
+
) if bit_length.nil?
|
482
|
+
|
483
|
+
line_length += bit_length
|
484
|
+
raise InvalidCCITTFaxDataError.new(
|
485
|
+
"Line is too long (at bit pos #{input.pos}/#{input.size}})",
|
486
|
+
output.final.to_s
|
487
|
+
) if line_length > columns
|
488
|
+
|
489
|
+
write_bit_range(output, current_color, bit_length)
|
490
|
+
current_color ^= 1
|
491
|
+
end
|
492
|
+
end
|
493
|
+
|
494
|
+
def decode_two_dimensional_line(input, output, columns, colors, prev_line) #:nodoc:
|
495
|
+
raise NotImplementedError, "CCITT two-dimensional decoding scheme not supported."
|
496
|
+
end
|
445
497
|
|
446
498
|
def get_white_bits(bitr) #:nodoc:
|
447
499
|
get_color_bits(bitr, WHITE_CONFIGURATION_DECODE_TABLE, WHITE_TERMINAL_DECODE_TABLE)
|
@@ -83,7 +83,11 @@ module Origami
|
|
83
83
|
begin
|
84
84
|
uncompressed = zlib_stream.inflate(stream)
|
85
85
|
rescue Zlib::DataError => zlib_except
|
86
|
-
|
86
|
+
uncompressed = zlib_stream.flush_next_out
|
87
|
+
|
88
|
+
unless Origami::OPTIONS[:ignore_zlib_errors]
|
89
|
+
raise InvalidFlateDataError.new(zlib_except.message, uncompressed)
|
90
|
+
end
|
87
91
|
end
|
88
92
|
|
89
93
|
if @params.Predictor.is_a?(Integer)
|
data/lib/origami/filters.rb
CHANGED
@@ -71,7 +71,7 @@ module Origami
|
|
71
71
|
while length > 0
|
72
72
|
if length >= 8 - @ptr_bit
|
73
73
|
length -= 8 - @ptr_bit
|
74
|
-
@last_byte
|
74
|
+
@last_byte ||= 0
|
75
75
|
@last_byte |= (data >> length) & ((1 << (8 - @ptr_bit)) - 1)
|
76
76
|
|
77
77
|
data &= (1 << length) - 1
|
@@ -79,7 +79,7 @@ module Origami
|
|
79
79
|
@last_byte = nil
|
80
80
|
@ptr_bit = 0
|
81
81
|
else
|
82
|
-
@last_byte
|
82
|
+
@last_byte ||= 0
|
83
83
|
@last_byte |= (data & ((1 << length) - 1)) << (8 - @ptr_bit - length)
|
84
84
|
@ptr_bit += length
|
85
85
|
|
@@ -130,6 +130,11 @@ module Origami
|
|
130
130
|
# Internally used by some filters.
|
131
131
|
#
|
132
132
|
class BitReader
|
133
|
+
BRUIJIN_TABLE = ::Array.new(32)
|
134
|
+
BRUIJIN_TABLE.size.times { |i|
|
135
|
+
BRUIJIN_TABLE[((0x77cb531 * (1 << i)) >> 27) & 31] = i
|
136
|
+
}
|
137
|
+
|
133
138
|
def initialize(data)
|
134
139
|
@data = data
|
135
140
|
reset
|
@@ -215,6 +220,83 @@ module Origami
|
|
215
220
|
n
|
216
221
|
end
|
217
222
|
|
223
|
+
#
|
224
|
+
# Used for bit scanning.
|
225
|
+
# Counts leading zeros. Does not advance read pointer.
|
226
|
+
#
|
227
|
+
def clz
|
228
|
+
count = 0
|
229
|
+
if @ptr_bit != 0
|
230
|
+
bits = peek(8 - @ptr_bit)
|
231
|
+
count = clz32(bits << (32 - (8 - @ptr_bit)))
|
232
|
+
|
233
|
+
return count if count < (8 - @ptr_bit)
|
234
|
+
end
|
235
|
+
|
236
|
+
delta = 0
|
237
|
+
while @data.size > @ptr_byte + delta * 4
|
238
|
+
word = @data[@ptr_byte + delta * 4, 4] # next 32 bits
|
239
|
+
z = clz32((word << (4 - word.size)).unpack("N")[0])
|
240
|
+
|
241
|
+
count += z
|
242
|
+
delta += 1
|
243
|
+
|
244
|
+
return count if z < 32 - ((4 - word.size) << 3)
|
245
|
+
end
|
246
|
+
|
247
|
+
count
|
248
|
+
end
|
249
|
+
|
250
|
+
#
|
251
|
+
# Used for bit scanning.
|
252
|
+
# Count leading ones. Does not advance read pointer.
|
253
|
+
#
|
254
|
+
def clo
|
255
|
+
count = 0
|
256
|
+
if @ptr_bit != 0
|
257
|
+
bits = peek(8 - @ptr_bit)
|
258
|
+
count = clz32(~(bits << (32 - (8 - @ptr_bit))) & 0xff)
|
259
|
+
|
260
|
+
return count if count < (8 - @ptr_bit)
|
261
|
+
end
|
262
|
+
|
263
|
+
delta = 0
|
264
|
+
while @data.size > @ptr_byte + delta * 4
|
265
|
+
word = @data[@ptr_byte + delta * 4, 4] # next 32 bits
|
266
|
+
z = clz32(~((word << (4 - word.size)).unpack("N")[0]) & 0xffff_ffff)
|
267
|
+
|
268
|
+
count += z
|
269
|
+
delta += 1
|
270
|
+
|
271
|
+
return count if z < 32 - ((4 - word.size) << 3)
|
272
|
+
end
|
273
|
+
|
274
|
+
count
|
275
|
+
end
|
276
|
+
|
277
|
+
private
|
278
|
+
|
279
|
+
def bitswap8(i) #:nodoc
|
280
|
+
((i * 0x0202020202) & 0x010884422010) % 1023
|
281
|
+
end
|
282
|
+
|
283
|
+
def bitswap32(i) #:nodoc:
|
284
|
+
(bitswap8((i >> 0) & 0xff) << 24) |
|
285
|
+
(bitswap8((i >> 8) & 0xff) << 16) |
|
286
|
+
(bitswap8((i >> 16) & 0xff) << 8) |
|
287
|
+
(bitswap8((i >> 24) & 0xff) << 0)
|
288
|
+
end
|
289
|
+
|
290
|
+
def ctz32(i) #:nodoc:
|
291
|
+
if i == 0 then 32
|
292
|
+
else
|
293
|
+
BRUIJIN_TABLE[(((i & -i) * 0x77cb531) >> 27) & 31]
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
def clz32(i) #:nodoc:
|
298
|
+
ctz32 bitswap32 i
|
299
|
+
end
|
218
300
|
end
|
219
301
|
end
|
220
302
|
|
data/lib/origami/font.rb
CHANGED
@@ -25,6 +25,73 @@
|
|
25
25
|
|
26
26
|
module Origami
|
27
27
|
|
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
|
+
|
28
95
|
#
|
29
96
|
# Class representing a rendering font in a document.
|
30
97
|
#
|
@@ -33,13 +100,13 @@ module Origami
|
|
33
100
|
include StandardObject
|
34
101
|
|
35
102
|
field :Type, :Type => Name, :Default => :Font, :Required => true
|
36
|
-
field :Subtype, :Type => Name, :
|
103
|
+
field :Subtype, :Type => Name, :Required => true
|
37
104
|
field :Name, :Type => Name
|
38
105
|
field :FirstChar, :Type => Integer
|
39
106
|
field :LastChar, :Type => Integer
|
40
107
|
field :Widths, :Type => Array
|
41
|
-
field :FontDescriptor, :Type =>
|
42
|
-
field :Encoding, :Type => [ Name,
|
108
|
+
field :FontDescriptor, :Type => FontDescriptor
|
109
|
+
field :Encoding, :Type => [ Name, Encoding ], :Default => :MacRomanEncoding
|
43
110
|
field :ToUnicode, :Type => Stream, :Version => "1.2"
|
44
111
|
|
45
112
|
# TODO: Type0 and CID Fonts
|
@@ -49,7 +116,7 @@ module Origami
|
|
49
116
|
#
|
50
117
|
class Type1 < Font
|
51
118
|
|
52
|
-
field :BaseFont, :Type => Name, :
|
119
|
+
field :BaseFont, :Type => Name, :Required => true
|
53
120
|
field :Subtype, :Type => Name, :Default => :Type1, :Required => true
|
54
121
|
|
55
122
|
#
|
@@ -139,71 +206,4 @@ module Origami
|
|
139
206
|
|
140
207
|
end
|
141
208
|
|
142
|
-
#
|
143
|
-
# Embedded font stream.
|
144
|
-
#
|
145
|
-
class FontStream < Stream
|
146
|
-
|
147
|
-
field :Subtype, :Type => Name
|
148
|
-
field :Length1, :Type => Integer
|
149
|
-
field :Length2, :Type => Integer
|
150
|
-
field :Length3, :Type => Integer
|
151
|
-
|
152
|
-
end
|
153
|
-
|
154
|
-
#
|
155
|
-
# Class representing a font details in a document.
|
156
|
-
#
|
157
|
-
class FontDescriptor < Dictionary
|
158
|
-
|
159
|
-
include StandardObject
|
160
|
-
|
161
|
-
FIXEDPITCH = 1 << 1
|
162
|
-
SERIF = 1 << 2
|
163
|
-
SYMBOLIC = 1 << 3
|
164
|
-
SCRIPT = 1 << 4
|
165
|
-
NONSYMBOLIC = 1 << 6
|
166
|
-
ITALIC = 1 << 7
|
167
|
-
ALLCAP = 1 << 17
|
168
|
-
SMALLCAP = 1 << 18
|
169
|
-
FORCEBOLD = 1 << 19
|
170
|
-
|
171
|
-
field :Type, :Type => Name, :Default => :FontDescriptor, :Required => true
|
172
|
-
field :FontName, :Type => Name, :Required => true
|
173
|
-
field :FontFamily, :Type => ByteString, :Version => "1.5"
|
174
|
-
field :FontStretch, :Type => Name, :Default => :Normal, :Version => "1.5"
|
175
|
-
field :FontWeight, :Type => Integer, :Default => 400, :Version => "1.5"
|
176
|
-
field :Flags, :Type => Integer, :Required => true
|
177
|
-
field :FontBBox, :Type => Array
|
178
|
-
field :ItalicAngle, :Type => Number, :Required => true
|
179
|
-
field :Ascent, :Type => Number
|
180
|
-
field :Descent, :Type => Number
|
181
|
-
field :Leading, :Type => Number, :Default => 0
|
182
|
-
field :CapHeight, :Type => Number
|
183
|
-
field :XHeight, :Type => Number, :Default => 0
|
184
|
-
field :StemV, :Type => Number
|
185
|
-
field :StemH, :Type => Number, :Default => 0
|
186
|
-
field :AvgWidth, :Type => Number, :Default => 0
|
187
|
-
field :MaxWidth, :Type => Number, :Default => 0
|
188
|
-
field :MissingWidth, :Type => Number, :Default => 0
|
189
|
-
field :FontFile, :Type => Stream
|
190
|
-
field :FontFile2, :Type => Stream, :Version => "1.1"
|
191
|
-
field :FontFile3, :Type => Stream, :Version => "1.2"
|
192
|
-
field :CharSet, :Type => ByteString, :Version => "1.1"
|
193
|
-
|
194
|
-
end
|
195
|
-
|
196
|
-
#
|
197
|
-
# Class representing a character encoding in a document.
|
198
|
-
#
|
199
|
-
class Encoding < Dictionary
|
200
|
-
|
201
|
-
include StandardObject
|
202
|
-
|
203
|
-
field :Type, :Type => Name, :Default => :Encoding
|
204
|
-
field :BaseEncoding, :Type => Name
|
205
|
-
field :Differences, :Type => Array
|
206
|
-
|
207
|
-
end
|
208
|
-
|
209
209
|
end
|
@@ -41,6 +41,7 @@ module Origami
|
|
41
41
|
|
42
42
|
class Tiling < ContentStream
|
43
43
|
include Pattern
|
44
|
+
include ResourcesHolder
|
44
45
|
|
45
46
|
module PaintType
|
46
47
|
COLOURED = 1
|
@@ -59,7 +60,7 @@ module Origami
|
|
59
60
|
field :BBox, :Type => Array, :Required => true
|
60
61
|
field :XStep, :Type => Number, :Required => true
|
61
62
|
field :YStep, :Type => Number, :Required => true
|
62
|
-
field :Resources, :Type =>
|
63
|
+
field :Resources, :Type => Resources, :Required => true
|
63
64
|
field :Matrix, :Type => Array, :Default => [ 1, 0, 0, 1, 0, 0 ]
|
64
65
|
|
65
66
|
end
|