Changeset 771
- Timestamp:
- 12/13/06 17:09:13 (2 years ago)
- Files:
-
- pypdf/trunk/pyPdf/pdf.py (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
pypdf/trunk/pyPdf/pdf.py
r770 r771 215 215 self.read(stream) 216 216 self.stream = stream 217 self._override_encryption = False 217 218 218 219 ## … … 346 347 retval = readObject(self.stream, self) 347 348 348 # if retval is a stream or string, it might be encrypted:349 if isinstance(retval, StringObject) or isinstance(retval, StreamObject):349 # override encryption is used for the /Encrypt dictionary 350 if not self._override_encryption: 350 351 # if we don't have the encryption key: 351 352 if self.isEncrypted and not hasattr(self, '_decryption_key'): … … 359 360 md5_hash = md5.new(key).digest() 360 361 key = md5_hash[:min(16, len(self._decryption_key) + 5)] 361 if isinstance(retval, StringObject): 362 retval = StringObject(utils.RC4_encrypt(key, retval)) 363 elif isinstance(retval, StreamObject): 364 retval._data = utils.RC4_encrypt(key, retval._data) 362 #print repr(indirectReference) 363 retval = self._decryptObject(retval, key) 365 364 366 365 self.cacheIndirectObject(generation, idnum, retval) 367 366 return retval 367 368 def _decryptObject(self, obj, key): 369 if isinstance(obj, StringObject): 370 #print len(obj), obj.encode("hex_codec") 371 obj = StringObject(utils.RC4_encrypt(key, obj)) 372 #print len(obj), repr(obj) 373 elif isinstance(obj, StreamObject): 374 obj._data = utils.RC4_encrypt(key, obj._data) 375 elif isinstance(obj, DictionaryObject): 376 for key, value in obj.items(): 377 #if key == '/Author' or key == '/Producer': 378 # print repr(key), repr(value), repr(utils.RC4_encrypt(key, value)) 379 obj[key] = self._decryptObject(value, key) 380 elif isinstance(obj, ArrayObject): 381 for i in range(len(obj)): 382 obj[i] = self._decryptObject(obj[i], key) 383 return obj 368 384 369 385 def readObjectHeader(self, stream): … … 618 634 # method. 619 635 def decrypt(self, password): 636 self._override_encryption = True 637 try: 638 return self._decrypt(password) 639 finally: 640 self._override_encryption = False 641 642 def _decrypt(self, password): 620 643 encrypt = self.safeGetObject(self.trailer['/Encrypt']) 621 644 if encrypt['/Filter'] != '/Standard':
