吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9889|回复: 47
收起左侧

[原创工具] ppt保留源格式自动翻译_使用python编写_2021.10.21更新

  [复制链接]
当钟声敲响回忆 发表于 2021-4-26 17:08
本帖最后由 当钟声敲响回忆 于 2021-10-12 16:37 编辑

学生物的孩子翻译ppt实在太累了啊! 索性编写一个软件来翻译ppt
源码如下:
[Python] 纯文本查看 复制代码
# -*- coding: UTF-8 -*-
from tkinter import filedialog
from tkinter import ttk
from tkinter import *
import getpass
import pptx
import os
import os.path
import win32com
import threading
import win32com.client
from tkinter.messagebox import*
from pptx.enum.text import MSO_AUTO_SIZE
from google_trans_new import  google_translator
def plus_text(text_frame):
    for paragraph in text_frame.paragraphs:
        #对于对象的每个段落
        for run in paragraph.runs:
            #将字从paragraph.runs里提取出来
            try:
                run.text += '(' + translator.translate(run.text, lang_src = '%s'%language_list[combox_source.get()], lang_tgt = '%s'%language_list[combox_aim.get()]) + ')'
                #翻译,源语言与目标语言调用下拉框结果
            except:
                None
            #字+翻译结果
    #逐行翻译
    auto_changesize(text_frame)
def auto_changesize(text_frame):
    try:
        text_frame.auto_size = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE 
    except:
        None
def process_ppt(fileopen, filesave):
    now_process = 0
    total_num = 0
    prs = pptx.Presentation(fileopen)
    for slide in prs.slides:
        #对于ppt的每一页
        total_num += len(slide.shapes)
    for slide in prs.slides:
        #对于ppt的每一页
        for shape in slide.shapes:
            #对于每一页的每一个对象
            if shape.has_text_frame:
                #验证是否为非表格
                text_frame = shape.text_frame
                plus_text(text_frame)
            if shape.has_table:
                #验证是否为表格
                table = shape.table
                for cell in table.iter_cells():
                    text_frame = cell.text_frame
                    plus_text(text_frame)
            now_process += 1
        #覆盖进度显示
            visual_process.set('翻译进度:' + str(100*now_process/total_num)+'%')
        #打印进度
    if change_form == True:
        os.remove(fileopen)
        #删除ppt转pptx的临时文件
    else:
        None
    prs.save(filesave)
    #保存文件
    showinfo(title="成功!",message="翻译完毕,文件已保存至源文件目录")
def browse_button():
    global file_path
    global visual_path
    if check_pow == True:
        filepath = filedialog.askopenfilename(title = '请选择一个PPT文件', initialdir = 'C:/Users/%s/Documents'%getpass.getuser(), filetypes = [(
    "Microsoft PowerPoint 演示文稿", ".ppt .pptx")], multiple = False)
    #如果计算机上有Microsoft PowerPoint则可以打开ppt文件
    else:
        filepath = filedialog.askopenfilename(title = '请选择一个PPT文件', initialdir = 'C:/Users/%s/Documents'%getpass.getuser(), filetypes = [(
    "Microsoft PowerPoint 演示文稿", ".pptx")], multiple = False)
    #若没有则不行
    if filepath != '':
        file_path = filepath
        visual_path.set(filepath)
    else:
        pass
    #可视化当前路径
def translate_button():
    if file_path != '':
        trans_button['state'] = DISABLED
        select_button['state'] = DISABLED
        combox_source['state'] = DISABLED
        combox_aim['state'] = DISABLED
        transread = threading.Thread(target=change_format,args=(file_path,))
        visual_process.set('正在启动翻译进程...')
        transread.start()
    else:
        showinfo(title = "错误", message = "请先选择待翻译文件")
def change_format(filepath):
    global change_form
    if filepath[-1] != 'x':
        powerpoint = win32com.client.Dispatch('PowerPoint.Application')
        win32com.client.gencache.EnsureDispatch('PowerPoint.Application')
        powerpoint.Visible = 1
        ppt = powerpoint.Presentations.Open(filepath)
        filepath = filepath + 'x'
        ppt.SaveAs(filepath)
        os.system('TASKKILL /IM POWERPNT.EXE')
        #杀死Microsoft PowerPoint进程
        change_form = True
        #改变格式为pptx,记录布尔值
    else:
        change_form = False
    process_ppt(filepath,filepath[:-5] + '_'+translator.translate('已翻译', lang_src = 'zh-cn', lang_tgt = '%s'%language_list[combox_aim.get()]) + '.pptx')
    trans_button['state'] = NORMAL
    select_button['state'] = NORMAL
    combox_source['state'] = "readonly"
    combox_aim['state'] = "readonly"
    #传递输入与输出路径
