python使用pywin32库将ppt导出为高清图片

news2024/11/19 3:48:21

python使用pywin32库将ppt导出为高清图片

作者:虚坏叔叔
博客:https://xuhss.com

早餐店不会开到晚上,想吃的人早就来了!😄

在这里插入图片描述

一、安装库

需要安装pywin32

pip install pywin32

二、代码原理

WPS高清图片导出需要会员,就为了一个这个小需求开一个会员太亏了,因此就使用pythonppt进行高清图片导出。

设置format=19即可:

ppt.SaveAs(imgs_path, 19) 

三、使用效果

输入一个文件路径

path = 'D:\\自动化\\课件.pptx'

最后的效果:

会在路径下创建一个‘’课件‘’文件夹

里面是所有转换后的图片

在这里插入图片描述

在这里插入图片描述

四、所有代码

完整代码如下:

# -*- coding: UTF-8 -*-  
import os
import sys
 
def get_all_ppts(path):
    # 获取所有 ppt 文件
    ppt_paths = []
    for root, _, files in os.walk(path):
        for f in files:
            suffix = os.path.splitext(f)[-1].lower()
            if 'ppt' in suffix:
                ppt_paths.append(os.path.join(root,f))
    return ppt_paths
 
class LinuxConverter():
    '''
        Linux 平台下转换工具
        借助 libreoffice 和 imagemagick
    '''
    def _run_cmd(self, cmd):
        try:
            os.system(cmd)
        except Exception as e:
            print('[ERROR] ', e)
            return False
        else:
            return True
 
    def _ppt_to_imgs(self, ppt_path):
        # ppt - pdf - jpg
        # libreoffice 多进程会卡死,后续优化
        cmd = 'libreoffice --headless --language=zh-CN '
        cmd += '--convert-to pdf {}>>/dev/null'.format(ppt_path)
        success = self._run_cmd(cmd)
        if not success:
            print('[ERROR] ppt2pdf: {}'.format(ppt_path))
            return success
        suffix = os.path.splitext(ppt_path)[-1]
        pdf_path = ppt_path.replace(suffix, 'pdf').split('/')[-1]
        success, _ = self._pdf_to_imgs(pdf_path)
        if not success:
            print('[ERROR] pdf2imgs: {}'.format(ppt_path))
        return success
 
    def _pdf_to_imgs(self, pdf_path):
        imgs_folder = os.path.splitext(pdf_path)[0]
        cmd = 'mkdir {}'.format(imgs_folder)
        success = self._run_cmd(cmd)
        if not success:
            print('[ERROR] mkdir: {}'.format(pdf_path))
            return success, ''
        cmd = 'convert {} {}/幻灯片%d.JPG'.format(pdf_path, imgs_folder)
        success = self._run_cmd(cmd)
        return success, imgs_folder
    
    def convert(self, ppts_path_list, total_count):
        error_count = 0
        success_count = 0
        for idx in range(total_count):
            ppt_path = ppts_path_list[idx]
            print('[ {}/{} ] {}'.format(idx+1, total_count, ppt_path))
            success, _ = self._ppt_to_imgs(ppt_path)
            if not success:
                error_count += 1
                continue
            success_count += 1
        return error_count, success_count
 
class WinConverter():
    '''
        Windows 平台下转换工具
        借助 office PowerPoint
    '''
    def __init__(self):
        try:
            # 必须以该形式导入 `from win32com import client` 会报错
            import win32com.client
        except ImportError:
            print('当前为windows平台,缺少 win32com 库,请执行 `pip install pywin32` 安装')
            exit(0)
        self._ppt_engine = win32com.client.Dispatch('PowerPoint.Application')
        self._ppt_engine.Visible = True
    
    def _ppt2jpg(self, ppt_path, imgs_path):
        ppt_path = os.path.abspath(ppt_path)
        imgs_path = os.path.abspath(imgs_path)
        try:
            ppt = self._ppt_engine.Presentations.Open(ppt_path)
            ppt.SaveAs(imgs_path, 18) # 17:jpg, 18:png, 19:bmp
            ppt.Close()
        except Exception as e:
            print('[ERROR] ppt2imgs: {}'.format(ppt_path))
            return False
        else:
            return True
 
    def convert(self, ppts_path_list, total_count):
        error_count = 0
        success_count = 0
        for idx in range(total_count):
            ppt_path = ppts_path_list[idx]
            print('[ {}/{} ] {}'.format(idx+1, total_count, ppt_path))
            suffix = os.path.splitext(ppt_path)[-1]
            imgs_path = ppt_path.replace(suffix,'.png')
            success = self._ppt2jpg(ppt_path, imgs_path)
            if not success:
                error_count += 1
                continue
            success_count += 1
        self._ppt_engine.Quit()
        return error_count, success_count
 
