def _decrypt_val(self, objID, val): t = get_type_name(val) P = PDF_TYPE_NAME this_f = self.decrypt_val if t == P.PDF_ARRAY: f = lambda val: this_f(objID, val) return list(map(f, val)) if t == P.PDF_DICT: # f = lambda (key, val): (key, this_f(objID, val)) def f(pair): key, val = pair return key, this_f(objID, val) return dict(map(f, val.items())) if t == P.PDF_STRING: s = PdfStr(self.decrypt_bytes(objID, val.get())) return s print('decrypted string: {!r}'.format(s)) print('decrypted string: {!r}'.format(bytes(s).decode('utf8'))) return s if t == P.PDF_STREAM: d, data = val.get() return PdfStream((d, self.decrypt_bytes(objID, data))) if t in ( P.PDF_INT , P.PDF_FLOAT , P.PDF_NULL , P.PDF_NAME , P.PDF_BOOL , P.PDF_REF ): return val
def write_array(file, ls): assert get_type_name(ls) == PDF_TYPE_NAME.PDF_ARRAY wb = file.wb wb(b'[') for obj in ls: write_obj(file, obj) wb(b' ') wb(b']')
def write_ref(file, ref): assert get_type_name(ref) == PDF_TYPE_NAME.PDF_REF wb = file.wb objNum, genNum = ref.get() write_int(file, objNum) wb(b' ') write_int(file, genNum) wb(b' R')
def write_stream(file, stream): assert get_type_name(stream) == PDF_TYPE_NAME.PDF_STREAM d, data = stream.get() wb = file.wb write_dict(file, d) wb(b'\nstream\n') wb(data) wb(b'\nendstream')
def write_dict(file, d): assert get_type_name(d) == PDF_TYPE_NAME.PDF_DICT wb = file.wb wb(b'<<') for name, obj in sorted(d.items()): write_name(file, name) # with ' ' wb(b' ') write_obj(file, obj) wb(b'>>')
def get_encryption_dict(objID2val, trailer_dict): encryption_dict_or_ref = trailer_dict.get(b'/Encrypt') if encryption_dict_or_ref is None: raise NotEncrypted('not encrypted') if get_type_name(encryption_dict_or_ref) == PDF_TYPE_NAME.PDF_REF: # ref ref = encryption_dict_or_ref objID = ref.get() encryption_dict = resolve_to_final__val(objID2val, objID) else: encryption_dict = encryption_dict_or_ref tn = get_type_name(encryption_dict) if tn == PDF_TYPE_NAME.PDF_NULL: # null ==>> no /Encrypt key raise NotEncrypted('not encrypted') if tn != PDF_TYPE_NAME.PDF_DICT: raise Exception('TypeError: value of encryption_dict is not a dict') return encryption_dict
def decrypt_val(self, objID, val): val = self._decrypt_val(objID, val) get_type_name(val) # verify return val
def write_obj(file, obj): t = get_type_name(obj) typename2writer[t](file, obj)
def write_XXX(file, XXX): assert get_type_name(XXX) == PDF_TYPE_NAME.PDF_ file.wb(XXX)
def write_string(file, string): assert get_type_name(string) == PDF_TYPE_NAME.PDF_STRING wb = file.wb wb(b'<') wb(encodeToHex(string.get())) wb(b'>')
def write_bool(file, bool): assert get_type_name(bool) == PDF_TYPE_NAME.PDF_BOOL file.wb(b'true' if bool else b'false')
def write_float(file, float): assert get_type_name(float) == PDF_TYPE_NAME.PDF_FLOAT file.wb(float.get())
def write_null(file, null): assert get_type_name(null) == PDF_TYPE_NAME.PDF_NULL file.wb(b'null')
def write_name(file, name): assert get_type_name(name) == PDF_TYPE_NAME.PDF_NAME # bug: without escape # file.wb(name) file.wb(escape_name(name))
def write_int(file, i): assert get_type_name(i) == PDF_TYPE_NAME.PDF_INT file.ws(str(i))