打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
python文档自动翻译

关键方法

提取文档内容

读取TXT文档

txt文档的读取很简单,直接用python自带的open()方法就好,代码如下所示:

  1. # 读取TXT文档
  2. def read_txt(path):
  3. '''实现TXT文档的读取,一次将内容全部取出'''
  4. content = ''
  5. with open(path) as f:
  6. content = f.read()
  7. return content
  8. # 也可以用readline()读取每一行

读取Word文档

读取Word文档也比较简单,导入第三方库python-docx,安装指令为pip install python-docx,实例代码如下:

  1. import docx # 安装指令:pip install python-docx
  2. def translate(self):
  3. '''翻译'''
  4. # 获取文档对象
  5. doc = docx.Document(self.fullName)
  6. # 创建内存中的word文档对象
  7. new_doc = docx.Document()
  8. # 遍历每一段文本
  9. for para in doc.paragraphs:
  10. # 翻译
  11. trans = baidu_translate(para.text)
  12. # 写入新文件
  13. new_doc.add_paragraph(para.text)
  14. new_doc.add_paragraph(trans)
  15. # 保存到本地文件
  16. new_doc.save(self.new_fullPath)

读取PDF文档

读取PDF文档同样需要安装第三方库,主要有PyPDF2和pdfminer,这两个库我都有去了解,算是各有特点吧。
PyPDF2使用相对简单,但只支持英文,对中文支持不太友好;相反pdfminer使用相对而言要复杂点,仅仅是相对而言,其支持多种语言,图表、图片等,功能较强大。这两种方式我在代码中均有实现,其实例代码如下:
PyPDF2

  1. # 安装指令:pip install pypdf2
  2. from PyPDF2.pdf import PdfFileReader
  3. def translate(self):
  4. '''读取pdf内容,并翻译,写入txt文件'''
  5. f = open(self.fullPath,'rb')
  6. pdf = PdfFileReader(f)
  7. for i in range(0,pdf.getNumPages()):
  8. extractedText = pdf.getPage(i).extractText()
  9. content = extractedText.split('\n')
  10. content = self.removeBlankFromList(content)
  11. # 拼接之后的文本,如果单词间歇超过一个空格的,认为是需要换行处理的
  12. content_list = self.enter_symbol(content)
  13. for line in content_list:
  14. trans = baidu_translate(line)
  15. self.write(line + '\n')
  16. self.write(trans)
  17. f.close()
  18. Logger().write(self.fileName + '翻译完成,新文档:' + self.new_fullPath)

pdfminer

  1. # 安装指令:pip install pdfminer3k
  2. from pdfminer.pdfparser import PDFParser,PDFDocument
  3. from pdfminer.pdfinterp import PDFResourceManager,PDFPageInterpreter
  4. from pdfminer.layout import LAParams,LTTextBoxHorizontal
  5. from pdfminer.converter import PDFPageAggregator
  6. from pdfminer.pdfinterp import PDFTextExtractionNotAllowed
  7. def translate(self):
  8. '''读取pdf内容,并翻译,写入txt文件'''
  9. # 以二进制读模式打开本地pdf文件
  10. fp = open(self.fullPath,'rb')
  11. # 用文件对象来创建一个pdf文档分析器
  12. praser_pdf = PDFParser(fp)
  13. # 创建一个PDF文档
  14. doc_pdf = PDFDocument()
  15. # 连接分析器与文档对象
  16. praser_pdf.set_document(doc_pdf)
  17. doc_pdf.set_parser(praser_pdf)
  18. # 提供初始化密码doc.initialize("123456"),如果没有密码 就创建一个空的字符串
  19. doc_pdf.initialize()
  20. # 检查文档是否提供txt转换,不提供就无法翻译文档
  21. if not doc_pdf.is_extractable:
  22. Logger().write(self.fileName + '未能提取有效的文本,停止翻译。')
  23. return
  24. else:
  25. # 创建PDF资源管理器来共享资源
  26. rsrcmgr = PDFResourceManager()
  27. # 创建一个PDF参数分析器
  28. laparams = LAParams()
  29. # 创建聚合器
  30. device = PDFPageAggregator(rsrcmgr,laparams=laparams)
  31. # 创建一个PDF页面解释器对象
  32. interpreter = PDFPageInterpreter(rsrcmgr,device)
  33. # 循环遍历列表,每次处理一页的内容
  34. for page in doc_pdf.get_pages():
  35. # 使用页面解释器来读取
  36. interpreter.process_page(page)
  37. # 使用聚合器获取内容
  38. layout = device.get_result()
  39. # 这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等 想要获取文本就获得对象的text属性,
  40. for out in layout:
  41. # 判断是否含有get_text()方法,图片之类的就没有
  42. if isinstance(out,LTTextBoxHorizontal):
  43. content = out.get_text()
  44. trans = baidu_translate(content)
  45. self.write(content)
  46. self.write(trans)
  47. Logger().write(self.fileName + '翻译完成,新文档:' + self.new_fullPath)

