用python写一个PDF翻译软件

前期工作:

  • 注册
    百度翻译api的账户(个人-高级版),注册后,每个月有2百万的免费翻译字符数。

  • 安装pdfminer3k在这里插入图片描述

一、UI界面设计

在这里插入图片描述

点击路径按钮时弹出文件目录选择窗口,参考文章:

PYQT5实现文件目录浏览
PyQt5-对话框控件使用(QFileDialog)

二、主程序

参考文章:python如何提取英语pdf内容并翻译

知道怎么调用百度翻译的api之后,把各个功能绑定到UI控件上。程序比较简单,结合注释理解即可。

# app.py
# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'app.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(577, 469)self.groupBox = QtWidgets.QGroupBox(Form)self.groupBox.setGeometry(QtCore.QRect(10, 120, 391, 241))self.groupBox.setObjectName("groupBox")self.bnt_add_file = QtWidgets.QPushButton(self.groupBox)self.bnt_add_file.setGeometry(QtCore.QRect(290, 30, 75, 23))self.bnt_add_file.setObjectName("bnt_add_file")self.bnt_translate = QtWidgets.QPushButton(self.groupBox)self.bnt_translate.setGeometry(QtCore.QRect(290, 200, 75, 23))self.bnt_translate.setObjectName("bnt_translate")self.files_listWidget = QtWidgets.QListWidget(self.groupBox)self.files_listWidget.setGeometry(QtCore.QRect(10, 30, 256, 192))self.files_listWidget.setObjectName("files_listWidget")self.bnt_delete_file = QtWidgets.QPushButton(self.groupBox)self.bnt_delete_file.setGeometry(QtCore.QRect(290, 70, 75, 23))self.bnt_delete_file.setObjectName("bnt_delete_file")self.groupBox_2 = QtWidgets.QGroupBox(Form)self.groupBox_2.setGeometry(QtCore.QRect(10, 10, 391, 101))self.groupBox_2.setObjectName("groupBox_2")self.label = QtWidgets.QLabel(self.groupBox_2)self.label.setGeometry(QtCore.QRect(30, 30, 54, 12))self.label.setObjectName("label")self.account = QtWidgets.QLineEdit(self.groupBox_2)self.account.setGeometry(QtCore.QRect(90, 30, 241, 21))self.account.setObjectName("account")self.password = QtWidgets.QLineEdit(self.groupBox_2)self.password.setGeometry(QtCore.QRect(90, 60, 241, 21))self.password.setObjectName("password")self.label_2 = QtWidgets.QLabel(self.groupBox_2)self.label_2.setGeometry(QtCore.QRect(30, 60, 54, 12))self.label_2.setObjectName("label_2")self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "Translate"))self.groupBox.setTitle(_translate("Form", "选择文件"))self.bnt_add_file.setText(_translate("Form", "添加文件"))self.bnt_translate.setText(_translate("Form", "全部翻译"))self.bnt_delete_file.setText(_translate("Form", "删除文件"))self.groupBox_2.setTitle(_translate("Form", "百度翻译"))self.label.setText(_translate("Form", "帐号"))self.label_2.setText(_translate("Form", "密码"))
# translate.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
# @Author  :   {Jan__}
# @Time    :   2021/2/11 15:17import sys
from PyQt5.QtWidgets import QWidget, QFileDialog, QApplication
from app import Ui_Form
import importlib
importlib.reload(sys)from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal, LAParams
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed#
import requests
import string
import time
import hashlib
import json##初始化api_url = "http://api.fanyi.baidu.com/api/trans/vip/translate"
api_id = ""  ##申请的百度翻译接口的id
cyber = ""  ##申请的百度翻译接口的password# 处理PDF
# 读取PDF的内容 filename是待处理的PDF的名字class MyUi(QWidget, Ui_Form):def __init__(self):super(MyUi, self).__init__()  # 分别调用了2个父类的初始化函数self.setupUi(self)  # UI界面控件的初始化self.signal_connect()  # 信号与槽函数绑定def signal_connect(self):self.account.setText(api_id)self.password.setText(cyber)self.bnt_add_file.clicked.connect(self.bnt_add_file_slot)self.bnt_delete_file.clicked.connect(self.bnt_delete_file_slot)self.bnt_translate.clicked.connect(self.bnt_translate_slot)def bnt_add_file_slot(self):fnames, _ = QFileDialog.getOpenFileNames(self, '选择文件', "./", "Files(*.pdf *.txt)")"""参数一:设置父组件参数二:QFileDialog的标题参数三:默认打开的目录,“.”点表示程序运行目录,/表示当前盘符根目录参数四:对话框的文件扩展名过滤器Filter,比如使用 Image files(*.jpg *.gif) 表示只能显示扩展名为.jpg或者.gif文件设置多个文件扩展名过滤,使用双引号隔开;“All Files(*);;PDF Files(*.pdf);;Text Files(*.txt)”"""try:if fnames:# 如果列表非空,则添加到文件列表中去for f in fnames:self.files_listWidget.addItem(f)except Exception as ex:print(ex)def bnt_translate_slot(self):Directory = QFileDialog.getExistingDirectory(self, '结果保存到目录', './')num = self.files_listWidget.count()# 遍历翻译所有文件print("# 遍历翻译所有文件")for _ in range(num):filename = self.files_listWidget.item(0).text()if filename.find('pdf') >= 3:content = self.getDataFromPDF(filename)elif filename.find('txt') >= 3:content = self.getDataFromTxt(filename)else:content = ""print("读取文件失败")returnprint("读取文件成功")f = filename.split('/')CNtextfile = Directory + '/CN_' + f[-1]CNtextfile = CNtextfile.replace('.pdf', '.txt')chinese = ""clist = content.split(".")  # split() 通过指定.将英文分成多个句子# 遍历翻译所有句子print("# 遍历翻译所有句子")try:for i in range(clist.__len__()):chinese += (self.translate(clist[i] + '.'))chinese += '\n'self.saveText(chinese, CNtextfile)print("翻译结束,ok")self.files_listWidget.takeItem(0)print("删除文件")except Exception as ex:print(ex)def bnt_delete_file_slot(self):num = self.files_listWidget.currentRow()self.files_listWidget.takeItem(num)print("删除文件")###使用PDFminer读取def getDataFromPDF(self, filename):try:parser = PDFParser(open(filename, 'rb'))  # 以二进制打开文件 ,并创建一个pdf文档分析器doc = PDFDocument()  # 创建一个pdf文档# 将文档对象和连接分析器连接起来parser.set_document(doc)doc.set_parser(parser)# 初始化文档,当前文档没有密码,设为空字符串doc.initialize("")# 判断该pdf是否支持txt转换if doc.is_extractable:# 创建一个PDF资源管理器rsrcmgr = PDFResourceManager()# 创建一个参数分析器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, LTTextBoxHorizontal)):results = x.get_text()results = results.replace("(cid:2) ", "")  # 去掉连词符results = results.replace("\n", "")  # 去掉换行符 因为排版问题 有的换行导致句子中断contents += (results)return contentsexcept Exception as ex:print(ex)def getDataFromTxt(self, filename):try:with open(filename, "r", encoding='utf-8') as f:text = f.read()print(text)content = text.replace("\n", "")  # 去掉换行符 因为排版问题 有的换行导致句子中断f.close()return contentexcept Exception as ex:print(ex)# 将读取的content以txt格式存放到本地def saveText(self, content, Textfile):with open(Textfile, "w", encoding='utf-8') as f:f.write(content)# 翻译从pdf提取的contentdef translate(self, content):try:salt = str(time.time())[:10]final_sign = str(self.account.text()) + content + salt + self.password.text()final_sign = hashlib.md5(final_sign.encode("utf-8")).hexdigest()# from to 代表翻译的语言paramas = {'q': content,'from': 'en','to': 'zh','appid': '%s' % self.account.text(),'salt': '%s' % salt,'sign': '%s' % final_sign}response = requests.get(api_url, params=paramas).contentcontent = str(response, encoding="utf-8")json_reads = json.loads(content)if 'trans_result' in json_reads:return json_reads['trans_result'][0]['dst'] + " "else:return str(json_reads)except Exception as ex:print(ex)if __name__ == '__main__':try:app = QApplication(sys.argv)  # 实例化一个应用对象,sys.argv是一组命令行参数的列表。Python可以在shell里运行,这是一种通过参数来选择启动脚本的方式。myshow = MyUi()myshow.show()sys.exit(app.exec_())  # 确保主循环安全退出except Exception as ex:print(ex)

