使用Python将Word文档中的图片提取并生成PowerPoint幻灯片

在这篇博客中,我们将学习如何使用Python将Word文档中的图片提取出来并生成一个PowerPoint幻灯片。我们将借助wxPython、python-docx和python-pptx这三个强大的库来实现这一目标。以下是实现这个功能的完整过程。
C:\pythoncode\new\wordTOppt.py

所需库

首先,我们需要安装以下Python库:

  • wxPython:用于创建图形用户界面(GUI)。
  • python-docx:用于处理Word文档。
  • python-pptx:用于生成PowerPoint幻灯片。

你可以通过以下命令安装这些库:

pip install wxPython python-docx python-pptx
创建GUI

我们将使用wxPython创建一个简单的GUI,让用户选择一个Word文档,并点击按钮来执行图片提取和PPT生成的过程。以下是实现这个功能的代码:

import wx
import os
import docx
from pptx import Presentation
from pptx.util import Inches, Ptclass MyFrame(wx.Frame):def __init__(self, parent, title):super(MyFrame, self).__init__(parent, title=title, size=(600, 300))self.panel = wx.Panel(self)self.create_widgets()def create_widgets(self):vbox = wx.BoxSizer(wx.VERTICAL)self.file_picker = wx.FilePickerCtrl(self.panel, message="选择 Word 文档", wildcard="Word files (*.docx)|*.docx")vbox.Add(self.file_picker, 0, wx.ALL | wx.EXPAND, 5)self.extract_button = wx.Button(self.panel, label="提取并生成幻灯片")self.extract_button.Bind(wx.EVT_BUTTON, self.on_extract)vbox.Add(self.extract_button, 0, wx.ALL | wx.EXPAND, 5)self.panel.SetSizer(vbox)def on_extract(self, event):word_file_path = self.file_picker.GetPath()if not os.path.exists(word_file_path):wx.MessageBox("文件未找到!", "错误", wx.OK | wx.ICON_ERROR)return# Create images directory to store extracted imagesimages_dir = os.path.join(os.path.dirname(word_file_path), 'images')if not os.path.exists(images_dir):os.makedirs(images_dir)# Extract images from Word documenttry:doc = docx.Document(word_file_path)for r_id, rel in doc.part.rels.items():if str(rel.target_ref).startswith('media') or str(rel.target_ref).startswith('embeddings'):file_suffix = str(rel.target_ref).split('.')[-1:][0].lower()if file_suffix not in ['png', 'jpg', 'jpeg', 'gif', 'bmp']:continuefile_name = r_id + '_' + str(rel.target_ref).replace('/', '_')file_path = os.path.join(images_dir, file_name)with open(file_path, "wb") as f:f.write(rel.target_part.blob)print('Extracted image:', file_name)except Exception as e:wx.MessageBox(f"Error extracting images: {str(e)}", "Error", wx.OK | wx.ICON_ERROR)return# Create PowerPoint presentation from extracted imagestry:ppt = Presentation()slide_width = ppt.slide_widthslide_height = ppt.slide_heightfor filename in os.listdir(images_dir):if filename.endswith((".png", ".jpg", ".jpeg", ".gif", ".bmp")):image_path = os.path.join(images_dir, filename)slide = ppt.slides.add_slide(ppt.slide_layouts[6])  # Use a blank slide layoutpicture = slide.shapes.add_picture(image_path, Inches(0), Inches(0), height=slide_height)# Scale and center the picturepicture_width = picture.widthpicture_height = picture.heightmax_picture_width = slide_width - Inches(1)max_picture_height = slide_height - Inches(1)scale_ratio = min(max_picture_width / picture_width, max_picture_height / picture_height)new_picture_width = int(picture_width * scale_ratio)new_picture_height = int(picture_height * scale_ratio)picture.left = (slide_width - new_picture_width) // 2picture.top = (slide_height - new_picture_height) // 2picture.width = new_picture_widthpicture.height = new_picture_heightppt_file_path = os.path.splitext(word_file_path)[0] + '.pptx'ppt.save(ppt_file_path)wx.MessageBox(f"幻灯片生成成功!PPT 已保存到 {ppt_file_path}", "成功", wx.OK | wx.ICON_INFORMATION)except Exception as e:wx.MessageBox(f"Error creating PPT: {str(e)}", "Error", wx.OK | wx.ICON_ERROR)if __name__ == '__main__':app = wx.App(False)frame = MyFrame(None, "Word to PPT Converter")frame.Show()app.MainLoop()

代码解析

初始化和创建GUI

我们首先创建了一个wxPython的框架(Frame),并在其中添加了一个面板(Panel)。然后,我们在面板上添加了文件选择器和按钮。

class MyFrame(wx.Frame):def __init__(self, parent, title):super(MyFrame, self).__init__(parent, title=title, size=(600, 300))self.panel = wx.Panel(self)self.create_widgets()
创建控件