调用翻译接口

利用python网络爬虫可以很轻松的实现数据爬取,这里就是利用这种“手段”实现翻译功能,对此,还是要感谢这些接口提供商,感谢CCTV、铁岭TV。

百度翻译

百度翻译有反爬机制,电脑端的爬虫会被干掉,所幸手机端可以使用,代码如下所示:

  1. import urllib.request
  2. import urllib.parse
  3. import json
  4. # 百度翻译方法
  5. def baidu_translate(content,type=1):
  6. '''实现百度翻译'''
  7. baidu_url = 'http://fanyi.baidu.com/basetrans'
  8. data = {}
  9. data['from'] = 'en'
  10. data['to'] = 'zh'
  11. data['query'] = content
  12. data['transtype'] = 'translang'
  13. data['simple_means_flag'] = '3'
  14. data['sign'] = '94582.365127'
  15. data['token'] = 'ec980ef090b173ebdff2eea5ffd9a778'
  16. data = urllib.parse.urlencode(data).encode('utf-8')
  17. headers = {"User-Agent":"Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Mobile Safari/537.36"}
  18. baidu_re = urllib.request.Request(baidu_url, data, headers)
  19. baidu_response = urllib.request.urlopen(baidu_re)
  20. baidu_html = baidu_response.read().decode('utf-8')
  21. target2 = json.loads(baidu_html)
  22. trans = target2['trans']
  23. ret = ''
  24. for i in range(len(trans)):
  25. ret += trans[i]['dst'] + '\n'
  26. return ret

谷歌翻译

首先需要一个类实现JS码的生成

  1. import execjs
  2. class Py4Js():
  3. def __init__(self):
  4. self.ctx = execjs.compile("""
  5. function TL(a) {
  6. var k = "";
  7. var b = 406644;
  8. var b1 = 3293161072;
  9. var jd = ".";
  10. var $b = "+-a^+6";
  11. var Zb = "+-3^+b+-f";
  12. for (var e = [], f = 0, g = 0; g < a.length; g++) {
  13. var m = a.charCodeAt(g);
  14. 128 > m ? e[f++] = m : (2048 > m ? e[f++] = m >> 6 | 192 : (55296 == (m & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (m = 65536 + ((m & 1023) << 10) + (a.charCodeAt(++g) & 1023),
  15. e[f++] = m >> 18 | 240,
  16. e[f++] = m >> 12 & 63 | 128) : e[f++] = m >> 12 | 224,
  17. e[f++] = m >> 6 & 63 | 128),
  18. e[f++] = m & 63 | 128)
  19. }
  20. a = b;
  21. for (f = 0; f < e.length; f++) a += e[f],
  22. a = RL(a, $b);
  23. a = RL(a, Zb);
  24. a ^= b1 || 0;
  25. 0 > a && (a = (a & 2147483647) + 2147483648);
  26. a %= 1E6;
  27. return a.toString() + jd + (a ^ b)
  28. };
  29. function RL(a, b) {
  30. var t = "a";
  31. var Yb = "+";
  32. for (var c = 0; c < b.length - 2; c += 3) {
  33. var d = b.charAt(c + 2),
  34. d = d >= t ? d.charCodeAt(0) - 87 : Number(d),
  35. d = b.charAt(c + 1) == Yb ? a >>> d: a << d;
  36. a = b.charAt(c) == Yb ? a + d & 4294967295 : a ^ d
  37. }
  38. return a
  39. }
  40. """)
  41. def getTk(self,text):
  42. return self.ctx.call("TL",text)