三、问题小结

选择文件时报错:

log4cplus:ERROR No appenders could be found for logger (AdSyncNamespace). 
log4cplus:ERROR Please initialize the log4cplus system properly.

解决办法:
目录不要含有中文

打开txt文件时报错:

 'utf-8' codec can't decode byte 0xa1 in position 8: invalid start byte

解决办法:
txt文件保存时,编码格式需选择utf-8,参考文章:python 报错"UnicodeDecodeError: ‘utf-8’ codec can’t decode byte"的解决办法

不足:
简单翻译英文段落没问题,想翻译期刊文献就不行了,图、表、分栏这些干扰太多了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/52520.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用TCPDF插件生成pdf以及pdf的中文处理

做了这么多年项目,以前只是在别人的项目中了解过php生成pdf文件,知道并不难,但是涉及到了pdf开发库,首先介绍pdf库。 多种多样的pdf开发库 1.WKHTMLTOPDF wkhtmltopdf是一个很好的解决方案,基本上可以原样输出html页面…

pdf文件如何进行翻译?pdf文件翻译方法分享。

pdf文件如何进行翻译?在日常的工作和学习当中,很多小伙伴都需要接受到pdf文件,需要我们对pdf文件进行翻译或者处理,那么众所周知dpf文件因为不可编辑性,从而变的特别特别的安全,深受大家的喜爱,…

