1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
# coding: utf-8
# typed: strict
# frozen_string_literal: true
require 'zlib'
class PDF::Reader
module Filter # :nodoc:
# implementation of the Flate (zlib) stream filter
class Flate
ZLIB_AUTO_DETECT_ZLIB_OR_GZIP = 47 #: Integer # Zlib::MAX_WBITS + 32
ZLIB_RAW_DEFLATE = -15 #: Integer # Zlib::MAX_WBITS * -1
#: (?Hash[untyped, untyped]) -> void
def initialize(options = {})
@options = options
end
################################################################################
# Decode the specified data with the Zlib compression algorithm
#: (String) -> String
def filter(data)
deflated = zlib_inflate(data) || zlib_inflate(data[0, data.bytesize-1])
if deflated.nil?
raise MalformedPDFError,
"Error while inflating a compressed stream (no suitable inflation algorithm found)"
end
Depredict.new(@options).filter(deflated)
end
private
#: (untyped) -> untyped
def zlib_inflate(data)
begin
return Zlib::Inflate.new(ZLIB_AUTO_DETECT_ZLIB_OR_GZIP).inflate(data)
rescue Zlib::Error
# by default, Ruby's Zlib assumes the data it's inflating
# is RFC1951 deflated data, wrapped in a RFC1950 zlib container. If that
# fails, swallow the exception and attempt to inflate the data as a raw
# RFC1951 stream.
end
begin
return Zlib::Inflate.new(ZLIB_RAW_DEFLATE).inflate(data)
rescue Zlib::Error
# swallow this one too, so we can try some other fallback options
end
nil
end
end
end
end
|