def check_powerpoint():
    global check_pow
    powerpoint = win32com.client.Dispatch('PowerPoint.Application')
    if str(powerpoint) == 'Microsoft PowerPoint':
        check_pow = True
        #检测Microsoft PowerPoint是否存在于本机,输出布尔值
    else:
        None
if __name__ == '__main__':
    language_list = {'自动检测': 'auto', 'afrikaans': 'af', 'albanian': 'sq', 'amharic': 'am', '阿拉伯语': 'ar', 'armenian': 'hy', 'azerbaijani': 'az', 'basque': 'eu', 'belarusian': 'be', 'bengali': 'bn', 'bosnian': 'bs', 'bulgarian': 'bg', 'catalan': 'ca', 
'cebuano': 'ceb', 'chichewa': 'ny', '简体中文': 'zh-cn', '繁体中文': 'zh-tw', 'corsican': 'co', 'croatian': 'hr', 'czech': 'cs', 'danish': 'da', 'dutch': 'nl', '英语': 'en', 'esperanto': 'eo', 
'estonian': 'et', 'filipino': 'tl', 'finnish': 'fi', '法语': 'fr', 'frisian': 'fy', 'galician': 'gl', 'georgian': 'ka', '德语': 'de', 'greek': 'el', 'gujarati': 'gu', 'haitian creole': 'ht', 'hausa': 'ha', 'hawaiian': 'haw', 
'hebrew': 'he', 'hindi': 'hi', 'hmong': 'hmn', 'hungarian': 'hu', 'icelandic': 'is', 'igbo': 'ig', 'indonesian': 'id', 'irish': 'ga', '意大利语': 'it', '日语': 'ja', 'javanese': 'jw', 'kannada': 'kn', 
'kazakh': 'kk', 'khmer': 'km', 'korean': 'ko', 'kurdish (kurmanji)': 'ku', 'kyrgyz': 'ky', 'lao': 'lo', 'latin': 'la', 'latvian': 'lv', 'lithuanian': 'lt', 'luxembourgish': 'lb', 'macedonian': 'mk', 'malagasy': 'mg', 'malay': 'ms', 
'malayalam': 'ml', 'maltese': 'mt', 'maori': 'mi', 'marathi': 'mr', 'mongolian': 'mn', 'myanmar (burmese)': 'my', 'nepali': 'ne', 'norwegian': 'no', 'odia': 'or', 'pashto': 'ps', 'persian': 'fa', 'polish': 'pl', 'portuguese': 'pt', 
'punjabi': 'pa', 'romanian': 'ro', '俄语': 'ru', 'samoan': 'sm', 'scots gaelic': 'gd', 'serbian': 'sr', 'sesotho': 'st', 'shona': 'sn', 'sindhi': 'sd', 'sinhala': 'si', 'slovak': 'sk', 'slovenian': 'sl', 'somali': 'so', 
'西班牙语': 'es', 'sundanese': 'su', 'swahili': 'sw', 'swedish': 'sv', 'tajik': 'tg', 'tamil': 'ta', 'telugu': 'te', 'thai': 'th', 'turkish': 'tr', 'turkmen': 'tk', 'ukrainian': 'uk', 'urdu': 'ur', 'uyghur': 'ug', 'uzbek': 'uz', 
'vietnamese': 'vi', 'welsh': 'cy', 'xhosa': 'xh', 'yiddish': 'yi', 'yoruba': 'yo', 'zulu': 'zu'}
    file_path = ''
    check_pow = False
    change_form = False
    translator = google_translator() #定义translator
    check_powerpoint()
    main_screen = Tk() #创建主窗口
    main_screen.title('Microsoft Powerpoint自动翻译')
    main_screen.geometry("600x80+%d+%d" %((main_screen.winfo_screenwidth()-600)/2, (main_screen.winfo_screenheight()-60)/2.6178)) #主窗口水平方向居中,竖直方向处于屏幕黄金分割位
    main_screen.wm_attributes('-topmost', 1) #主窗口置顶
    main_screen.resizable(width = False, height = False) #主窗口大小不可变
    visual_path = StringVar()
    visual_path.set('未选择待翻译文件')
    path_lable = Label(master = main_screen, textvariable=visual_path)
    path_lable.place(x = 20 , y = 35)
    visual_process = StringVar()
    process_lable = Label(master = main_screen, textvariable=visual_process)
    process_lable.place(x=20,y=55)
    source_lable = Label(master = main_screen, text="源语言:")
    source_lable.place(x = 160, y = 0)
    aim_lable = Label(master = main_screen, text="目标语言:")
    aim_lable.place(x = 360, y = 0)
    select_button = Button(text = "选择文件", command=browse_button)
    select_button.place(x = 20, y = 0)
    trans_button = Button(text="翻译", command = translate_button)
    trans_button.place(x = 80, y = 0)
    source_value = StringVar()
    combox_source = ttk.Combobox(main_screen, textvariable = source_value, width = 17)
    combox_source["values"] = ('自动检测', '英语', '简体中文', '俄语', '德语', '法语', '日语', '阿拉伯语', '西班牙语', '意大利语', '繁体中文', 'afrikaans', 'albanian', 'amharic', 'armenian', 'azerbaijani', 'basque', 'belarusian', 'bengali', 
'bosnian', 'bulgarian', 'catalan', 'cebuano', 'chichewa', 'corsican', 'croatian', 'czech', 'danish', 'dutch', 'esperanto', 'estonian', 'filipino', 'finnish', 'frisian', 'galician', 'georgian', 'greek', 'gujarati', 'haitian creole', 
'hausa', 'hawaiian', 'hebrew', 'hindi', 'hmong', 'hungarian', 'icelandic', 'igbo', 'indonesian', 'irish', 'javanese', 'kannada', 'kazakh', 'khmer', 'korean', 'kurdish (kurmanji)', 'kyrgyz', 'lao', 'latin', 'latvian', 'lithuanian', 
'luxembourgish', 'macedonian', 'malagasy', 'malay', 'malayalam', 'maltese', 'maori', 'marathi', 'mongolian', 'myanmar (burmese)', 'nepali', 'norwegian', 'odia', 'pashto', 'persian', 'polish', 'portuguese', 'punjabi', 'romanian', 
'samoan', 'scots gaelic', 'serbian', 'sesotho', 'shona', 'sindhi', 'sinhala', 'slovak', 'slovenian', 'somali', 'sundanese', 'swahili', 'swedish', 'tajik', 'tamil', 'telugu', 'thai', 'turkish', 'turkmen', 'ukrainian', 'urdu', 
'uyghur', 'uzbek', 'vietnamese', 'welsh', 'xhosa', 'yiddish', 'yoruba', 'zulu')
    combox_source.current(0) #默认当前值为可选列表第一个
    combox_source.place(x=210,y =0)
    combox_source.configure(state="readonly") #下拉框只读
    aim_value = StringVar()
    combox_aim = ttk.Combobox(main_screen, textvariable=aim_value,width=17)
    combox_aim["values"] = ('简体中文', '繁体中文', '英语', '俄语', '德语', '法语', '日语', '阿拉伯语', '西班牙语', '意大利语', 'afrikaans', 'albanian', 'amharic', 'armenian', 'azerbaijani', 'basque', 'belarusian', 'bengali', 'bosnian', 
'bulgarian', 'catalan', 'cebuano', 'chichewa', 'corsican', 'croatian', 'czech', 'danish', 'dutch', 'esperanto', 'estonian', 'filipino', 'finnish', 'frisian', 'galician', 'georgian', 'greek', 'gujarati', 'haitian creole', 
'hausa', 'hawaiian', 'hebrew', 'hindi', 'hmong', 'hungarian', 'icelandic', 'igbo', 'indonesian', 'irish', 'javanese', 'kannada', 'kazakh', 'khmer', 'korean', 'kurdish (kurmanji)', 'kyrgyz', 'lao', 'latin', 'latvian', 'lithuanian', 
'luxembourgish', 'macedonian', 'malagasy', 'malay', 'malayalam', 'maltese', 'maori', 'marathi', 'mongolian', 'myanmar (burmese)', 'nepali', 'norwegian', 'odia', 'pashto', 'persian', 'polish', 'portuguese', 'punjabi', 'romanian', 
'samoan', 'scots gaelic', 'serbian', 'sesotho', 'shona', 'sindhi', 'sinhala', 'slovak', 'slovenian', 'somali', 'sundanese', 'swahili', 'swedish', 'tajik', 'tamil', 'telugu', 'thai', 'turkish', 'turkmen', 'ukrainian', 'urdu', 
'uyghur', 'uzbek', 'vietnamese', 'welsh', 'xhosa', 'yiddish', 'yoruba', 'zulu')
    combox_aim.current(0)
    combox_aim.place(x=422,y =0)
    combox_aim.configure(state="readonly")
    mainloop() #启动

