近期接手一个项目,需要在分屏投影的基础上需要实现播放ppt文件的幻灯片操作,因为用户不想文件在客户端上传之后,共享给会议所有参与人时还要一个一个点开查看,同时大屏也没办法直接显示,所以需求这不就来了,需要在投影桌面所在的界面以幻灯片的形式打开相应的ppt文件。好了,废话不多说正文开始!
项目基本结构
没有,( * ^ ▽ ^ * ) 哈哈哈,没必要说这个,主要就是实现方法罢了!
方法代码
"""
封装的对外调用接口,只需要传入文件的本地绝对路径即可,
也可以自行修改为读取远程文件,不做过多阐述,可以自行百度实现
"""
def embed_powerpoint(self, pptx_path: str):
try:
self._embed_powerpoint(pptx_path)
# 也可以通过新的线程来执行,此处是因为我需要执行成功后返回状态确认,所以才使用阻塞
# threading.Thread(target=self._embed_powerpoint, args=(pptx_path,)).start()
return {'code': 200, 'result': True}
except Exception as ex:
self.log.error(f'打开pptx出现错误:{ex}')
if not self.is_showing:
return {'code': 404, 'result': False}
"""
对封装方法依次调用,按照Office-> Wps 的顺序找打开ppt文件的程序。
"""
def _embed_powerpoint(self, pptx_path: str):
try:
self._office_pptx(pptx_path)
except Exception as e:
self.log.info("无法连接到PowerPoint:", e)
# 尝试使用win32com连接到WPS Office的COM接口(如果知道的话)
self._wps_pptx(pptx_path)
self.log.info("连接到WPS Office成功")
def _office_pptx(self, pptx_path: str):
# 尝试使用win32com连接到PowerPoint
powerpoint = win32com.client.Dispatch("PowerPoint.Application")
self.log.info('开始打开界面')
# 创建PowerPoint应用实例 设置PowerPoint可见
powerpoint.Visible = 1
# 1 表示窗口模式 2 群屏模式
powerpoint.WindowState = 2
# 打开PPT文件
presentation = powerpoint.Presentations.Open(pptx_path)
# 设置幻灯片放映属性
presentation.SlideShowSettings.ShowWithNarration = False
presentation.SlideShowSettings.ShowWithAnimation = True
self.is_showing = True
# 运行幻灯片放映
presentation.SlideShowSettings.Run()
# 等待幻灯片放映结束
while powerpoint.SlideShowWindows.Count > 0 and self.is_showing:
time.sleep(1) # 每秒检查一次,避免CPU占用过高
if self.is_showing:
self.is_showing = False
self.log.info('Office 程序关闭')
# 关闭PowerPoint应用程序
powerpoint.Quit()
def _wps_pptx(self, pptx_path: str):
# 创建PowerPoint应用实例
powerpoint = win32com.client.Dispatch("kwpp.Application")
powerpoint.Visible = 1
powerpoint.WindowState = 2
# 打开PPT文件
presentation = powerpoint.Presentations.Open(pptx_path)
# 设置幻灯片放映属性
presentation.SlideShowSettings.ShowWithNarration = False
presentation.SlideShowSettings.ShowWithAnimation = True
self.is_showing = True
# 运行幻灯片放映
presentation.SlideShowSettings.Run()
# 等待幻灯片放映结束
while powerpoint.SlideShowWindows.Count > 0 and self.is_showing:
time.sleep(1) # 每秒检查一次,避免CPU占用过高
self.log.info('Wps 程序关闭')
self.is_showing = False
presentation.Close() # 0表示不保存
powerpoint.Quit()
"""
手动设置幻灯片播放关闭
is_showing:bool 幻灯片是否播放,True 播放 False 关闭
"""
def embed_powerpoint_close(self):
self.is_showing = False
之前找遍了国内外的论坛,都只有编辑PPT的没找到怎么播放的,虽然这个方法不太好,不如直接做到界面上然后在界面直接显示好,但是也算是一个解决办法吧。 好啦,今日分享到此为止吧。