当前位置: 首页 > news >正文

Python-pptx教程之二操作已有PPT模板文件

文章目录

  • 简单的案例
    • 找到要修改的元素
    • 修改幻灯片中的文本
      • 代码
      • 使用示例
    • 修改幻灯片的图片
      • 代码
      • 使用示例
    • 删除幻灯片
      • 代码
      • 使用示例
  • 获取PPT中所有的文本内容
  • 获取PPT中所有的图片
  • 总结

在上一篇中我们已经学会了如何从零开始生成PPT文件,从零开始生成较为复杂的PPT是非常消耗精力的一件事,各种shape位置的摆放坐标填写过于繁琐,而且很多样式诸如添加入场动画、特殊字体指定等功能,原有的python-pptx框架并不支持

所以这一篇来了解如何修改一个已经设计好的PPT模板文件

简单的案例

我们先通过一个简单的案例来讲解基本的PPT操作
这里已经设计好了一张奖状样式的PPT模板,只需要修改特定的文字,这种重复劳动交给python-pptx就好
PPT模板如下
在这里插入图片描述
修改单张幻灯片

prs = Presentation('G:/simple_ppt/奖状模板.pptx')
slide_index = 0
slide = prs.slides[slide_index]
for shape in slide.shapes:print("shape=", shape.name)if shape.name == 'student_name':shape.text = '孙悟空'if shape.name == 'student_school':shape.text = '花果山水帘洞'if shape.name == 'cert_date':current_date = datetime.now()date_string = current_date.strftime("%Y年%m月%d日")shape.text = date_stringsave_ppt = "G:/simple_ppt/test/blog_test_template.pptx"
prs.save(save_ppt)

执行后的效果
在这里插入图片描述
可以发现原来的占位内容已经被替换为我们指定的文本内容了

找到要修改的元素

要修改幻灯片中的内容,那么首先就需要找到对应的shape控件,大多数方案是根据匹配字符串内容来查找,但这样的方案无法满足图片、视频等的查找,还可能出现字符串冲突,所以推荐使用“选择窗格”里的ID来查找
上面代码中的“student_name”、“student_school”、“cert_date”就是占位符,用来定位要修改内容的地方,相当于一个唯一标识
那么如何设置shape的ID呢?
以WPS为例,打开选择窗格的方式:点击开始 -> 选择 -> 选择窗格,如下所示
在这里插入图片描述

此时就会在右侧栏目中出现选择窗格,显示当前幻灯片中所有对象元素的ID,点击对应对象ID即可进行修改
在这里插入图片描述

在代码中,通过shape.name进行匹配查找,即可找到我们需要的shape

修改幻灯片中的文本

代码

上面例子中是通过shape.text的方式来修改文本的,但这种方法有一个弊端,就是PPT中原有的文本框格式被擦除,所以这里推荐使用run文本段的方式修改文本

def replace_text(shape, content):if not shape.has_text_frame:    # 判断是否有文本框returntf = shape.text_framefor paragraph in tf.paragraphs:is_first_run = Truefor run in paragraph.runs:if is_first_run:run.text = contentis_first_run = Falseelse:run.text = ''

这个方法传入一个shape和文本内容,再通过has_text_frame判断shape中是否存在文本框,存在则进行更改文本操作,同时规避了有的文本框中存在多个词组run的问题,一个文本框中若存在多个词组,只需修改第一个词组即可,后续词组置空

使用示例

修改上例中的代码,使用replace_text方法修改文本

prs = Presentation('G:/simple_ppt/奖状模板.pptx')
slide_index = 0
slide = prs.slides[slide_index]
for shape in slide.shapes:print("shape=", shape.name)if shape.name == 'student_name':replace_text(shape, '孙悟空')if shape.name == 'student_school':replace_text(shape, '花果山水帘洞')if shape.name == 'cert_date':current_date = datetime.now()date_string = current_date.strftime("%Y年%m月%d日")replace_text(shape, date_string)save_ppt = "G:/simple_ppt/test/blog_test_template.pptx"
prs.save(save_ppt)

生成的效果如下
在这里插入图片描述
可以很明显的看到时间那一栏已经和原始的模板字体效果一模一样了

修改幻灯片的图片

代码

