python读取pdf翻译生成word文件
对应python版本未3.7.3
首先是安装所需要的包
通过pip安装或是pycharm的setting安装
这里仅列出包名(tkinter requests time hashlib json os pdfminer docx)
在运行程序前需要先注册一个百度翻译的api
设置api_id、cyber
这里注册普通的接口就足够使用
import tkinter
import requests
import time
import hashlib
import json
import os
import docx
from tkinter.filedialog import askdirectory
from tkinter.messagebox import *
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LAParams,LTTextBox
##初始化
api_url = "http://api.fanyi.baidu.com/api/trans/vip/translate"
api_id = " " ##申请的百度翻译接口的id
cyber = " " ##申请的百度翻译接口的password
file = "multinet.pdf" ##处理的pdf
##存储提取的txt
CNtextfile = "CNmultinet.txt" ##存储翻译的结果
isTranslate = True ##是否将提取的英文翻译为中文
#生成界面
root=tkinter.Tk()
root.geometry('500x250')
root.title('翻译小程序')
#定义读取本地路径函数
def selectPath1():
path_ = askdirectory()
pathroad1.set(path_)
def selectPath2():
path_ = askdirectory()
pathroad2.set(path_)
#生成文本框
pathroad1=tkinter.StringVar()#设置pathroad为输入文本
b1entry=tkinter.Entry(root,width=500,textvariable=pathroad1)#为输入文本的功能设计文本框
b1entry.place(x=100,y=60,width=300,height=20)
pathroad2=tkinter.StringVar()#设置pathroad为输入文本
b2entry=tkinter.Entry(root,width=500,textvariable=pathroad2)#为输入文本的功能设计文本框
b2entry.place(x=100,y=80,width=300,height=20)
#定义中间文件及函数
ENtextfile=b1entry.get()+'ENtextfile'
## 处理PDF
## 读取PDF的内容 filename是待处理的PDF的名字
###使用PDFminer读取
def getDataUsingPyPDF(file):
parser = PDFParser(open(file, 'rb')) # 以二进制打开文件 ,并创建一个pdf文档分析器
doc = PDFDocument() ##创建一个pdf文档
# 将文档对象和连接分析器连接起来
parser.set_document(doc)
doc.set_parser(parser)
doc.initialize()
# 判断该pdf是否支持txt转换
if doc.is_extractable:
# 创建一个PDF设备对象
rsrcmgr = PDFResourceManager()
# 创建一个pdf设备对象
laparamas = LAParams()
device = PDFPageAggregator(rsrcmgr, laparams=laparamas)
# 创建一个PDF解释器对象
interpreter = PDFPageInterpreter(rsrcmgr, device)
contents = "" # 保存读取的text
# 依次读取每个page的内容
for page in doc.get_pages():
interpreter.process_page(page)
layout = device.get_result() # 这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等 想要获取文本就获得对象的text属性,
# 在windows下,新文件的默认编码是gbk编码,所以我们在写入文件的时候需要设置一个编码格式,如下:
for x in layout:
if (isinstance(x, LTTextBox)):
results = x.get_text()
contents += (results)
saveText( contents,ENtextfile)
return contents
## 将读取的content以txt格式存放到
def saveText(content, Textfile):
with open(Textfile, "w", encoding='utf-8') as f:
f.write(content)
##将读取的
def savedoc(content, docfile):
doc = docx.Document() # 创建一个Document对象
doc.add_paragraph(content) # 增加一个paragraph
doc.save( docfile+'.docx')
#文字的排版,去掉多余换行符及字数过少的行
def adjust(text):
f =open(text,encoding='UTF-8', errors = 'ignore')
lines = f.readlines()
string = ""
for line in lines:
if len(line)<8 and line[-1]=='\n':#字母少于8则删去
pass
elif line[-1] == '\n' and line[-2]=='.':#句尾是.和回车则保留回车
string += line
else:
string += line[:-1]#去掉句尾回车
return string
## 翻译从pdf提取的content
def translate(content):
salt = str(time.time())[:10]
final_sign = str(api_id) + content + salt + cyber
final_sign = hashlib.md5(final_sign.encode("utf-8")).hexdigest()
paramas = {
'q': content,
'from': 'en',
'to': 'zh',
'appid': '%s' % api_id,
'salt': '%s' % salt,
'sign': '%s' % final_sign
}
my_url = api_url + '?appid=' + str(
api_id) + '&q=' + content + '&from=' + 'zh' + '&to=' + 'en' + '&salt=' + salt + '&sign=' + final_sign
response = requests.get(api_url, params=paramas).content
content = str(response, encoding="utf-8")
json_reads = json.loads(content)
return json_reads['trans_result'][0]['dst'] + "\n"
#定义按钮处理函数
def fanyi():
PDFlist=b1entry.get()
TXTlist=b2entry.get()
for filename in os.listdir(PDFlist):
outfile = filename[:-4] + '.docx'
print(outfile)
file=PDFlist+'\\'+filename
contents = getDataUsingPyPDF(file)
contents=adjust(ENtextfile)
if (isTranslate):
clist = contents.split("\n") # split() 通过指定.将英文分成多个句子
i = 0
chinese = ""
outfile = TXTlist + '\\' + outfile
while (i < clist.__len__()):
print(i) # 22
try:
chinese += (translate(clist[i]))
time.sleep(0.5)#设置等待时间
except:
print("Current failed: " + str(i))
i += 1
#saveText(chinese, outfile)
savedoc(chinese,outfile)
showinfo('提示', '翻译完成')
##生成按钮
b1=tkinter.Button(root,text='PDF文件夹',command = selectPath1)#生成文本提示词
#b1.pack(side=tkinter.LEFT)#将b1添加至主窗口
b1.place(x=20,y=60,width=70,height=20)
b2=tkinter.Button(root,text='txt文件夹',command = selectPath2)#
#b2.pack(side=tkinter.LEFT)#将b1添加至主窗口
b2.place(x=20,y=80,width=70,height=20)
work=tkinter.Button(root,text='翻译',command=fanyi)#生成翻译键
work.pack(side=tkinter.LEFT)#将b1添加至主窗口
work.place(x=200,y=120,width=70,height=20)
root.mainloop()#进入消息循环
###
###
程序运行成功会出现下图界面
这里要注意的是文件夹不会显示里面的文件,pdf文件夹选择时里面一定要只有pdf文件且没有密码。选择完路径后点击翻译就可以了。
生成的word排版存在一些问题,可以在adjust函数再加一些限制,或者读取pdf时识别它的排版,这些暂时未能解决。