以下是效果图:主界面如图所示,可以选择文件和翻译的语言 20210426164738.png

选择文件界面 202104261647381.png

选择语言使用下拉框实现 202104261647382.png
原ppt内容展示 202104261647385.png

翻译后内容展示 202104261647386.png
注1: 文字超出文字框是由于pptx模块即时显示对文字的自动调整(尝试过调用自带的自动调整模块,发现对中文并不友好)
此时只要把这页删掉再ctrl+z就可以看到已经自动调整大小的文字
注2: 由于模块调用不正经的谷歌翻译接口,过一段时间后有可能失效.我会进行更新
程序已上传蓝奏云:https://wwe.lanzouj.com/iXyPFoivwej
密码:f025
2021.10.12更新:
现在进度会显示在主界面内,并且等待的时候不会转圈圈让人看着难受;世界更加美好
微信图片_20211012161434.png
新版本下载链接:
https://wwe.lanzoui.com/iq4u5v95g7i 密码:ez7o
若有google_trans_new相关报错参见37楼老哥解决方法

免费评分

参与人数 12吾爱币 +16 热心值 +10 收起 理由
Sinaan + 1 热心回复!
mazh369 + 1 我很赞同!
pig_world_2008 + 1 + 1 已经处理,感谢您对吾爱破解论坛的支持!
梁祝a + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
877227206 + 1 鼓励转贴优秀软件安全工具和文档!
rby661lpy + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
秋风之兮 + 1 + 1 谢谢@Thanks!
zr2019 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
小懒虫丶 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
笙若 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
西瓜吃掉葡萄 + 1 + 1 谢谢@Thanks!
风之暇想 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

