def read_char_strings(tokenizer): char_strings = {} next = tokenizer.next read = tokenizer.read while 1: token, value = next() if token == NAME: token, length = next() next() # discard RD operator read(1) # discard space character data = read(length) char_strings[value] = decode(data)[0][4:] elif token == END or (token == OPERATOR and value == 'end'): break return char_strings
def read_subrs(tokenizer, num): if not num: return [] subrs = [''] * num next = tokenizer.next read = tokenizer.read while not subrs[-1]: token, value = next() if token == OPERATOR and value == 'dup': token, index = next() token, length = next() next() # discard RD operator read(1) # discard space character data = read(length) subrs[index] = decode(data)[0][4:] elif token == END: break return subrs
def read_type1_file(filename): data = StringIO() file = open(filename, 'rb') head = file.read(6) if head[:2] == '%!': line = file.readline() while line: line = file.readline() pos = find(line, 'eexec') if pos >= 0: data.write(line[:pos + 5] + '\n') line = line[pos + 5:] break data.write(line) try: buf = line + file.read(200) buf, extra = hexdecode(buf) buf, r = decode(buf, 55665) data.write(buf[4:]) buf = extra + file.read(200) while buf: buf, extra = hexdecode(buf) buf, r = decode(buf, r) data.write(buf) buf = extra + file.read(200) except: pass else: while 1: if ord(head[0]) != 128: raise TypeError, 'not a pfb file' data_type = ord(head[1]) if data_type == 3: # EOF break data_length = ord(head[2]) + 256 * ord(head[3]) \ + 65536 * ord(head[4]) + 16777216 * ord(head[5]) if data_type == 1: # ASCII data.write(file.read(data_length)) elif data_type == 2: #Binary # decode and discard the first 4 bytes buf = file.read(4) if len(buf) < 4: raise IOError, "insufficient data" buf, r = decode(buf, 55665) data_length = data_length - 4 if data_length < 0: raise IOError, "invalid data" while data_length: buf = file.read(min(1000, data_length)) if not buf: raise IOError, "insufficient data" buf, r = decode(buf, r) data.write(buf) data_length = data_length - len(buf) else: raise RuntimeError, "Invalid data type" head = file.read(6) data = data.getvalue() return data