近期接手一个项目,需要在分屏投影的基础上需要实现播放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连接到PowerPointpowerpoint = 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 = Falsepresentation.SlideShowSettings.ShowWithAnimation = Trueself.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 = Falseself.log.info('Office 程序关闭')# 关闭PowerPoint应用程序powerpoint.Quit()def _wps_pptx(self, pptx_path: str):# 创建PowerPoint应用实例powerpoint = win32com.client.Dispatch("kwpp.Application")powerpoint.Visible = 1powerpoint.WindowState = 2# 打开PPT文件presentation = powerpoint.Presentations.Open(pptx_path)# 设置幻灯片放映属性presentation.SlideShowSettings.ShowWithNarration = Falsepresentation.SlideShowSettings.ShowWithAnimation = Trueself.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 = Falsepresentation.Close() # 0表示不保存powerpoint.Quit()"""手动设置幻灯片播放关闭is_showing:bool 幻灯片是否播放,True 播放 False 关闭"""def embed_powerpoint_close(self):self.is_showing = False
之前找遍了国内外的论坛,都只有编辑PPT的没找到怎么播放的,虽然这个方法不太好,不如直接做到界面上然后在界面直接显示好,但是也算是一个解决办法吧。 好啦,今日分享到此为止吧。