class PDF::Reader::Filter::Flate

implementation of the Flate (zlib) stream filter

Constants

ZLIB_AUTO_DETECT_ZLIB_OR_GZIP

Public Class Methods

new(options = {}) click to toggle source
# File lib/pdf/reader/filter/flate.rb, line 13
def initialize(options = {})
  @options = options
end

Public Instance Methods

filter(data) click to toggle source

Decode the specified data with the Zlib compression algorithm

# File lib/pdf/reader/filter/flate.rb, line 19
def filter(data)
  deflated = nil
  begin
    deflated = Zlib::Inflate.new(ZLIB_AUTO_DETECT_ZLIB_OR_GZIP).inflate(data)
  rescue Zlib::DataError => e
    # by default, Ruby's Zlib assumes the data it's inflating
    # is RFC1951 deflated data, wrapped in a RFC1950 zlib container. If that
    # fails, then use a lightly-documented '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
    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