Module: HexaPDF::Filter::FlateDecode

Defined in:
lib/hexapdf/filter/flate_decode.rb

Overview

Implements the Deflate filter using the Zlib library.

See: HexaPDF::Filter, PDF1.7 s7.4.4

Class Method Summary collapse

Class Method Details

.decoder(source, options = nil) ⇒ Object

See HexaPDF::Filter



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/hexapdf/filter/flate_decode.rb', line 49

def self.decoder(source, options = nil)
  fib = Fiber.new do
    inflater = Zlib::Inflate.new
    while source.alive? && (data = source.resume)
      begin
        data = inflater.inflate(data)
      rescue StandardError => e
        raise FilterError, "Problem while decoding Flate encoded stream: #{e}"
      end
      Fiber.yield(data)
    end
    begin
      data = (data = inflater.finish).empty? ? nil : data
      inflater.close
      data
    rescue StandardError => e
      raise FilterError, "Problem while decoding Flate encoded stream: #{e}"
    end
  end

  if options && options[:Predictor]
    Predictor.decoder(fib, options)
  else
    fib
  end
end

.encoder(source, options = nil) ⇒ Object

See HexaPDF::Filter



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/hexapdf/filter/flate_decode.rb', line 77

def self.encoder(source, options = nil)
  if options && options[:Predictor]
    source = Predictor.encoder(source, options)
  end

  Fiber.new do
    deflater = Zlib::Deflate.new(HexaPDF::GlobalConfiguration['filter.flate_compression'],
                                 Zlib::MAX_WBITS,
                                 HexaPDF::GlobalConfiguration['filter.flate_memory'])
    while source.alive? && (data = source.resume)
      data = deflater.deflate(data)
      Fiber.yield(data)
    end
    data = deflater.finish
    deflater.close
    data
  end
end