昆山网页网站制作,wordpress发文章套模版,苏州网址制作公司,做博客的seo技巧引言
在日常办公中#xff0c;PPT文件往往因为图片过大而导致文件体积过大#xff0c;不便于传输和存储。为了应对这一问题#xff0c;我们可以使用Python的wxPython图形界面库结合python-pptx和Pillow#xff0c;开发一个简单的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__(parentNone, titlePPTX压缩工具)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, proportion1, flagwx.EXPAND|wx.ALL, border5)hbox1.Add(browse_btn, flagwx.ALL, border5)# 压缩按钮compress_btn wx.Button(self.panel, label开始压缩)compress_btn.Bind(wx.EVT_BUTTON, self.on_compress)# 进度条self.progress wx.Gauge(self.panel, range100, size(400, 25))# 状态文本self.status_text wx.StaticText(self.panel, label)vbox.Add(hbox1, flagwx.EXPAND|wx.ALL, border5)vbox.Add(compress_btn, flagwx.ALIGN_CENTER|wx.ALL, border5)vbox.Add(self.progress, flagwx.EXPAND|wx.ALL, border5)vbox.Add(self.status_text, flagwx.EXPAND|wx.ALL, border5)self.panel.SetSizer(vbox)self.Fit()def on_browse(self, event):with wx.FileDialog(self, 选择PPTX文件, wildcardPowerPoint files (*.pptx)|*.pptx,stylewx.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正在处理第 {i1}/{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, formatJPEG, quality10, optimizeTrue)# 替换原图片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__(parentNone, titlePPTX压缩工具)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, proportion1, flagwx.EXPAND|wx.ALL, border5)hbox1.Add(browse_btn, flagwx.ALL, border5)# 压缩按钮compress_btn wx.Button(self.panel, label开始压缩)compress_btn.Bind(wx.EVT_BUTTON, self.on_compress)# 进度条self.progress wx.Gauge(self.panel, range100, size(400, 25))# 状态文本self.status_text wx.StaticText(self.panel, label)vbox.Add(hbox1, flagwx.EXPAND|wx.ALL, border5)vbox.Add(compress_btn, flagwx.ALIGN_CENTER|wx.ALL, border5)vbox.Add(self.progress, flagwx.EXPAND|wx.ALL, border5)vbox.Add(self.status_text, flagwx.EXPAND|wx.ALL, border5)self.panel.SetSizer(vbox)self.Fit()文件选择功能
通过文件对话框让用户选择PPTX文件。
def on_browse(self, event):with wx.FileDialog(self, 选择PPTX文件, wildcardPowerPoint files (*.pptx)|*.pptx,stylewx.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正在处理第 {i1}/{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, formatJPEG, quality10, optimizeTrue)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()运行结果