def decode(self): assert self.data is None and self.rawdata is not None data = self.rawdata if self.decipher: # Handle encryption data = self.decipher(self.objid, self.genno, data, self.attrs) filters = self.get_filters() if not filters: self.data = data self.rawdata = None return for f in filters: params = self.get_any(('DP', 'DecodeParms', 'FDecodeParms'), {}) if f in LITERALS_FLATE_DECODE: # will get errors if the document is encrypted. try: data = zlib.decompress(data) except zlib.error as e: if STRICT: raise PDFException('Invalid zlib bytes: %r, %r' % (e, data)) data = '' elif f in LITERALS_LZW_DECODE: data = lzwdecode(data) elif f in LITERALS_ASCII85_DECODE: data = ascii85decode(data) elif f in LITERALS_ASCIIHEX_DECODE: data = asciihexdecode(data) elif f in LITERALS_RUNLENGTH_DECODE: data = rldecode(data) elif f in LITERALS_CCITTFAX_DECODE: data = ccittfaxdecode(data, params) elif f in LITERALS_DCT_DECODE: # This is probably a JPG stream - it does not need to be decoded twice. # Just return the stream to the user. pass elif f == LITERAL_CRYPT: # not yet.. raise PDFNotImplementedError('/Crypt filter is unsupported') else: raise PDFNotImplementedError('Unsupported filter: %r' % f) # apply predictors if 'Predictor' in params: pred = int_value(params['Predictor']) if pred == 1: # no predictor pass elif 10 <= pred: # PNG predictor colors = int_value(params.get('Colors', 1)) columns = int_value(params.get('Columns', 1)) bitspercomponent = int_value(params.get('BitsPerComponent', 8)) data = apply_png_predictor(pred, colors, columns, bitspercomponent, data) else: raise PDFNotImplementedError('Unsupported predictor: %r' % pred) self.data = data self.rawdata = None return
elif f == LITERAL_CRYPT: # not yet.. raise PDFNotImplementedError('/Crypt filter is unsupported') else: raise PDFNotImplementedError('Unsupported filter: %r' % f) # apply predictors if 'Predictor' in params: pred = int_value(params['Predictor']) if pred == 1: # no predictor pass elif 10 <= pred: # PNG predictor colors = int_value(params.get('Colors', 1)) columns = int_value(params.get('Columns', 1)) bitspercomponent = int_value(params.get('BitsPerComponent', 8)) data = apply_png_predictor(pred, colors, columns, bitspercomponent, data) else: raise PDFNotImplementedError('Unsupported predictor: %r' % pred) self.data = data self.rawdata = None return def get_data(self): if self.data is None: self.decode() return self.data def get_rawdata(self): return self.rawdata