推荐几种可以直接翻译PDF英文文献的方法

大家在阅读英文文献的时候,可能会经常碰到这样的情况:由于作者使用了各种从句,明明只是一句话,却写成很长的一段,即使其中没有生词,看了几遍也弄不懂它的意思。如果句子里再夹杂了几个看不懂的英文单词&…

英文PDF怎么翻译成中文?两分钟让你学会翻译PDF

现在大部分的文件资料都是以PDF的格式保存的,这是因为PDF格式可以跨设备打开的时候,不会影响到内容的排版格式。在撰写论文的时候,我们常需要查阅各种文献资料,尤其是会参考英文文献。小伙伴们平时遇到不懂的词句,是怎…

pdf翻译器哪个好?这几个pdf翻译软件能支持一键翻译

有没有从事外贸行业的小伙伴经常收到国外客人发送的外文文档呢?通常这些文档除了是外文语言外,还是pdf格式的。外文不熟的朋友,肯定是对文档一窍不通吧。如果我们用一些pdf翻译器来翻译文档的话,我们就不用费心去研究该文档的意思…

推荐几个好用的pdf翻译工具

开始用的是网易有道词典,排版和准确度都不错,效果如下,只是收费 后来在网上找了一下,大部分工具,要不收费要不排版不行,或者只是划词翻译,也没有ocr识别 最后找了两个网站 https://fanyi.atm…

PDF如何翻译成中文?三种方法教你怎样翻译PDF上的文字

小伙伴们在学习或工作中遇到外国文章时是不是会先翻译成中文再阅读呢?如果文章是word或者txt格式,我们可以直接复制文字进行翻译。但是有些文章为了看起来美观可能会生成PDF格式,我们想翻译的话,就需要先把格式转换成word等方便编…

PDF怎么翻译成中文?这些方法值得收藏

小伙伴们平时接触英文PDF文件的机会多吗?虽然可能平时接触的少,可是一旦接触就会很痛苦,因为有的PDF文件里面会充斥着大量深奥的词汇。对于这些深奥的词汇,小伙伴们都是采取什么方法呢?是逐个逐个拿去翻译吗&#xff1…

福昕pdf阅读器的划词翻译功能如何添加(图文并茂)

