使用Python开发PPTX压缩工具
引言
在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,不便于传输和存储。为了应对这一问题,我们可以使用Python的wxPython图形界面库结合python-pptx和Pillow,开发一个简单的PPTX压缩工具。本文将详细介绍如何实现这一功能。
C:\pythoncode\new\compresspptx.py
全部代码
import wx
import os
from pptx import Presentation
from PIL import Image
import ioclass CompressorFrame(wx.Frame):def __init__(self):super().__init__(parent=None, title='PPTX压缩工具')self.panel = wx.Panel(self)self.create_ui()def create_ui(self):vbox = wx.BoxSizer(wx.VERTICAL)# 文件选择部分hbox1 = wx.BoxSizer(wx.HORIZONTAL)self.file_path = wx.TextCtrl(self.panel, size=(300, -1))browse_btn = wx.Button(self.panel, label='选择文件')browse_btn.Bind(wx.EVT_BUTTON, self.on_browse)hbox1.Add(self.file_path, proportion=1, flag=wx.EXPAND|wx.ALL, border=5)hbox1.Add(browse_btn, flag=wx.ALL, border=5)# 压缩按钮compress_btn = wx.Button(self.panel, label='开始压缩')compress_btn.Bind(wx.EVT_BUTTON, self.on_compress)# 进度条self.progress = wx.Gauge(self.panel, range=100, size=(400, 25))# 状态文本self.status_text = wx.StaticText(self.panel, label="")vbox.Add(hbox1, flag=wx.EXPAND|wx.ALL, border=5)vbox.Add(compress_btn, flag=wx.ALIGN_CENTER|wx.ALL, border=5)vbox.Add(self.progress, flag=wx.EXPAND|wx.ALL, border=5)vbox.Add(self.status_text, flag=wx.EXPAND|wx.ALL, border=5)self.panel.SetSizer(vbox)self.Fit()def on_browse(self, event):with wx.FileDialog(self, "选择PPTX文件", wildcard="PowerPoint files (*.pptx)|*.pptx",style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog:if fileDialog.ShowModal() == wx.ID_CANCEL:returnpath = fileDialog.GetPath()path = os.path.normpath(path.strip('"'))self.file_path.SetValue(path)def update_status(self, text):wx.CallAfter(self.status_text.SetLabel, text)def on_compress(self, event):if not self.file_path.GetValue():wx.MessageBox('请先选择文件', '提示', wx.OK | wx.ICON_INFORMATION)returninput_path = self.file_path.GetValue().strip('"')input_path = os.path.normpath(input_path)if not os.path.exists(input_path):wx.MessageBox('文件不存在,请检查路径', '错误', wx.OK | wx.ICON_ERROR)returnoutput_path = self._get_output_path(input_path)try:self._compress_pptx(input_path, output_path)wx.MessageBox('压缩完成!\n保存路径:' + output_path, '成功', wx.OK | wx.ICON_INFORMATION)except Exception as e:wx.MessageBox(f'压缩过程中出错:{str(e)}', '错误', wx.OK | wx.ICON_ERROR)finally:self.progress.SetValue(0)self.update_status("")def _get_output_path(self, input_path):directory = os.path.dirname(input_path)filename = os.path.basename(input_path)name, ext = os.path.splitext(filename)return os.path.join(directory, f"{name}_compressed{ext}")def _compress_pptx(self, input_path, output_path):try:prs = Presentation(input_path)except Exception as e:raise Exception(f"无法打开PPTX文件: {str(e)}")total_slides = len(prs.slides)processed_images = 0skipped_images = 0for i, slide in enumerate(prs.slides):self.update_status(f"正在处理第 {i+1}/{total_slides} 张幻灯片")shapes_with_images = []for shape in slide.shapes:if hasattr(shape, "image"):shapes_with_images.append(shape)for shape in shapes_with_images:try:# 获取图片数据image_bytes = shape.image.blob# 使用PIL压缩图片with Image.open(io.BytesIO(image_bytes)) as img:# 转换RGBA为RGBif img.mode == 'RGBA':img = img.convert('RGB')# 压缩图片# 如果图片较大,调整尺寸max_size = 800 # 最大尺寸为1024像素if img.width > max_size or img.height > max_size:ratio = min(max_size/img.width, max_size/img.height)new_size = (int(img.width * ratio), int(img.height * ratio))img = img.resize(new_size, Image.LANCZOS)output_buffer = io.BytesIO()img.save(output_buffer, format='JPEG', quality=10, optimize=True)# 替换原图片shape._element.blip.embed.rId = shape._element.blip.embed.rIdnew_image = output_buffer.getvalue()# 更新图片数据image_part = shape.imageimage_part._blob = new_imageprocessed_images += 1except Exception as e:print(f"处理图片时出错: {str(e)}")skipped_images += 1continue# 更新进度条progress = int((i + 1) / total_slides * 100)wx.CallAfter(self.progress.SetValue, progress)self.update_status(f"完成!成功处理 {processed_images} 张图片,跳过 {skipped_images} 张图片")try:prs.save(output_path)except Exception as e:raise Exception(f"保存文件时出错: {str(e)}")def main():app = wx.App()frame = CompressorFrame()frame.Show()app.MainLoop()if __name__ == '__main__':main()
环境准备
在开始之前,我们需要安装以下Python库:
- wxPython:用于创建图形用户界面
- python-pptx:用于处理PPTX文件
- Pillow:用于图片压缩
安装命令:
pip install wxPython python-pptx Pillow
代码结构
代码主要包括以下几个部分:
- 图形界面设计
- 文件选择与压缩功能
- 图片压缩逻辑
代码实现
导入必要模块
import wx
import os
from pptx import Presentation
from PIL import Image
import io
创建主窗口
主窗口CompressorFrame继承自wx.Frame,用于展示UI组件。
class CompressorFrame(wx.Frame):def __init__(self):super().__init__(parent=None, title='PPTX压缩工具')self.panel = wx.Panel(self)self.create_ui()def create_ui(self):vbox = wx.BoxSizer(wx.VERTICAL)# 文件选择部分hbox1 = wx.BoxSizer(wx.HORIZONTAL)self.file_path = wx.TextCtrl(self.panel, size=(300, -1))browse_btn = wx.Button(self.panel, label='选择文件')browse_btn.Bind(wx.EVT_BUTTON, self.on_browse)hbox1.Add(self.file_path, proportion=1, flag=wx.EXPAND|wx.ALL, border=5)hbox1.Add(browse_btn, flag=wx.ALL, border=5)# 压缩按钮compress_btn = wx.Button(self.panel, label='开始压缩')compress_btn.Bind(wx.EVT_BUTTON, self.on_compress)# 进度条self.progress = wx.Gauge(self.panel, range=100, size=(400, 25))# 状态文本self.status_text = wx.StaticText(self.panel, label="")vbox.Add(hbox1, flag=wx.EXPAND|wx.ALL, border=5)vbox.Add(compress_btn, flag=wx.ALIGN_CENTER|wx.ALL, border=5)vbox.Add(self.progress, flag=wx.EXPAND|wx.ALL, border=5)vbox.Add(self.status_text, flag=wx.EXPAND|wx.ALL, border=5)self.panel.SetSizer(vbox)self.Fit()
文件选择功能
通过文件对话框让用户选择PPTX文件。
def on_browse(self, event):with wx.FileDialog(self, "选择PPTX文件", wildcard="PowerPoint files (*.pptx)|*.pptx",style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog:if fileDialog.ShowModal() == wx.ID_CANCEL:returnpath = fileDialog.GetPath()self.file_path.SetValue(os.path.normpath(path.strip('"')))
压缩功能实现
-
压缩图片逻辑:
- 使用Pillow库压缩PPT中的图片,将其转换为JPEG格式,并降低质量以减少文件大小。
- 限制图片的最大尺寸,保持图片的可视质量。
-
更新进度条与状态:
- 使用
wx.Gauge展示处理进度。 - 实时更新处理状态。
- 使用
def _compress_pptx(self, input_path, output_path):prs = Presentation(input_path)total_slides = len(prs.slides)processed_images = 0skipped_images = 0for i, slide in enumerate(prs.slides):self.update_status(f"正在处理第 {i+1}/{total_slides} 张幻灯片")shapes_with_images = [shape for shape in slide.shapes if hasattr(shape, "image")]for shape in shapes_with_images:try:image_bytes = shape.image.blobwith Image.open(io.BytesIO(image_bytes)) as img:if img.mode == 'RGBA':img = img.convert('RGB')max_size = 800if img.width > max_size or img.height > max_size:ratio = min(max_size/img.width, max_size/img.height)new_size = (int(img.width * ratio), int(img.height * ratio))img = img.resize(new_size, Image.LANCZOS)output_buffer = io.BytesIO()img.save(output_buffer, format='JPEG', quality=10, optimize=True)new_image = output_buffer.getvalue()shape.image._blob = new_imageprocessed_images += 1except Exception as e:print(f"处理图片时出错: {str(e)}")skipped_images += 1wx.CallAfter(self.progress.SetValue, int((i + 1) / total_slides * 100))self.update_status(f"完成!成功处理 {processed_images} 张图片,跳过 {skipped_images} 张图片")prs.save(output_path)
主函数
启动wxPython应用程序。
def main():app = wx.App()frame = CompressorFrame()frame.Show()app.MainLoop()if __name__ == '__main__':main()
运行结果

相关文章:
使用Python开发PPTX压缩工具
引言 在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,不便于传输和存储。为了应对这一问题,我们可以使用Python的wxPython图形界面库结合python-pptx和Pillow,开发一个简单的PPTX压缩工具。本文将详细介绍如何实现这一…...
ubuntu24.04安装布置ros
最近换电脑布置机器人环境,下了24.04,但是网上的都不太合适,于是自己试着布置好了,留作有需要的人一起看看。 文章目录 目录 前言 一、确认 ROS 发行版名称 二、检查你的 Ubuntu 版本 三、安装正确的 ROS 发行版 四、对于Ubuntu24…...
SQL 秒变 ER 图 sql转er图
🚀SQL 秒变 ER 图,校园小助手神了! 学数据库的宝子们集合🙋♀️ 是不是每次碰到 SQL 转 ER 图就头皮发麻?看着密密麻麻的代码,脑子直接死机,好不容易理清一点头绪,又被复杂的表关…...
【AI知识点】如何判断数据集是否噪声过大?
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】【AI应用】 判断数据集是否 噪声过大 是数据分析和机器学习建模过程中至关重要的一步。噪声数据会导致模型难以学习数据的真实模式,从而影响预测效果。以下是一些常见的方法来判断数据…...
网络安全治理架构图 网络安全管理架构
网站安全攻防战 XSS攻击 防御手段: - 消毒。 因为恶意脚本中有一些特殊字符,可以通过转义的方式来进行防范 - HttpOnly 对cookie添加httpOnly属性则脚本不能修改cookie。就能防止恶意脚本篡改cookie 注入攻击 SQL注入攻击需要攻击者对数据库结构有所…...
如何写出优秀的单元测试?
写出优秀的单元测试需要考虑以下几个方面: 1. 测试用例设计 测试用例应该覆盖被测试代码的不同场景和边界情况,以尽可能发现潜在的问题。在设计测试用例时需要关注以下几点: 输入输出数据:要测试的函数或方法可能有多个输入参数…...
数据留痕的方法
在项目中,数据变更时,经常需要记录上次的数据,以便查看对比,专业术语叫做数据留痕。数据变更留痕(即记录数据的变更历史)是一个常见的需求,例如在审计、追踪数据变化或满足合规性要求的场景中。…...
机器学习数学基础:19.线性相关与线性无关
一、线性相关与线性无关的定义 (一)线性相关 想象我们有一组向量,就好比是一群有着不同“力量”和“方向”的小伙伴。给定的向量组 α ⃗ 1 , α ⃗ 2 , ⋯ , α ⃗ m \vec{\alpha}_1, \vec{\alpha}_2, \cdots, \vec{\alpha}_m α 1,α 2…...
ArgoCD实战指南:GitOps驱动下的Kubernetes自动化部署与Helm/Kustomize集成
摘要 ArgoCD 是一种 GitOps 持续交付工具,专为 Kubernetes 设计。它能够自动同步 Git 仓库中的声明性配置,并将其应用到 Kubernetes 集群中。本文将介绍 ArgoCD 的架构、安装步骤,以及如何结合 Helm 和 Kustomize 进行 Kubernetes 自动化部署。 引言 为什么选择 ArgoCD?…...
JVM虚拟机以及跨平台原理
相信大家已经了解到Java具有跨平台的特性,即“一次编译,到处运行”,例如在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C很难做到的。 那么,跨平台是怎样实现的呢?这就要谈及…...
【AIGC提示词系统】基于 DeepSeek R1 + ClaudeAI 易经占卜系统
上篇因为是VIP,这篇来一个免费的 提示词在最下方,喜欢的点个关注吧 引言 在人工智能与传统文化交融的今天,如何让AI系统能够传递传统易经文化的智慧,同时保持易经本身的神秘感和权威性,是一个极具挑战性的课题。本文将…...
电路笔记 : opa 运放失调电压失调电流输入偏置电流 + 反向放大器的平衡电阻 R3 = R1 // R2 以减小输出直流噪声
目录 定义影响和解决失调电压输入偏置电流平衡电阻R3推导公式: 失调电流 实际的运算放大器(Op-Amp)存在一些非理想特性,如失调电压(VIO)、失调电流(IIO)和输入偏置电流(I…...
ScrapeGraphAI颠覆传统网络爬虫技术
ScrapeGraphAI颠覆传统网络爬虫技术! 引言 在互联网时代,数据如同油田,丰富而深邃。但如何有效地提取这些数据,仍然是许多开发者面临的艰巨任务。你有没有想过,传统的网络爬虫技术是否已经过时?如今&…...
通过多层混合MTL结构提升股票市场预测的准确性,R²最高为0.98
“Boosting the Accuracy of Stock Market Prediction via Multi-Layer Hybrid MTL Structure” 论文地址:https://arxiv.org/pdf/2501.09760 摘要 本研究引入了一种创新的多层次混合多任务学习架构,致力于提升股市预测的效能。此架构融…...
java将list转成树结构
首先是实体类 public class DwdCusPtlSelectDto {//idprivate String key;//值private String value;//中文名private String title;private List<DwdCusPtlSelectDto> children;private String parentId;public void addChild(DwdCusPtlSelectDto child) {if(this.chil…...
互联网分布式ID解决方案
业界实现方案 1. 基于UUID 2. 基于DB数据库多种模式(自增主键、segment) 3. 基于Redis 4. 基于ZK、ETCD 5. 基于SnowFlake 6. 美团Leaf(DB-Segment、zkSnowFlake) 7. 百度uid-generator() 基于UUID生成唯一ID UUID生成策略 推荐阅读 DDD领域驱动与微服务架构设计设计模…...
xinference 安装(http导致错误解决)
为什么要使用xinference 安装xinference 环境 1)conda create -n Xinference python3.11 注意:3.9 3.10均可能出现xinference 安装时候出现numpy兼容性,以及无法安装all版本 错误: error while attempting to bind on address&am…...
334递增的三元子序列贪心算法(思路解析+源码)
文章目录 题目思路解析源码总结题目 思路解析 有两种解法:解法一:动态规划(利用dp找到数组最长递增序列长度,判断是否大于3即可)本题不适用,因为时间复杂度为O(n^2),超时。 解法二:贪心算法:解法如上图,题目要求长度为三,设置第一个元素为长度1的值,是指长度二的…...
【Linux】29.Linux 多线程(3)
文章目录 8.4 生产者消费者模型8.4.1 为何要使用生产者消费者模型8.4.2 生产者消费者模型优点 8.5 基于BlockingQueue的生产者消费者模型8.5.1 C queue模拟阻塞队列的生产消费模型 8.6. 为什么pthread_cond_wait 需要互斥量?8.7 条件变量使用规范8.8 条件变量的封装8.9 POSIX信…...
利用UNIAPP实现短视频上下滑动播放功能
在 UniApp 中实现一个短视频上下滑动播放的功能,可以使用 swiper 组件来实现滑动效果,并结合 video 组件来播放短视频。以下是一个完整的示例,展示如何在 UniApp 中实现这一功能。 1. 创建 UniApp 项目 如果你还没有创建 UniApp 项目,可以使用 HBuilderX 创建一个新的项目…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