调用方法如下所示:

  1. from Py4Js import *
  2. # 谷歌翻译方法
  3. def google_translate(content):
  4. '''实现谷歌的翻译'''
  5. js = Py4Js()
  6. tk = js.getTk(content)
  7. if len(content) > 4891:
  8. print("翻译的长度超过限制!!!")
  9. return
  10. param = {'tk': tk, 'q': content}
  11. result = requests.get("""http://translate.google.cn/translate_a/single?client=t&sl=en
  12. &tl=zh-CN&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss
  13. &dt=t&ie=UTF-8&oe=UTF-8&clearbtn=1&otf=1&pc=1&srcrom=0&ssel=0&tsel=0&kc=2""", params=param)
  14. #返回的结果为Json,解析为一个嵌套列表
  15. trans = result.json()[0]
  16. ret = ''
  17. for i in range(len(trans)):
  18. line = trans[i][0]
  19. if line != None:
  20. ret += trans[i][0]
  21. return ret

有道翻译

有道翻译的代码实现如下所示:

  1. import urllib.request
  2. import urllib.parse
  3. import json
  4. # 有道翻译方法
  5. def youdao_translate(content):
  6. '''实现有道翻译的接口'''
  7. youdao_url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
  8. data = {}
  9. data['i']= content
  10. data['from'] = 'AUTO'
  11. data['to'] = 'AUTO'
  12. data['smartresult'] = 'dict'
  13. data['client'] = 'fanyideskweb'
  14. data['salt'] = '1525141473246'
  15. data['sign'] = '47ee728a4465ef98ac06510bf67f3023'
  16. data['doctype'] = 'json'
  17. data['version'] = '2.1'
  18. data['keyfrom'] = 'fanyi.web'
  19. data['action'] = 'FY_BY_CLICKBUTTION'
  20. data['typoResult'] = 'false'
  21. data = urllib.parse.urlencode(data).encode('utf-8')
  22. youdao_response = urllib.request.urlopen(youdao_url, data)
  23. youdao_html = youdao_response.read().decode('utf-8')
  24. target = json.loads(youdao_html)
  25. trans = target['translateResult']
  26. ret = ''
  27. for i in range(len(trans)):
  28. line = ''
  29. for j in range(len(trans[i])):
  30. line = trans[i][j]['tgt']
  31. ret += line + '\n'
  32. return ret

写入文档

写TXT文档

TXT文档的写比较简单,代码如下所示:

  1. # 写TXT文档
  2. def write_txt(path,content):
  3. '''实现TXT文档的写方法'''
  4. with open(path,'a+') as f:
  5. f.write(content)

写Word文档

Word文档的写就是用上面所属的python-docx库实现,在上面读取Word文档小节中已有代码明细,非常之简单,这里就不在赘述。

写PDF文档

同上,写PDF文档,用PyPdf和pdfminer均可实现,PyPDF相对而言要简单写,因本脚本对翻译后的文档只实现了Word和TXT的写,方便对文档进行编辑处理,若需要生成PDF文档,有兴趣可自行研究。

好了,关键技术已基本描述清楚,下面就是具体的实现过程和效果对比。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
用Python把PDF文件转换成Word文档
Python—PDF文本与图片抽取
提取PDF文本信息:入门
WORD文档DOC转PDF
3个Python PDF库,提取信息、转换格式、分割剪裁有它就够了!
PDF转Word怎么转 多种方法可实现 violet的馨驻客栈
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服