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 输出栈 题外话 顺序表和链表优缺点以及特点 特点:顺序表,逻辑地址物理地址。可以任意访问,…...
重温《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框架的核心,是所有的想法、主意转换为价值的地方。所有实现产品目标的必要工作都在sprint里完成,这些工作主要包括Sprint 计划(Sprint planning)、每日站会(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? git是一款开源的分布式版本控制软件。它不仅具有网络功能,还是服务端与客户端一体的软件。它可以高效的处理程序项目中的版本管理。它是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: 学习记录:网络协议 excerpt: 代理、VPN、CDN、网络爬虫、无线网络、缓存、Cookie & Session、RESTful。 comments: false tags: top_image: /images/back…...
利用NVIDIA DALI读取视频帧
1. NVIDIA DALI简介 NVIDIA DALI全称是NVIDIA Data Loading Library,是一个用GPU加速的数据加载和预处理库,可用于图像、视频和语音数据的加载和处理,从而为深度学习的训练和推理加速。 NVIDIA DALI库的出发点是,深度学习应用中…...
TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
【算法每日一练]-图论(保姆级教程 篇5(LCA,最短路,分层图)) #LCA #最短路计数 #社交网络 #飞行路线 # 第二短路
今天讲最短路统计和分层图 目录 题目:LCA 思路: 题目:最短路计数 思路: 题目:社交网络 思路: 题目:飞行路线 思路: 题目:第二短路 思路: 题目&a…...
德迅云安全为您介绍关于抗D盾的一些事
抗D盾概述: 抗D盾是新一代的智能分布式云接入系统,接入节点采用多机房集群部署模式,隐藏真实服务器IP,类似于网站CDN的节点接入,但是“抗D盾”是比CDN应用范围更广的接入方式,适合任何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/, 支持多种格式。命令行工具很适合调试。功能很强大. 还有一款工具GraphicsMagick 是从ImageMagick的基础上研发出来的。 OpenCV 官网 https://opencv.org/ , github地址https://github.com/opencv/opencv&…...
SQL必知会(二)-SQL查询篇(11)-联结表
第12课、联结表 联结表 使用联结:之前的 SELECT 查询某些列,只是针对一张表进行检索的。(即 FROM 表名)。但是如果用户想要使用 SELECT 对存储在不同表中的某些列时,则需要使用联结表的方式来实现。 例子中有建立两个…...
多模态大一统:开启全模态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注册中心实战
为什么需要注册中心 思考:网络请求,如果服务提供者发生变动,服务调用者如何感知服务提供者的ip和端口变化? // 微服务之间通过RestTemplate调用,ip:port写死,如果ip或者port变化呢? String ur…...
基于Spark+Hadoop+Hive 深度学习大数据的运河航运效率提升平台的设计与实现
前言随着全球贸易的不断发展,运河航运作为连接内陆与海洋的重要交通方式,其运输效率的提升对于促进经济发展、优化资源配置具有重要意义。基于大数据的运河航运效率提升平台的设计与实现,旨在通过收集、处理和分析大量的航运数据,…...
STM32 PWR电源管理与低功耗模式实战指南
1. STM32电源管理基础与实战意义 在嵌入式系统开发中,电源管理往往是最容易被忽视却至关重要的环节。想象一下你的智能手环如果每天都需要充电,或者无线传感器节点每隔几小时就要更换电池,这样的产品显然缺乏实用价值。STM32的PWR模块正是为解…...
3步解锁Windows运行安卓应用:APK-Installer轻量解决方案
3步解锁Windows运行安卓应用:APK-Installer轻量解决方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在数字化办公与娱乐融合的今天,安卓应用…...
跨平台终端与进程控制:从原理到实践
跨平台终端与进程控制:从原理到实践 【免费下载链接】node-pty Fork pseudoterminals in Node.JS 项目地址: https://gitcode.com/gh_mirrors/no/node-pty 在现代软件开发中,终端交互和进程管理是不可或缺的核心能力。无论是构建IDE、开发自动化工…...
可视掏耳勺哪个牌子好?用什么掏耳朵最好?掏耳勺神器新款第一名
用什么掏耳朵最好?如今耳道护理成为家庭日常刚需,可视掏耳勺凭借“边看边清洁”的核心优势,彻底解决了传统盲掏易戳伤耳道、推深耳垢的痛点,成为越来越多人的首选。但当前可视掏耳勺市场陷入参数内卷,不少品牌盲目追求…...
BEYOND REALITY Z-Image避坑指南:解决生成图片模糊、全黑的常见问题
BEYOND REALITY Z-Image避坑指南:解决生成图片模糊、全黑的常见问题 1. 为什么你的Z-Image生成效果不理想? 当你第一次使用BEYOND REALITY Z-Image时,可能会遇到这样的困扰:明明输入了详细的提示词,生成的图片却要么…...
利用快马平台快速构建技能评估系统原型:以skill-vetter为例
利用快马平台快速构建技能评估系统原型:以skill-vetter为例 最近在做一个前端开发技能评估系统,需要快速验证产品原型。传统开发流程从搭建环境到功能实现至少需要1-2周,但通过InsCode(快马)平台的AI辅助和现成模板,我只用了3天就…...
别再手动刷新了!SAP ALV中利用change事件与modify_cell实现智能数据同步
SAP ALV开发进阶:巧用change事件与modify_cell构建智能数据联动体系 在SAP前端开发领域,ALV(ABAP List Viewer)作为最常用的数据展示控件,其交互体验直接影响用户操作效率。传统开发模式中,当用户修改某个单…...
实战指南:基于快马平台生成Spring Boot电商后端并部署于腾讯云龙虾
最近在做一个电商平台的后端开发项目,需要快速搭建一套完整的API服务。考虑到腾讯云龙虾服务器性价比高,特别适合中小型Web应用部署,我决定用Spring Boot框架来实现。整个过程在InsCode(快马)平台上完成,从代码生成到部署上线一气…...
springboot+vue基于web的网上考试系统的设计系统
目录同行可拿货,招校园代理 ,本人源头供货商系统功能模块划分题库管理模块在线考试模块自动阅卷模块技术实现要点扩展功能建议项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 系统功能模…...