def convert_ppts_to_imgs(path):
    if os.path.isdir(path):
        ppts_path_list = get_all_ppts(path)
    elif os.path.isfile(path):
        ppts_path_list = [path]
    if not ppts_path_list:
        print('该路径下未找到 ppt 文件')
        exit(0)
    plat = sys.platform
    if 'linux' in plat:
        converter = LinuxConverter()
    elif 'win' in plat:
        converter = WinConverter()
    total_count = len(ppts_path_list)
    print('[BEGIN] 共 {} 个 ppt 文件'.format(total_count))
    error_count, success_count = converter.convert(ppts_path_list, total_count)
    print('[END] error:{} success:{}'.format(error_count, success_count))
 
if __name__ == '__main__':
    path = 'D:\\自动化\\课件.pptx'
    convert_ppts_to_imgs(path)

总结

最后的最后
由本人水平所限,难免有错误以及不足之处, 屏幕前的靓仔靓女们 如有发现,恳请指出!

最后,谢谢你看到这里,谢谢你认真对待我的努力,希望这篇博客对你有所帮助!

你轻轻地点了个赞,那将在我的心里世界增添一颗明亮而耀眼的星!

💬 往期优质文章分享

  • C++ QT结合FFmpeg实战开发视频播放器-01环境的安装和项目部署
  • 解决QT问题:运行qmake:Project ERROR: Cannot run compiler ‘cl‘. Output:
  • 解决安装QT后MSVC2015 64bit配置无编译器和调试器问题
  • Qt中的套件提示no complier set in kit和no debugger,出现黄色感叹号问题解决(MSVC2017)
  • Python+selenium 自动化 - 实现自动导入、上传外部文件(不弹出windows窗口)

🚀 优质教程分享 🚀

  • 🎄如果感觉文章看完了不过瘾,可以来我的其他 专栏 看一下哦~
  • 🎄比如以下几个专栏:Python实战微信订餐小程序、Python量化交易实战、C++ QT实战类项目 和 算法学习专栏
  • 🎄可以学习更多的关于C++/Python的相关内容哦!直接点击下面颜色字体就可以跳转啦!
学习路线指引(点击解锁)知识定位人群定位
🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战 💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统
❤️ C++ QT结合FFmpeg实战开发视频播放器❤️难度偏高分享学习QT成品的视频播放器源码,需要有扎实的C++知识!
💚 游戏爱好者九万人社区💚互助/吹水九万人游戏爱好者社区,聊天互助,白嫖奖品
💙 Python零基础到入门 💙Python初学者针对没有经过系统学习的小伙伴,核心目的就是让我们能够快速学习Python的知识以达到入门

🚀 资料白嫖,温馨提示 🚀

关注下面卡片即刻获取更多编程知识,包括各种语言学习资料,上千套PPT模板和各种游戏源码素材等等资料。更多内容可自行查看哦!

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/183774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Fisco Bcos区块链四(WeBase结点前置服务)

文章目录区块链开荒技术文档:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/index.html5、WeBASE节点前置服务1、前提条件2、拉取代码3. 编译代码4. 修改配置(1)进入dist目录(2)进入conf目录复制配置…

一些常见代码如from __future__ import ...的功能

1. 有一些代码在一开始会通过from __future__ import...导入模块。 __future__是什么? 随着python版本的升级,一些功能也会产生变化,__future__中包括了一些新版本的功能,通过导入__future__中的模块,可以在旧pyth…

IPSec

IPSec是网际层实现IP分组端到端安全传输的机制,由一组安全协议组成。 鉴别首部(Authentication Header,AH)和封装安全净荷(Encapsulating Security Payload,ESP)是其中两个协议,AH和…

如何云同步vscode的配置到码云(gitee)上

目录 🔥 写在前面 一、安装插件 二、创建Gist 👉 如何获取Gist ID 👉 如何进入代码片段管理页面 三、创建私人令牌 四、插件配置 五、插件使用 👉 上传配置 :命令为 upload setting 👉 下载配置 …

基于语义分割Ground Truth(GT)转换yolov5图像分割标签(路面积水检测例子)

基于语义分割Ground Truth(GT)转换yolov5图像分割标签(路面积水检测例子) 概述 随着开发者在issues中对 用yolov5做分割任务的呼声高涨,yolov5团队真的在帮开发者解决问题,v6.0版本之后推出了最新的解决方…

2、等价类划分

如何划分等价类 在给定了输入或外部条件之后&#xff0c;等价类的划分原则如下&#xff1a; 如果输入条件规定了一个取值范围&#xff08;例如&#xff0c;“数量可以是1到999”&#xff09;&#xff0c;那么就应确定出一个有效等价类&#xff08;1<数量<999&#xff0…

【大唐杯备考】——5G网络架构的演进趋势(学习笔记)

&#x1f4d6; 前言&#xff1a;本期介绍5G网络架构的演进趋势。 目录&#x1f552; 1. 5G网络架构概述&#x1f552; 2. 4G网络架构概述&#x1f552; 3. 核心网架构演进&#xff08;了解&#xff09;&#x1f558; 3.1 2G核心网&#x1f558; 3.2 3G、4G核心网&#x1f558; …

Golang - 如何编写Go代码

Golang - 如何编写Go代码 今天学习下如何在Go模块中开发一个简单的Package包&#xff0c;并介绍Go相关工具&#xff0c;以及如何获取、构建、安装模块等使用方法。本文中的案例需要使用Go 1.13及以上版本。 代码组织 Go程序以package包的形式组织&#xff0c;package包是同一…

