Class: PDF::Reader::Filter::Flate

Inherits:
Object
  • Object
show all
Defined in:
lib/pdf/reader/filter/flate.rb

Overview

implementation of the Flate (zlib) stream filter

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Flate

Returns a new instance of Flate.



10
11
12
# File 'lib/pdf/reader/filter/flate.rb', line 10

def initialize(options = {})
  @options = options
end

Instance Method Details

#filter(data) ⇒ Object

Decode the specified data with the Zlib compression algorithm



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/pdf/reader/filter/flate.rb', line 16

def filter(data)
  deflated = nil
  begin
    deflated = Zlib::Inflate.new.inflate(data)
  rescue Zlib::DataError => e
    # by default, Ruby's Zlib assumes the data it's inflating
    # is RFC1951 deflated data, wrapped in a RFC1951 zlib container.
    # If that fails, then use an undocumented 'feature' to attempt to inflate
    # the data as a raw RFC1951 stream.
    #
    # See
    # - http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/243545
    # - http://www.gzip.org/zlib/zlib_faq.html#faq38
    deflated = Zlib::Inflate.new(-Zlib::MAX_WBITS).inflate(data)
  end
  Depredict.new(@options).filter(deflated)
rescue Exception => e
  # Oops, there was a problem inflating the stream
  raise MalformedPDFError,
    "Error occured while inflating a compressed stream (#{e.class.to_s}: #{e.to_s})"
end