class PDF::Reader::Filter

in the future.
Currently only 1 filter type is supported. Hopefully support for others will be added
content.
support for features like compression and encryption. This class is for decoding that
Various parts of a PDF file can be passed through a filter before being stored to provide
###############################################################################

def ascii85(data)


rubygem.
Decode the specified data using the Ascii85 algorithm. Relies on the AScii85
###############################################################################
def ascii85(data)
  data = "<~#{data}" unless data.to_s[0,2] == "<~"
  Ascii85::decode(data)
rescue Exception => e
  # Oops, there was a problem decoding the stream
  raise MalformedPDFError, "Error occured while decoding an ASCII85 stream (#{e.class.to_s}: #{e.to_s})"
end

def asciihex(data)


Decode the specified data using the AsciiHex algorithm.
###############################################################################
def asciihex(data)
  data.chop! if data[-1,1] == ">"
  data = data[1,data.size] if data[0,1] == "<"
  data.gsub!(/[^A-Fa-f0-9]/,"")
  data << "0" if data.size % 2 == 1
  data.scan(/.{2}/).map { |s| s.hex.chr }.join("")
rescue Exception => e
  # Oops, there was a problem decoding the stream
  raise MalformedPDFError, "Error occured while decoding an ASCIIHex stream (#{e.class.to_s}: #{e.to_s})"
end

def filter (data)


returned untouched. At this stage PDF::Reader has no need to decode images.
Filters that are only used to encode image data are accepted, but the data is

attempts to decode the specified data with the current filter
###############################################################################
def filter (data)
  # leave the data untouched if we don't support the required filter
  return data if @filter.nil?
  # decode the data
  self.send(@filter, data)
end

def flate (data)

Decode the specified data with the Zlib compression algorithm
###############################################################################
def flate (data)
  begin
    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
    Zlib::Inflate.new(-Zlib::MAX_WBITS).inflate(data)
  end
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

def initialize (name, options = nil)


returned untouched. At this stage PDF::Reader has no need to decode images.
Filters that are only used to encode image data are accepted, but the data is

creates a new filter for decoding content.
###############################################################################
def initialize (name, options = nil)
  @options = options
  case name.to_sym
  when :ASCII85Decode  then @filter = :ascii85
  when :ASCIIHexDecode then @filter = :asciihex
  when :CCITTFaxDecode then @filter = nil
  when :DCTDecode      then @filter = nil
  when :FlateDecode    then @filter = :flate
  when :JBIG2Decode    then @filter = nil
  else                 raise UnsupportedFeatureError, "Unknown filter: #{name}"
  end
end