通过以下代码可以替换幻灯片中的图片

def replace_picture(shape, slide, slide_index, img_path):sp_tree = slide.shapes._spTreesp_tree.remove(shape._element)new_shape = slide.shapes.add_picture(img_path, shape.left, shape.top, shape.width, shape.height)sp_tree.insert(slide_index, new_shape._element)

代码中通过删除原有shape中的图片,然后添加一个和原有shape大小位置一样的shape来指定图片,最后通过insert将新图片的shape元素插入到老图片shape的元素中,这样做是为了防止新添加的图片破坏层级关系,导致新添加的图片覆盖掉幻灯片中原来的元素

使用示例

比如我们想替换掉背景,可以先给模板中的背景图片指定ID为“slide_bg”,然后调用replace_picture方法,注意slide_index是当前要操作的幻灯片索引

if shape.name == 'slide_bg':img_path = 'G:/simple_ppt/res/picture_bg.png'replace_picture(shape, slide, slide_index, img_path)

效果如下
在这里插入图片描述

删除幻灯片

代码

通过以下代码可以删除一张幻灯片

def delete_slide(prs, slide_index):slides = list(prs.slides._sldIdLst)prs.slides._sldIdLst.remove(slides[slide_index])

传入一个Presentation对象和指定第几张幻灯片,第一张索引从0开始

使用示例

prs = Presentation('G:/simple_ppt/奖状模板.pptx')
delete_slide(prs, 0)	# 删除第一张幻灯片
save_ppt = "G:/simple_ppt/test/blog_test_template.pptx"
prs.save(save_ppt)

注意事项:删除幻灯片之后再通过add的方式添加幻灯片会报错,因为原有的幻灯片列表总数已经改变,所以删除幻灯片的操作最好是在pptx文件中所有其它操作都做完了再进行

获取PPT中所有的文本内容

有时候我们想取出PPT中所有的文本内容,比如一些教学课件类的PPT,里面的内容要一个一个手动拷贝可就太麻烦了,这个也可以交给python-pptx来做
通过以下代码,指定要读取的pptx文件路径,打印ppt中含有的所有文本

prs = Presentation('G:/simple_ppt/test/blog_test_template.pptx')
text_content = []
for slide in prs.slides:for shape in slide.shapes:if not shape.has_text_frame:continuefor paragraph in shape.text_frame.paragraphs:for run in paragraph.runs:text_content.append(run.text)
print("全部文字:", text_content)

得到的结果

全部文字: ['在2023-2024学年度第二学期期末考试中成绩优异,特发此状,以资鼓励。', '同学', ':', '学校', '2023年11月16日', '', '', '', '孙悟空', '花果山水帘洞']

获取PPT中所有的图片

通过python-pptx也可以获取PPT中全部的图片,通过与获取全部文本同样的遍历方法,找到所有图片类型的shape
可以通过shape.shape_type来判断当前的shape是否是图片类型
获取PPT中全部图片的代码

from pptx.enum.shapes import MSO_SHAPE_TYPEprs = Presentation('G:/simple_ppt/test/blog_test_template.pptx')
save_dir = 'G:/simple_ppt/test/images'
for slide_no, slide in enumerate(prs.slides):for shape_no, shape in enumerate(slide.shapes):if shape.shape_type == MSO_SHAPE_TYPE.PICTURE: # 查找图片类型image = shape.imageimage_bytes = image.blobimage_filename = f"{save_dir}/slide_{slide_no}_image_{shape_no}.png"with open(image_filename, "wb") as img_file:img_file.write(image_bytes)

上面的代码中,将会把PPT中所有图片保存到save_dir目录下
在这里插入图片描述

由于我们的模板文件中只有一张图片,所有获取到的也就是一张
这里还有另一个方法,如果只是想单纯的获取一个PPT文件的图片,可以将文件的.pptx后缀改成.zip,然后解压,找到\ppt\media目录,里面就是所有的图片文件

总结

通过阅读本篇文章,可以掌握如何通过ID找到对应的shape控件,了解了如何正确的修改幻灯片中的文本内容和图片资源,以及操作删除幻灯片的方法,还掌握了如何方便的取出PPT文件中所有的文本内容和图片资源
至此,通过python-pptx框架从零开始生成PPT和操作已有PPT的功能都已介绍完毕,后续文章将介绍使用python-pptx来做一些框架本身没有提供API进行支持的功能该如何实现

