File: flate.rb

package info (click to toggle)
ruby-pdf-reader 2.15.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 33,512 kB
  • sloc: ruby: 11,959; sh: 46; makefile: 11
file content (58 lines) | stat: -rw-r--r-- 1,689 bytes parent folder | download
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