Vue11-事件修饰符

结论&#xff1a;前三最常用 1.prevent 此时点击链接&#xff0c;除了会提示我是一个超链接信息外&#xff0c;a标签还会默认后进行链接跳转&#xff0c;此时为了阻止默认跳转事件&#xff0c;可以加prevent属性实现。此时只有弹框提示是信息&#xff0c;链接不会进行跳转 2.st…

Aqua Data Studio 22.1.x Crack

Aqua Data Studio 数据库 IDE 的优势 使用单一数据库工具管理大量数据源的多项任务 轻松开发、执行和共享 SQL 语句 通过复制和粘贴在类似 Excel 的网格中查看、过滤和编辑查询结果 创建可视化和仪表板以通过拖放来分析数据 比较架构、数据、查询结果、文件和文件夹 将数据库逆…

流量录制工具怎么选?看完这篇文章就懂了

流量录制&#xff1a;在不影响用户正常使用的前提下&#xff0c;获取线上用户的真实请求和服务响应结果&#xff0c;将其保存或者转发到目标应用。 采用不同的流量录制手段&#xff0c;可以采集不同传输阶段的流量。 01、流量复制方式 1、基于应用层的复制&#xff1a; 优点…

Linux串口调试助手

前言 基于网上资料对相关概念做整理汇总&#xff0c;部分内容引用自文后文章。 在linux下使用串口终端有两个选择&#xff1a; 基于命令行的minicom图形界面的putty&#xff08;xshell没有linux版本&#xff09;1 概述 1.1 Linux的串口设备 Linux下的串口和windows不同&…

移动web媒体查询

移动web媒体查询媒体查询媒体查询使用场景-1媒体查询使用场景-2媒体查询使用场景-3Bootstrap栅格系统row 类列偏移列嵌套移动web阶段重点知识媒体查询 使用媒体查询做响应式页面,为Bootstrap 做铺垫。 body {background-color: gray; }/* 大于等于768px 为粉色 */ media (min…

注意力提示

人类的注意力是有限的、有价值和稀缺的资源。 受试者使用非自主性和自主性提示有选择性地引导注意力。前者基于突出性&#xff0c;后者则依赖于意识。 注意力机制与全连接层或者汇聚层的区别源于增加的自主提示。 由于包含了自主性提示&#xff0c;注意力机制与全连接的层或…

MiG Calendar 6.9.3 for Java Crack

将日历功能添加到您的 Java 应用程序。 使用 MiG Calendar&#xff0c;您可以毫不费力地将任何类型的基于时间的可视化添加到您的应用程序中。您可以创建任何东西&#xff0c;从完整的日历应用程序&#xff08;如 Outlook 或 Apple 的 iCal&#xff09;到电视节目表或航班信息应…

居家办公 01 - 组网

# 第一步 - 安装虚拟机 vmbox安装&#xff1a;https://www.virtualbox.org/wiki/Downloads # 第二步 - 修改配置 1. 配置虚拟机网络 网卡1&#xff1a;Host-Only&#xff0c;仅主机与虚拟机网络互通 网卡2&#xff1a;NAT&#xff0c;虚拟机访问互联网 2. 配置虚拟机网络 v…

Lazada、速卖通、沃尔玛、eBay等跨境电商平台怎么做好测评自养号?

现在亚马逊平台不仅会将产品和店铺进行排名&#xff0c;还会将进listing行排名&#xff0c;不同的排名有不同的影响因素&#xff0c;接下来跟随大家一起去了解清楚亚马逊影响listing排名的因素是什么&#xff1f; 1、卖家权重 亚马逊卖家权重与亚马逊控制的卖家指标相关&…

大数据技术架构(组件)9——Hive:数学函数

1.4.2、数学函数注意&#xff1a;当传入值为NULL的时候&#xff0c;返回值大多数也是NULL1.4.2.1、abs作用&#xff1a;返回绝对值select abs(-1),abs(1);1.4.2.2、acos-->从Hive0.13.0作用&#xff1a;如果 -1<a<1 或 NULL&#xff0c;则返回 a 的反余弦值。select a…

[MySQL]-主从同步实战-系统OOM

[MySQL]-主从同步实战-系统OOM 森格 | 2023年1月 本文主要描述了在主从同步过程中&#xff0c;主库非人为重启导致的主从瞬间中断情况的排查及解决。 文章目录[MySQL]-主从同步实战-系统OOM一、问题发现1.1 背景1.2 问题发现二、问题分析2.1 MySQL日志2.2 系统日志三、问题解决…

DocuWare 文档管理软件在金融行业成功案例分享

DocuWare 文档管理软件在金融行业成功案例分享 公司&#xff1a;Advantage Credit, Inc. 国家&#xff1a;美国 行业&#xff1a;金融 部门&#xff1a;财务部门 、人力资源部门 、质量合规管理部门 部署方式&#xff1a;云 成效&#xff1a;信用报告业务从基于办公室的业务模…