相关文章:

Python-pptx教程之二操作已有PPT模板文件

文章目录 简单的案例找到要修改的元素修改幻灯片中的文本代码使用示例 修改幻灯片的图片代码使用示例 删除幻灯片代码使用示例 获取PPT中所有的文本内容获取PPT中所有的图片总结 在上一篇中我们已经学会了如何从零开始生成PPT文件,从零开始生成较为复杂的PPT是非常消…...

生活总是自己的,请尽情打扮,尽情可爱,,

同色系拼接羽绒服了解一下 穿上时尚感一下子就突显出来了 90白鸭绒填充,不仅时尚还保暖 设计感满满的羽绒服不考虑一下吗?...

栈和队列的初始化,插入,删除,销毁。

目录 题外话 顺序表和链表优缺点以及特点 一.栈的特点 二. 栈的操作 2.1初始化 2.2 栈的销毁 2.3 栈的插入 2.3 输出top 2.4 栈的删除 2.5 输出栈 题外话 顺序表和链表优缺点以及特点 特点:顺序表,逻辑地址物理地址。可以任意访问&#xff0c…...

重温《Unix设计哲学》

重温Unix设计哲学 这个世界是复杂的,但往往本质的东西都是简单的。这些原则,不光是用在程序开发,也适用于架构设计,产品设计等等地方。 简洁原则:以简洁为美 不要为了满足自己的虚荣心,企图搞一些花哨的东…...

AIGC创作系统ChatGPT源码,AI绘画源码,支持最新GPT-4-Turbo模型,支持DALL-E3文生图

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…...

Spring条件注解@Conditoinal+ Profile环境切换应用@Profile

Spring条件注解 一、创建一个maven项目 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.5.RELEASE</version></dependency> </dependenc…...

Scrum框架中的Sprint

上图就是sprint里要做的事。Sprint是scrum框架的核心&#xff0c;是所有的想法、主意转换为价值的地方。所有实现产品目标的必要工作都在sprint里完成&#xff0c;这些工作主要包括Sprint 计划&#xff08;Sprint planning&#xff09;、每日站会&#xff08;Daily Scrum&#…...

openfeign、nacos获取接口提供方真实IP

源码分析 client 是 LoadBalancerFeignClient org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient#execute public Response execute(Request request, Request.Options options) throws IOException {try {URI asUri URI.create(request.url());String c…...

Linux系统编程学习 NO.9——git、gdb

前言 本篇文章简单介绍了Linux操作系统中两个实用的开发工具git版本控制器和gdb调试器。 git 什么是git&#xff1f; git是一款开源的分布式版本控制软件。它不仅具有网络功能&#xff0c;还是服务端与客户端一体的软件。它可以高效的处理程序项目中的版本管理。它是Linux内…...

【联邦学习+区块链】TORR: A Lightweight Blockchain for Decentralized Federated Learning

文章目录 I.CONTRIBUTIONII. ASSUMPTIONS AND THREAT MODELA. AssumptionsB. Threat Model III. SYSTEM DESIGNA. Design OverviewB. Block DesignC. InitializationD. Role SelectionE. Storage ProtocolF. Aggregation ProtocolG. Proof of ReliabilityH. Blockchain Consens…...

《网络协议》08. 概念补充

title: 《网络协议》08. 概念补充 date: 2022-10-06 18:33:04 updated: 2023-11-17 10:35:52 categories: 学习记录&#xff1a;网络协议 excerpt: 代理、VPN、CDN、网络爬虫、无线网络、缓存、Cookie & Session、RESTful。 comments: false tags: top_image: /images/back…...

利用NVIDIA DALI读取视频帧

1. NVIDIA DALI简介 NVIDIA DALI全称是NVIDIA Data Loading Library&#xff0c;是一个用GPU加速的数据加载和预处理库&#xff0c;可用于图像、视频和语音数据的加载和处理&#xff0c;从而为深度学习的训练和推理加速。 NVIDIA DALI库的出发点是&#xff0c;深度学习应用中…...

TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

