Module: Pdfrb::Filter

Defined in:
lib/pdfrb/filter.rb,
lib/pdfrb/filter/base.rb,
lib/pdfrb/filter/crypt.rb,
lib/pdfrb/filter/lzw_decode.rb,
lib/pdfrb/filter/flate_decode.rb,
lib/pdfrb/filter/ascii_85_decode.rb,
lib/pdfrb/filter/ascii_hex_decode.rb,
lib/pdfrb/filter/run_length_decode.rb,
lib/pdfrb/filter/passthrough_filters.rb

Overview

Stream filter pipeline (s7.4). Each filter is a stateless class with decoder(bytes, parms, document) and encoder(bytes, parms, document) class methods, registered via register_as.

Defined Under Namespace

Modules: Base Classes: ASCII85Decode, ASCIIHexDecode, Crypt, FlateDecode, LZWDecode, RunLengthDecode

Constant Summary collapse

DCTDecode =
Class.new do
  include Base
  register_as "DCTDecode"
  class << self
    def decoder(bytes, _parms, _document); bytes; end
    def encoder(bytes, _parms, _document); bytes; end
  end
end.freeze
JPXDecode =
Class.new do
  include Base
  register_as "JPXDecode"
  class << self
    def decoder(bytes, _parms, _document); bytes; end
    def encoder(bytes, _parms, _document); bytes; end
  end
end.freeze
JBIG2Decode =
Class.new do
  include Base
  register_as "JBIG2Decode"
  class << self
    def decoder(bytes, _parms, _document); bytes; end
    def encoder(bytes, _parms, _document); bytes; end
  end
end.freeze
CCITTFaxDecode =
Class.new do
  include Base
  register_as "CCITTFaxDecode"
  class << self
    def decoder(bytes, _parms, _document)
      raise Pdfrb::FilterError.new(
        "CCITTFaxDecode requires an external decoder (Group 3/4 fax)",
        filter_name: "CCITTFaxDecode"
      )
    end
    def encoder(_bytes, _parms, _document)
      raise Pdfrb::FilterError.new(
        "CCITTFaxDecode encoder not implemented",
        filter_name: "CCITTFaxDecode"
      )
    end
  end
end.freeze

Class Method Summary collapse

Class Method Details

.[](name) ⇒ Object



17
18
19
# File 'lib/pdfrb/filter.rb', line 17

def [](name)
  registry[name.to_s]
end

.apply(bytes, filters:, parms:, direction:, document: nil) ⇒ Object



21
22
23
24
25
26
27
28
29
# File 'lib/pdfrb/filter.rb', line 21

def apply(bytes, filters:, parms:, direction:, document: nil)
  return bytes if filters.empty?

  case direction
  when :decode then decode_chain(bytes, filters, parms, document)
  when :encode then encode_chain(bytes, filters, parms, document)
  else raise ArgumentError, "unknown direction #{direction.inspect}"
  end
end

.register(name, klass) ⇒ Object



13
14
15
# File 'lib/pdfrb/filter.rb', line 13

def register(name, klass)
  registry[name.to_s] = klass
end

.registryObject



11
# File 'lib/pdfrb/filter.rb', line 11

def registry; @registry ||= {}; end