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()#进入消息循环
###

###

程序运行成功会出现下图界面

python whisper 翻译 python文档翻译_ide


这里要注意的是文件夹不会显示里面的文件,pdf文件夹选择时里面一定要只有pdf文件且没有密码。选择完路径后点击翻译就可以了。

生成的word排版存在一些问题,可以在adjust函数再加一些限制,或者读取pdf时识别它的排版,这些暂时未能解决。