sheny777 发表于 2021-8-30 10:05
本帖最后由 sheny777 于 2021-8-30 16:26 编辑

大侠  报错了,该如何处理啊??
程序已成功启动
    raise e
  File "C:\Users\xxx\AppData\Local\Programs\Python\Python39\lib\site-packages\google_trans_new\google_trans_new.py", line 152, in translate
    response = json.loads(response)
  File "C:\Users\xxx\AppData\Local\Programs\Python\Python39\lib\json\__init__.py", line 346, in loads
    return _default_decoder.decode(s)
  File "C:\Users\xxx\AppData\Local\Programs\Python\Python39\lib\json\decoder.py", line 340, in decode
    raise JSONDecodeError("Extra data", s, end)
json.decoder.JSONDecodeError: Extra data: line 1 column 234 (char 233)


经过网上查找资料,发现是google的一个问题 ,需要修改google_trans_new.py 中152行内容
There is already an open [color=var(--theme-link-color)]git issue for this. The workaround for it is:
[color=var(--black-600)]Change line 151 in google_trans_new/google_trans_new.py which is: response = (decoded_line + ']') to response = decoded_line

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
当钟声敲响回忆 + 1 + 1 用心讨论,共获提升!

查看全部评分

qqoqqq 发表于 2022-1-17 10:51
还是报错


C:\Users\xubintai\anaconda3\python.exe "D:/002-python all/pythonProject3-ppt tanslator/main.py"
Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Users\xubintai\anaconda3\lib\threading.py", line 932, in _bootstrap_inner
    self.run()
  File "C:\Users\xubintai\anaconda3\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "D:/002-python all/pythonProject3-ppt tanslator/main.py", line 109, in change_format
    process_ppt(filepath,filepath[:-5] + '_'+translator.translate('已翻译', lang_src = 'zh-cn', lang_tgt = '%s'%language_list[combox_aim.get()]) + '.pptx')
  File "C:\Users\xubintai\anaconda3\lib\site-packages\google_trans_new\google_trans_new.py", line 188, in translate
    raise e
  File "C:\Users\xubintai\anaconda3\lib\site-packages\google_trans_new\google_trans_new.py", line 152, in translate
    response = json.loads(response)
  File "C:\Users\xubintai\anaconda3\lib\json\__init__.py", line 357, in loads
    return _default_decoder.decode(s)
  File "C:\Users\xubintai\anaconda3\lib\json\decoder.py", line 340, in decode
    raise JSONDecodeError("Extra data", s, end)
json.decoder.JSONDecodeError: Extra data: line 1 column 234 (char 233)
ygx0769 发表于 2021-4-27 06:53
17ae8wcq21 发表于 2021-4-27 09:17
谢谢分享
zr2019 发表于 2021-4-27 11:08
谢谢楼主分享!
thxyhuang 发表于 2021-4-27 11:14
请问这是什么错误
1.jpg
ysjd22 发表于 2021-4-27 11:55
好东西啊
qinaiguodong 发表于 2021-4-27 12:00
谢谢分享
ykxht 发表于 2021-4-27 12:42
谢谢楼主分享
jjddd001 发表于 2021-4-27 13:10
厉害了支持
头像被屏蔽
youximang 发表于 2021-4-27 13:22
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-28 03:04

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表