这些天遇到了一个小问题,我的好朋友拿着一篇pdf来问我,如何把里面的简体字提取出来,翻译成繁体字,同时保留原来的拼音呢。一开始她用word打开pdf然后使用翻译功能,但效果并不好。作为一个预备软件工程师,当然会想到写一个程序来解决问题!
当然第一想法就是写不如抄啦,火速搜索了一下,发现已经有人帮我把主要处理模块写好了:
所以我的任务就更简单了,由于我要处理的是文本文件,所以我自己完成文件处理模块,然后服用链接的代码就ojbk了
首先我们观察要处理的这个pdf:
它在用word打开,然后转为txt格式后,会出现一个格式上的问题:
我们发现拼音和文字处于同一行了,而且拼音带上了括号。所以我们要提前做一个预处理工作,把所有的文字提取出来,保留除了括号以外的符号。
def reader(file_name):
with open(file_name, 'r', encoding='utf-8') as file_obj:
content = file_obj.read()
# print(content)
file_obj.close()
return content
#使用api
line_chs = reader("input.txt")
#定义处理所有的括号的函数
def get_words(ret_chs):
nr = ""
i = 0
while i < len(ret_chs):
if ret_chs[i] != '(':
nr = nr + ret_chs[i]
i = i + 1
else:
while i < len(ret_chs) and ret_chs[i] != ')':
i = i + 1
i = i + 1
return nr
def writer(file_name, content):
with open(file_name, 'w', encoding='utf-8') as file_obj:
file_obj.write(content)
file_obj.close()
# 转换繁体到简体
def cht_to_chs(line):
line = Converter('zh-hans').convert(line)
line.encode('utf-8')
return line
# 转换简体到繁体
def chs_to_cht(line):
line = Converter('zh-hant').convert(line)
line.encode('utf-8')
return line
#简体转繁体
ret_chs = chs_to_cht(line_chs)
#获取没有括号的文字段
nr=get_words(ret_chs)
writer("output2.txt", nr)
将文件保存,展示一下效果:
然后就是添加拼音的环节了,我们需要拼音库:
import pypinyin
考虑到文字和拼音的易读性,我们要调整间距,使得排版较为好看,我的做法是给每个文字中间加空格:
def pinyin(word):
s = ''
for i in pypinyin.pinyin(word, style=pypinyin.NORMAL):
s += ''.join(i)
return s
def split_line(word):
s = ''
for i in word:
s += i
if i == ' ':
continue
s += " "
return s
#把所有output2里面的文字按行为单位,放入列表中 便于格式控制
usr_list = []
for line in open("output2.txt", 'r', encoding='utf-8'):
s = ''
for i in line:
s = s + ''.join(i) + " "
usr_list.append(s)
#获得所有的字的拼音
pinyin_list = []
for line in usr_list:
pinyin_list.append(yinjie(line))
words = []
for line in usr_list:
words.append(split_line(line))
#给字加空格
words = []
for line in usr_list:
words.append(split_line(line))
#一行拼音 一行文字的打印
i = 0
with open("finaloutput.txt", 'w', encoding='utf-8') as file_obj:
while i < len(usr_list):
print(pinyin_list[i])
file_obj.write(pinyin_list[i])
file_obj.write(words[i])
print(words[i])
i += 1
file_obj.close()
然后我们看到程序运行的结果:
虽然还不是很好看,但已经很好的完成预定目标了