【算法每日一练]-图论(保姆级教程 篇5(LCA,最短路,分层图)) #LCA #最短路计数 #社交网络 #飞行路线 # 第二短路

今天讲最短路统计和分层图 目录 题目&#xff1a;LCA 思路&#xff1a; 题目&#xff1a;最短路计数 思路&#xff1a; 题目&#xff1a;社交网络 思路&#xff1a; 题目&#xff1a;飞行路线 思路&#xff1a; 题目&#xff1a;第二短路 思路&#xff1a; 题目&a…...

德迅云安全为您介绍关于抗D盾的一些事

抗D盾概述&#xff1a; 抗D盾是新一代的智能分布式云接入系统&#xff0c;接入节点采用多机房集群部署模式&#xff0c;隐藏真实服务器IP&#xff0c;类似于网站CDN的节点接入&#xff0c;但是“抗D盾”是比CDN应用范围更广的接入方式&#xff0c;适合任何TCP 端类应用包括&am…...

leetcode算法之位运算

目录 1.判断字符是否唯一2.丢失的数字3.两整数之和4.只出现一次的数字II5.消失的两个数字6.位1的个数7.比特位计数8.汉明距离 1.判断字符是否唯一 判断字符是否唯一 class Solution { public:bool isUnique(string astr) {//利用鸽巢原理做优化if(astr.size()>26) return…...

java常用的几个图片处理工具对Tiff文件的支持

ImageMagick 官网 https://imagemagick.org/&#xff0c; 支持多种格式。命令行工具很适合调试。功能很强大. 还有一款工具GraphicsMagick 是从ImageMagick的基础上研发出来的。 OpenCV 官网 https://opencv.org/ &#xff0c; github地址https://github.com/opencv/opencv&…...

SQL必知会(二)-SQL查询篇(11)-联结表

第12课、联结表 联结表 使用联结&#xff1a;之前的 SELECT 查询某些列&#xff0c;只是针对一张表进行检索的。&#xff08;即 FROM 表名&#xff09;。但是如果用户想要使用 SELECT 对存储在不同表中的某些列时&#xff0c;则需要使用联结表的方式来实现。 例子中有建立两个…...

多模态大一统:开启全模态LLM和通用AI时代的大门

多模态大一统:开启全模态LLM和通用AI时代的大门 1. 目前多模态实现的方法1.1 单独训练各领域模型1.2 多任务学习1.3 集成多模态模型1.4 通用多模态模型2. 多模态统一难点2.1 数据集对齐和融合2.2 大规模计算资源需求2.3 各领域特性的兼容性2.4 可解释性和泛化能力3. 全模态的好…...

Alibaba Nacos注册中心实战

为什么需要注册中心 思考&#xff1a;网络请求&#xff0c;如果服务提供者发生变动&#xff0c;服务调用者如何感知服务提供者的ip和端口变化&#xff1f; // 微服务之间通过RestTemplate调用&#xff0c;ip:port写死&#xff0c;如果ip或者port变化呢&#xff1f; String ur…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...

欢乐熊大话蓝牙知识17:多连接 BLE 怎么设计服务不会乱?分层思维来救场!

多连接 BLE 怎么设计服务不会乱&#xff1f;分层思维来救场&#xff01; 作者按&#xff1a; 你是不是也遇到过 BLE 多连接时&#xff0c;调试现场像网吧“掉线风暴”&#xff1f; 温度传感器连上了&#xff0c;心率带丢了&#xff1b;一边 OTA 更新&#xff0c;一边通知卡壳。…...

职坐标物联网全栈开发全流程解析

物联网全栈开发涵盖从物理设备到上层应用的完整技术链路&#xff0c;其核心流程可归纳为四大模块&#xff1a;感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性&#xff0c;例如传感器选型需平衡精度与…...

Axure Rp 11 安装、汉化、授权

Axure Rp 11 安装、汉化、授权 1、前言2、汉化2.1、汉化文件下载2.2、windows汉化流程2.3、 macOs汉化流程 3、授权 1、前言 Axure Rp 11官方下载链接&#xff1a;https://www.axure.com/downloadthanks 2、汉化 2.1、汉化文件下载 链接: https://pan.baidu.com/s/18Clf…...