python-pptx
模块是一个Python
库,用于创建和更新Microsoft PowerPoint (.pptx)
文件。
安装python-pptx
第三方扩展
pip install python-pptx
在使用python操作PPT之前,首先应该清楚PPT的结构,这个对于之后代码的编写很有帮助。
我们可以使用Presentation()
函数获取一个PPT
X文件:
from pptx import Presentation
prs = Presentation("CEMS架构和中间件.pptx")
Presentation.slides
获取获取所有幻灯片,文档共有27页,有27个slide
print(len(prs.slides))
for slide in prs.slides:
print(slide)
获取形状shape
# 输出第2张幻灯片的shapes 共有3个shape,标题,左侧图片,右侧文本
shapes = prs.slides[1].shapes
len(shapes),shapes
# 输出结果
(3, <pptx.shapes.shapetree.SlideShapes at 0x20c08052390>)
文本内容提取,has_text
进行判断,也可通过MSO_SHAPE_TYPE
判断
from pptx.enum.shapes import MSO_SHAPE_TYPE
for shape in shapes:
if shape.has_text_frame:
text_frame = shape.text_frame
print(text_frame.text)
# 也可以通过下面这种方式,更好判断每个shape的类型
if shape.shape_type == MSO_SHAPE_TYPE.TEXT_BOX:
text_frame = shape.text_frame
print(text_frame.text)
读取到ppt内容并输出
获取Shape
中的某个Paragraph
段落
text_frame = shape.text_frame
for paragraph in text_frame.paragraphs:
print(paragraph.text)
显示第二张幻灯片的图片内容,这里用到了cv2
,numpy
,matplotlib
pip install numpy
pip install opencv-python
pip install matplotlib
import cv2
import numpy as np
import matplotlib.pyplot as plt
shape = shapes[1]
if shape.shape_type == MSO_SHAPE_TYPE.PICTURE:
# shape.image.blob获取图片的blog信息
# 通过numpy的frombuffer转化
data = np.frombuffer(shape.image.blob,dtype=np.uint8)
# 将blob转换为图像
img = cv2.imdecode(data, cv2.IMREAD_COLOR)
plt.imshow(img)
slide_layouts
列表数量和power point基础版式数量对应,格式对应。比如6为空模版,7为左侧图形,右侧文本的版式。 prs.slide_layouts[]
传入0表示是第一个版式,传入1表示第二个版式,以此类推一直到结束48。
from pptx import Presentation
prs = Presentation()
#布局样式0-47
layout = prs.slide_layouts[0]
# 添加第一页幻灯片
slide = prs.slides.add_slide(layout)
title = slide.shapes.title
title.text = "这是第一个幻灯片"
subtitle = slide.placeholders[1]
subtitle.text = "正文框"
# 添加第2个幻灯片
layout = prs.slide_layouts[1]
slide = prs.slides.add_slide(layout)
title = slide.shapes.title
title.text = "这是第二个幻灯片"
body = slide.placeholders
body[1].text = "第二行正文"
# 添加第3个幻灯片
layout = prs.slide_layouts[2]
slide = prs.slides.add_slide(layout)
body = slide.placeholders
body[0].text = "这是第三个幻灯片"
body[1].text = "第三行正文"
prs.save("new.pptx")
通过段落添加内容,并设置相应样式
from pptx import Presentation
from pptx.util import Pt
from pptx.enum.text import PP_ALIGN
prs = Presentation()
#布局样式0-47
layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(layout)
#每个layout中仅有2个占位符
body = slide.placeholders
body[0].text = "这是一个正文"
body[1].text = "第二行正文"
# 正文部分增加段落
paragraph = body[1].text_frame.add_paragraph()
paragraph.text ="要么做一个优秀的人,要么做一个懂事的人," \
"要在这世上混,没一点本事和能力还真不行的。"
# 左对齐
paragraph.alignment = PP_ALIGN.LEFT
# 粗体
paragraph.font.bold = True
# 斜体
paragraph.font.itatic = True
# 字体大小
paragraph.font.size = Pt(15)
# 下划线
paragraph.font.underline = True
prs.save('shape.pptx')
通过母版进行批量生成,新创建一个tpl.pptx的文件,格式如下:
这样我们通过爬虫,数据库等数据源获取数据,通过模版生成ppt格式,连同数据和格式写入最终ppt中了。
from pptx import Presentation
prs = Presentation('tpl.pptx')
bzs = [
{"title":"标题1","img":r"E:\美女照片\4K动态壁纸\4K动态壁纸 (1).png","content":"壁纸3"},
{"title":"标题2","img":r"E:\美女照片\4K动态壁纸\4K动态壁纸 (2).png","content":"壁纸3"}
]
for bz in bzs:
tpl_num = len(prs.slide_layouts)
# 上面的板式是7
slide = prs.slides.add_slide(prs.slide_layouts[7])
body = slide.shapes.placeholders
for index,shape in enumerate(body):
if index == 0:
shape.text = bz["title"]
if index == 1:
shape.insert_picture(bz['img'])
if index == 2:
shape.text = bz["content"]
# 保存壁纸的ppts
prs.save("bz.pptx")
原网址: 访问
创建于: 2024-04-23 14:37:46
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论