用python将两个ppt每一页交叉合在一起
需求说明
因为这学期给中外合作的班级当助教,需要中英文的ppt。但是手里只有英文的,就得把中文转成英文的,然后再改。刚开始几个人一块弄,我觉得还行,一章ppt一百多页,一个人改个几十页还可以接受。后来只有我一个人,直到我看了网络层这章的ppt,336页,差点当场趋势。还来整合了一下网上的代码片段,写了这部分代码。
这个代码是将中文ppt和英文ppt交叉放到一个ppt里。第一张是中文,第二张是英文翻译。贡献给有这种奇葩需求的人。
代码写的差了点,但能正常使用。
代码部分
# -*- coding = UTF-8 -*-
import pptx
import win32com
import win32com.client
import time
ppt1 = r"C:\Users\60385\Desktop\ppt.pptx" # 中文的ppt
ppt2 = r"C:\Users\60385\Desktop\ppt_en.pptx" # 英文的ppt
sum_ppt = r"C:\Users\60385\Desktop\sum.pptx" # 合在一起的ppt。需先创建文件
temp1_ppt = r"C:\Users\60385\Desktop\temp1.pptx"
temp2_ppt = r"C:\Users\60385\Desktop\temp2.pptx"
def save_fe(prs, from_index, end_index, save_path):
slides = prs.slides
number_pages = len(slides)
# 切去之前的页面
for i in range(from_index - 1):
rId = prs.slides._sldIdLst[0].rId
prs.part.drop_rel(rId)
del prs.slides._sldIdLst[0]
# 切去之后的页面
for j in range(number_pages - end_index):
rId = prs.slides._sldIdLst[-1].rId
prs.part.drop_rel(rId)
del prs.slides._sldIdLst[-1]
prs.save(save_path)
for i in range(1, 197): # 交叉存放的页码
prs1 = pptx.Presentation(ppt1)
save_fe(prs1, i, i, temp1_ppt)
prs2 = pptx.Presentation(ppt2)
save_fe(prs2, i, i, temp2_ppt)
App = win32com.client.gencache.EnsureDispatch('PowerPoint.Application')
App.Visible = 1 # 后台运行
App.DisplayAlerts = 0
ppt_sum = App.Presentations.Open(sum_ppt)
ppt_temp1 = App.Presentations.Open(temp1_ppt)
ppt_temp2 = App.Presentations.Open(temp2_ppt)
for j in range(1, 2):
ppt_temp1.Slides(j).Copy()
ppt_sum.Slides.Paste()
ppt_temp2.Slides(j).Copy()
ppt_sum.Slides.Paste()
ppt_temp1.Close()
ppt_temp2.Close()
ppt_sum.SaveAs(sum_ppt)
ppt_sum.Close()
App.Quit()
代码报错
我在第二次跑的时候会出现如下的报错。
AttributeError: module 'win32com.gen_py.00020813-0000-0000-C000-000000000046x0x1x9' has no attribute 'CLSIDToClassMap'
需要进到如下的文件夹将类似于91493440-5A91-11CF-8700-00AA0060263Bx0x2x12这个的缓存文件删除掉,再重新运行。
C:\Users\60385\AppData\Local\Temp\gen_py\3.8
我是看到了下面这个大佬的文章改的报错。
>【python】PPT转PDF(同一目录下批量)