一、打开福昕阅读器 二、可在上方工具栏,点击“帮助”,关于福昕阅读器领鲜版查看安装的版本信息,如图1-1,图1-2 图1-1 图1-2 三、找到上方工具栏的图标按键,名为“自定义快速访问工具栏”,如图1-3&#…

怎么把PDF翻译成中文?教你便捷翻译方法

怎么把PDF文件的内容给翻译成中文呢?对于PDF文件,大家在日常中经常会使用到,在办公中收到一份英文的PDF文件,或者是我们在网站上下载资料,发现是看不懂的英文,这时候我们怎么将文件内容给翻译成中文呢&…

我进入银行科技部半年,已经丧失跳槽的能力了!

大家好,我是小猿 学弟分享 我是一个杭州双非的本科生,2022届毕业之后进了某银行的科技部工作,年包 20w。 当时想着在银行也算是一份安稳的工作,因此选择了给钱最多的一个,想着自己走上了金融 科技的赛道。 在去之前也…

社交媒体用户行为研究,图神经网络 社交网络

产品经理如何做用户行为分析? 在这个每个互联网人都在谈论数据,每个产品经理都在谈论数据分析的时代,用户行为分析的重要性也越来越凸显出来,那么产品经理如何做用户行为分析呢?接下来将为大家进行分享。 一、为什么…

从伊朗虚假新闻活动案例来看国外造谣及传谣模式

曾经我发过下面这篇文章 里面提到了伊朗如何进行假新闻构造然后进行传播 而实际上,假新闻的传播模式,在国外一成一套流水线,与国内的微博,微信公众号,朋友圈,匿名论坛等方式截然不同。 下面通过一起伊朗针对…

一周信创舆情观察(7.12~7.18)

[福利:\[ 网络安全重磅福利:入门&进阶全套282G学习资源包免费分享 !\]](https://mp.weixin.qq.com/s/BWb9OzaB-gVGVpkm161PMw ) 一、一周舆情要点 7月12日,工信部官网发布《网络安全产业高质量发展三年行动计划(20…

怎么在新闻媒体上发稿?如何联系权威媒体发稿?

新闻体软文,是指通过新闻报道或新闻评论分析的形式把广告自然的穿插在文章中的软文,即软文与新闻的结合体,将软文与新闻恰到好处的合并在一起。 新闻体软文在形式上的隐蔽性和表达上的悬念性、完整性与可看性,抓住了消费者的心理…

Emotet分析报告

分析样本出处 链接:https://www.malware-traffic-analysis.net/2022/04/20/index.html 样本表现 Emotet,是一种计算机恶意软件程序,最初是作为一种银行木马病毒开发的。其目的是访问外部设备并监视敏感的私有数据。Emotet 会骗过基本的防病…

微信们正在成为“被模仿者”!中国互联网现状及趋势报告

整理 | 郭芮 责编 | 伍杏玲 出品 | CSDN(ID:CSDNnews) “中国已经走上了世界舞台,他们已经成功完成了从模仿者到开拓者角色的转换,且拥有众多具有创新性和竞争力的全球科技公司。”近日在香港 RISE 会议上,…

清华开源图文对话大模型!表情包解读有一手,奇怪的benchmark增加了

丰色 萧箫 发自 凹非寺 量子位 | 公众号 QbitAI 什么,最懂表情包的中文开源大模型出现了??! 就在最近,来自清华的一个叫VisualGLM-6B的大模型在网上传开了来,起因是网友们发现,它连表情包似乎…

元宇宙即将到来

元宇宙是人们娱乐生活及工作的,虚拟时空。核心是数字创造,数字资产,数字交易,数字货币和数字消费,尤其是在用户体验方面,达到了真假难辨,虚实混同的境界。 元宇宙虚拟物品生产到消费的宏观产业…

聊聊这个本不存在的 “元宇宙”

最近看元宇宙的信息已经都传得很魔幻了,就差走向神学、哲学了。一些小伙伴也来问我到底什么是元宇宙。在这个领域待了很多年的圈内人,反而其实没人会聊这个词,也是感慨资本炒作的强大。很多人估计连 VR/AR 都不见得分得清,又被拉入…