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

news2024/11/18 9:43:47

在这篇博客中,我们将学习如何使用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, Pt

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()

    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 images
        images_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 document
        try:
            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']:
                        continue
                    file_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 images
        try:
            ppt = Presentation()
            slide_width = ppt.slide_width
            slide_height = ppt.slide_height
            for 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 layout
                    picture = slide.shapes.add_picture(image_path, Inches(0), Inches(0), height=slide_height)
                    
                    # Scale and center the picture
                    picture_width = picture.width
                    picture_height = picture.height
                    max_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) // 2
                    picture.top = (slide_height - new_picture_height) // 2
                    picture.width = new_picture_width
                    picture.height = new_picture_height

            ppt_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)
        return

    images_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']:
                    continue
                file_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_width
    slide_height = ppt.slide_height
    for 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 layout
            picture = slide.shapes.add_picture(image_path, Inches(0), Inches(0), height=slide_height)
            
            picture_width = picture.width
            picture_height = picture.height
            max_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) // 2
            picture.top = (slide_height - new_picture_height) // 2
            picture.width = new_picture_width
            picture.height = new_picture_height

    ppt_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.coloradmin.cn/o/1692561.html

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

相关文章

8.继承和多态

继承 为什么需要继承 Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是现实世界错综复杂,事物之间可能会存在一些关联 比如:狗和猫 它们都是一个动物 代码举例…

文件系统--软硬链接

文章目录 现象软链接硬链接 现象 建立软链接 建立硬链接 // 删除软硬链接都可以用 unlink 指令 unlink soft-link软链接 软链接是一个独立的文件,因为有独立的inode number 软链接的内容:目标文件所对应的路劲字符串如果我们直接查看软链接文件&#…

在matlab里面计算一组给定参数的方程的解

如: k (1:1024); f (x)(1-x-k.*x.^2); 在这段代码给出了一组函数,若需要计算f0,可以通过自带的函数实现: x0 zeros(length(k),1); options optimoptions(fsolve,Display,none,TolX,tol,TolFun,tol); tic for ik 1:length…

BERT ner 微调参数的选择

针对批大小和学习率的组合进行收敛速度测试,结论: 相同轮数的条件下,batchsize-32 相比 batchsize-256 的迭代步数越多,收敛更快批越大的话,学习率可以相对设得大一点 画图代码(deepseek生成)…

aws glue配置读取本地kafka数据源

创建连接时填写本地私有ip地址,选择网络配置 配置任务选择kafka作为数据源 但是执行任务时日志显示连接失败 文档提到只能用加密通信 如果您希望与 Kafka 数据源建立安全连接,请选择 Require SSL connection (需要 SSL 连接),并在 Kafka priv…

Nginx - 集成ModSecurity实现WAF功能

文章目录 Pre概述什么是ModSecurity?ModSecurity的工作原理主要功能和特点使用场景与其他安全解决方案的比较 ModSecurity在Nginx中的应用安装ModSecurity配置ModSecurity Pre Nginx - 集成Waf 功能 概述 ModSecurity是一款开源的Web应用防火墙(WAF&a…

Java反射角度理解spring

概述 Java反射(Reflection)是Java编程语言的一个特性,它允许在运行时对类、接口、字段和方法进行动态查询和操作。反射提供了一种在运行时查看和修改程序行为的能力,这通常用于实现一些高级功能,如框架(Spring)、ORM&…

考研计组chap1计算机系统概述

目录 一、计算机发展历程(不考了) 二、计算机硬件的基本组成 3 1.五个部分 (1)输入设备 (2)控制器 (3)运算器 (4)(主)存储器 (5&#xff0…

探索Python技巧:零基础学习缩进与逻辑关系

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、理解Python的缩进语法 缩进规则详解 二、缩进在逻辑关系中的应用 逻辑块示例 三、实…

Leecode热题100---55:跳跃游戏(贪心算法)

题目: 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 贪心算…

从机械尘埃到智能星河:探索从工业心脏到AI大脑的世纪跨越(一点个人感想)...

全文预计1400字左右,预计阅读需要8分钟。 近期,人工智能领域呈现出前所未有的活跃景象,各类创新成果如雨后春笋般涌现,不仅推动了科技的边界,也为全球经济注入了新的活力。 这不,最近报道16家国内外企业在A…

操作系统实验四:多线程与信号量编程

操作系统实验上机 更多技术请访问:www.xuanworld.top 部分审核不通过的文章将发至个人博客:www.xuanworld.top 欢迎来52破解论坛阅读帖子:https://www.52pojie.cn/thread-1891208-1-1.html 实验名称实验序号实验日期实验人多线程与信号量…

2024年电工杯数学建模竞赛A题完整解析 | 代码 论文分享

A 题 问题一1.1问题分析1.2第一问1.2.1指标定义1.2.2结果计算1.2.3关键因素分析 1.3第二问1.3.1模型建立1.3.2算法求解1.3.3求解结果 1.4第三问1.4.1模型建立1.4.2计算结果 第二题2.1 问题分析2.2第一问2.2.1指标计算 数据与代码代码分享完整资料 A题的问题一和问题二终于完成啦…

React useState基本类型变量的使用

在 React 中,useState 是一个 Hook,用于在函数组件中添加状态,它可以让函数组件拥有状态。基本使用方法如下: // App.jsx import React, { useState } from reactfunction App() {// 使用 useState 创建一个状态变量,初…

vulhub——ActiveMQ漏洞

文章目录 一、CVE-2015-5254(反序列化漏洞)二、CVE-2016-3088(任意文件写入漏洞)2.1 漏洞原理2.2 写入webshell2.3 写入crontab 三、CVE-2022-41678(远程代码执行漏洞)方法一方法2 四、CVE-2023-46604(反序列化命令执行…

状压dp 例题

终于在洛谷上发布题解了QWQ P10447 最短 Hamilton 路径 题解 分析题目: 一张 n n n 个点的带权无向图,求起点 0 0 0 至终点 n − 1 n-1 n−1 的最短 Hamilton 路径(从 0 ∼ n − 1 0\sim n-1 0∼n−1 不重复地经过每个点一次&#xff…

springboot2+mybatis-plus+vue3创建入门小项目[学生管理系统]02[实战篇]

创建一个 vue 项目 创建这个新的文件夹 创建前端项目 eggbox 数据库 SQL CREATE DATABASE IF NOT EXISTS egg DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; USE egg;CREATE TABLE stu (id INT AUTO_INCREMENT, -- 自增主键name VARCHAR(64) NOT NULL, -- 非空姓名字段&a…

DataGear 制作服务端分页的数据可视化看板

DataGear 2.3.0 版本新增了附件图表数据集特性(在新建图表时将关联的数据集设置为 附件 ,具体参考官网文档定义图表章节),在制作看板时,可以基于此特性,结合dg-chart-listener,利用服务端数据扩…

HTTP 请求的完整过程

HTTP 请求的完整过程 当用户在浏览器输入网址回车之后,网络协议都做了哪些工作呢? 首先工作的是 浏览器应用程序,他要解析出 URL中的域名 根据域名获取对应的ip地址,首先从浏览器缓存中査看,如下可以査看浏览器中域名对应ip的解…

WPF中MVVM架构学习笔记

MVVM架构是一种基于数据驱动的软件开发架构,它将数据模型(Model)、视图(View)和视图模型(ViewModel)三者进行分离,使得开发者可以更加专注于各自领域的开发。其中,Model负…