我们使用了垂直布局(VBoxSizer),并在其中添加了文件选择器和按钮。

def create_widgets(self):vbox = wx.BoxSizer(wx.VERTICAL)self.file_picker = wx.FilePickerCtrl(self.panel, message="选择 Word 文档", wildcard="Word files (*.docx)|*.docx")vbox.Add(self.file_picker, 0, wx.ALL | wx.EXPAND, 5)self.extract_button = wx.Button(self.panel, label="提取并生成幻灯片")self.extract_button.Bind(wx.EVT_BUTTON, self.on_extract)vbox.Add(self.extract_button, 0, wx.ALL | wx.EXPAND, 5)self.panel.SetSizer(vbox)
提取图片

在用户选择Word文档并点击按钮后,我们提取其中的图片。我们遍历Word文档中的所有关系项,查找指向图片的关系,并将图片保存到 images 目录中。

def on_extract(self, event):word_file_path = self.file_picker.GetPath()if not os.path.exists(word_file_path):wx.MessageBox("文件未找到!", "错误", wx.OK | wx.ICON_ERROR)returnimages_dir = os.path.join(os.path.dirname(word_file_path), 'images')if not os.path.exists(images_dir):os.makedirs(images_dir)try:doc = docx.Document(word_file_path)for r_id, rel in doc.part.rels.items():if str(rel.target_ref).startswith('media'):file_suffix = str(rel.target_ref).split('.')[-1:][0].lower()if file_suffix not in ['png', 'jpg', 'jpeg', 'gif', 'bmp']:continuefile_name = r_id + '_' + str(rel.target_ref).replace('/', '_')file_path = os.path.join(images_dir, file_name)with open(file_path, "wb") as f:f.write(rel.target_part.blob)print('Extracted image:', file_name)except Exception as e:wx.MessageBox(f"Error extracting images: {str(e)}", "Error", wx.OK | wx.ICON_ERROR)return
创建PPT文档

我们使用 python-pptx 创建一个新的PPT文档,并将提取的图片插入到幻灯片中。每张图片占据一张幻灯片,并居中显示。

try:ppt = Presentation()slide_width = ppt.slide_widthslide_height = ppt.slide_heightfor filename in os.listdir(images_dir):if filename.endswith((".png", ".jpg", ".jpeg", ".gif", ".bmp")):image_path = os.path.join(images_dir, filename)slide = ppt.slides.add_slide(ppt.slide_layouts[6])  # Use a blank slide layoutpicture = slide.shapes.add_picture(image_path, Inches(0), Inches(0), height=slide_height)picture_width = picture.widthpicture_height = picture.heightmax_picture_width = slide_width - Inches(1)max_picture_height = slide_height - Inches(1)scale_ratio = min(max_picture_width / picture_width, max_picture_height / picture_height)new_picture_width = int(picture_width * scale_ratio)new_picture_height = int(picture_height * scale_ratio)picture.left = (slide_width - new_picture_width) // 2picture.top = (slide_height - new_picture_height) // 2picture.width = new_picture_widthpicture.height = new_picture_heightppt_file_path = os.path.splitext(word_file_path)[0] + '.pptx'ppt.save(ppt_file_path)wx.MessageBox(f"幻灯片生成成功!PPT 已保存到 {ppt_file_path}", "成功", wx.OK | wx.ICON_INFORMATION)
except Exception as e:wx.MessageBox(f"Error creating PPT: {str(e)}", "Error", wx.OK | wx.ICON_ERROR)

效果如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

通过本文,你已经学会了如何使用Python提取Word文档中的图片并生成一个包含这些图片的PowerPoint幻灯片。wxPython为我们提供了一个用户友好的界面,python-docx使我们能够轻松地处理Word文档,而python-pptx则让我们能够方便地创建和操作PPT文档。希望这篇博客能对你有所帮助!如果你有任何问题或建议,欢迎留言讨论。

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

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

相关文章

htb_FormulaX(XSS)

信息收集 常规信息收集 nmap -sV -sC 10.10.11.6开放22,80端口 gobuster dir -u http://10.10.11.6/ -w /usr/share/Seclists-master/Discovery/Web-Content/directory-list-2.3-medium.txt一无所获 80端口-web 注册账户 Chat Now 和 Contact Us是重点 Chat …

台湾省军事演习路径规划:A*算法在复杂地形中的应用

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣! 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航: LeetCode解锁100…

【全开源】分类记账小程序系统源码(ThinkPHP+FastAdmin+UniApp)

基于ThinkPHPFastAdminUniAppvk-uView-uiVue3.0开发的一款支持多人协作的记账本小程序,可用于家庭,团队,组织以及个人的日常收支情况记录,支持周月年度统计。 :智能管理您的财务生活 一、引言:财务智能化…

HTTP 错误 404.3 - Not Found 问题处理

问题描述 HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。 解决对策

如何网页在线编辑 Office word 文档,并支域功能:创建域/插入域/替换域等

在日常在线办公场景中,我们经常会遇到一些复杂的文档编辑需求,特别是我们经常会遇到一些复杂的数学公式,会用到“域”功能,“域”功能便是一个高级且实用的工具。通过设置域,用户可以实现文档的自动化处理,…

【QT实战】汇总导航

✨Welcome 大家好,欢迎来到瑾芳玉洁的博客! 😑励志开源分享诗和代码,三餐却无汤,顿顿都被噎。 😭有幸结识那个值得被认真、被珍惜、被捧在手掌心的女孩,不出意外被敷衍、被唾弃、被埋在了垃圾堆…

捕捉二氧化碳也能赚钱?深入探索CCUS技术与商业前景

引言 随着全球变暖和气候变化的加剧,如何有效减少二氧化碳(CO2)排放成为各国亟待解决的问题。近日,全球最大的二氧化碳捕集工厂在冰岛正式运营,这一消息引起了广泛关注。本文将深入探讨捕集二氧化碳技术(C…

跟TED演讲学英文:Bring on the learning revolution! by Sir Ken Robinson

Bring on the learning revolution! Link: https://www.ted.com/talks/sir_ken_robinson_bring_on_the_learning_revolution Speaker: Sir Ken Robinson Date: February 2010 文章目录 Bring on the learning revolution!IntroductionVocabularySummaryTranscriptAfterword I…

基于 BERT 对 IMDB 电影评论进行情感分类

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对…

# AI产品经理的自我修养:既懂用户,更懂技术!

今天上班的时候,发现很多AI社群都在讨论一篇播客《一个顶级AI产品经理的自我修养,对谈光年之外产品负责人Hidecloud》,这篇播客的嘉宾是光年之外的产品负责人——Hidecloud(张涛),聊了许多关于他在做AI产品…

MySQL多表关联查询习题

一、素材 -- Active: 1714203732007127.0.0.13306db_stu -- 1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); -- 创建…

【机器学习】机器学习基础概念与初步探索

❀机器学习 📒1. 引言📒2. 机器学习概述📒3. 机器学习基础概念🎉2.1 机器学习的分类🎉2.2 数据预处理🌈数据清洗与整合🌈 特征选择和特征工程🌈数据标准化与归一化 📒4. …

探数API统计分享-2017年-2021年中国各省人均消费支出统计

根据2017年至2021年的统计数据,我国各省(市、区)的人均消费支出情况各不相同。其中,上海的人均消费支出最高,达到了2021年的48879元,位居全国之首。紧随其后的是北京,人均消费支出为43640元。 …

类和对象(下篇)(未完结)!

文章目录 在谈构造函数1.构造函数体赋值2.初始化列表尽量使用初始化列表?初始化列表的初始化顺序?成员变量声明处的缺省值构造函数支持类型转换3.explicit关键字 static成员 在谈构造函数 1.构造函数体赋值 class Date{public:Date(int year, int mont…

其它高阶数据结构⑦_Skiplist跳表_概念+实现+对比

目录 1. Skiplist跳表的概念 2. Skiplist跳表的效率 3. Skiplist跳表的实现 3.1 力扣1206. 设计跳表 3.2 Skiplist的初始化和查找 3.3 Skiplist的增加和删除 3.4 Skiplist的源码和OJ测试 4. 跳表和平衡搜索树/哈希表的对比 本篇完。 1. Skiplist跳表的概念 skiplist是…

麻省理工出品!这个自动化神器让你的电脑自己工作

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

软件即服务-SaaS

目录 1. SaaS成熟度模型 2. SaaS应用平台 3. SaaS应用实现层次 4. 多租户技术 5. 可配置性 5.1 业务构件 5.2 数据可配置 5.2.1 定制字段 5.2.2 预分配字段 5.2.3 名称值对 5.3 功能可配置 5.3.1 业务构件设计 5.3.2 功能包设计 5.3.3 销售包设计…

16.线性回归代码实现

线性回归的实操与理解 介绍 线性回归是一种广泛应用的统计方法,用于建模一个或多个自变量(特征)与因变量(目标)之间的线性关系。在机器学习和数据科学中,线性回归是许多入门者的第一个模型,它…

A股重磅!史上最严减持新规,发布!

此次减持新规被市场视为A股史上最严、最全面的规则,“花式”减持通道被全面“封堵”。 5月24日晚间,证监会正式发布《上市公司股东减持股份管理暂行办法》(以下简称《减持管理办法》)及相关配套规则。 据了解,《减持…

工作学习的电脑定时关机,定时重启,定时提醒

可以直接下载工具: 定时自动关机 大家好,! 在我们学习与工作时,经常会遇到想要在完成一个任务后,再关闭电脑或对电脑重启,但这个时间点,操作电脑的人可能不能在电脑旁边,这样就需要…