Python-pptx教程之一从零开始生成PPT文件

简介

python-pptx是一个用于创建、读取和更新PowerPoint(.pptx)文件的python库。
典型的用途是根据动态内容(如数据库查询、分析数据等),将这些内容自动化生成PowerPoint演示文稿,将数据可视化,方便查看
我们也可以用它做办公自动化,定义一套模板,然后根据给出的内容批量生成PPT文件,大大提高我们的办公效率

Python-pptx的Github地址

https://github.com/scanny/python-pptx

开发文档

https://python-pptx.readthedocs.io/en/latest/

安装python-pptx

pip install python-pptx

本文使用的版本为0.6.21

使用python-pptx创建新的PPT

生成一个全新的PPT文件,这种方式适用于所有样式都是由代码来控制的场景
幻灯片效果

在这里插入图片描述
实现以上效果的代码

from pptx import Presentation

# 创建一个新的 Presentation 对象
prs = Presentation()
# 获取一个包含主标题和副标题的幻灯片版式
title_slide_layout = prs.slide_layouts[0]
# 将幻灯片加入到PPT中
slide = prs.slides.add_slide(title_slide_layout)
# 获取主标题
title = slide.placeholders[0]
# 获取副标题
subtitle = slide.placeholders[1]

title.text = "Hello, World!"
subtitle.text = "python-pptx create it"
# 保存创建的PPT文件
prs.save('G:/simple_ppt/test/test1.pptx')

上例中的prs.slide_layouts[0] 获取幻灯片的版式,幻灯片的版式共有11个,如下所示
在这里插入图片描述
从左到右依次是slide_layouts[0]、slide_layouts[1] 一直到 slide_layouts[10],通过对应的下标即可获取对应的幻灯片版式

Tips:
上面代码中的slide = prs.slides.add_slide(title_slide_layout)
即prs.slides 代表的是当前PPT中所有幻灯片的集合,通过add_slide 添加一张幻灯片后拿到的slide ,后续针对这个slide 的各种操作也就是单张幻灯片的操作

修改幻灯片大小

1、直接通过slide_width和slide_height指定

from pptx.util import Cm

prs = Presentation()
prs.slide_width = Cm(33.85)
prs.slide_height = Cm(19.02)

2、通过模板指定
可以先自定义一个指定了宽高的空白页PPT模板,创建Presentation对象时引用它,后续创建的幻灯片就能继承到对应的宽高大小

prs = Presentation("G:/simple_ppt/test/template.pptx")

创建文本

段落创建

想要在幻灯片中添加文本,先要通过add_textbox创建一个文本框,然后取得text_frame来进行操作

from pptx import Presentation
from pptx.util import Cm

def test_blog_text_add():
    prs = Presentation()
    prs.slide_width = Cm(33.85)
    prs.slide_height = Cm(19.02)

    bullet_slide_layout = prs.slide_layouts[6]    # 空白版式
    slide = prs.slides.add_slide(bullet_slide_layout)

    # 添加文本框
    tx_box = slide.shapes.add_textbox(left=Cm(2.58), top=Cm(1.16), width=Cm(28), height=Cm(2.36))
    tf = tx_box.text_frame

    p0 = tf.paragraphs[0]
    p0.text = '这是第一行段落'

    p1 = tf.add_paragraph()
    p1.text = '这是新增的第二行段落'

    run = p1.add_run()
    run.text = '。第二行结尾直接添加文字'

    prs.save("G:/simple_ppt/test/blog_test.pptx")

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

Tips:
上面代码中的:tx_box = slide.shapes.add_textbox(…
slide.shapes代表的是当前幻灯片中所有元素的集合,如文本框、图片、图标、视频等等可框选的东西,都是shapes,所以若要添加什么东西,也是通过shapes.add_xxx的方式来实现

文本样式添加
一、自动换行

如果我们输入的文本大于文本框的长度时,默认是不会换行的,可以使用tf.word_wrap来指定自动换行

tf = tx_box.text_frame
tf.word_wrap = True
二、文本布局样式

文本框中的文本默认是上方对齐,可以使用tfvertical_anchor来指定文本的布局方式

from pptx.enum.text import MSO_ANCHOR

tf = tx_box.text_frame
tf.vertical_anchor = MSO_ANCHOR.MIDDLE
  • TOP:将文本与文本框顶部对齐
  • MIDDLE:垂直居中文本
  • BOTTOM:将文本与文本框底部对齐

参考:https://python-pptx.readthedocs.io/en/latest/api/enum/MsoVerticalAnchor.html
注意,这个只是指定了文本垂直方向上的移动,如想文本基于整个文本框居中需要指定段落的布局方式
设置文本段落布局可以通过设置p.alignment 的方式

from pptx.enum.text import MSO_ANCHOR, PP_ALIGN

tf = tx_box.text_frame
tf.vertical_anchor = MSO_ANCHOR.MIDDLE
p0 = tf.paragraphs[0]
p0.text = '这是第一行段落'
p0.alignment = PP_ALIGN.CENTER

效果如图
在这里插入图片描述
PP_ALIGN的参数有以下几个

  • CENTER:居中对齐
  • DISTRIBUTE:在一行中从左到右均匀分布
  • JUSTIFY:每行都在页边空白处开始和结束,并调整单词之间的间距,使该行正好填满段落的宽度
  • JUSTIFY_LOW:在单词之间使用少量空格进行对齐
  • LEFT:默认的,左对齐
  • RIGHT:右对齐
  • THAI_DISTRIBUTE:泰语分散对齐,输入泰语时候指定

以上效果就不一一演示了,自己尝试下选择合适的就行

参考:

https://python-pptx.readthedocs.io/en/latest/api/enum/PpParagraphAlignment.html

三、文字样式修改

文字的字体、字号、加粗、斜体、下划线、颜色、超链接等,这些样式通过font 来设置
参数较多,直接上代码

from pptx import Presentation
from pptx.util import Cm, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import MSO_ANCHOR, PP_ALIGN

def test_blog_text_add():
    prs = Presentation()
    prs.slide_width = Cm(33.85)
    prs.slide_height = Cm(19.02)

    bullet_slide_layout = prs.slide_layouts[6]
    slide = prs.slides.add_slide(bullet_slide_layout)

    # 添加文本框
    tx_box = slide.shapes.add_textbox(left=Cm(2.58), top=Cm(1.16), width=Cm(28.47), height=Cm(5))
    tf = tx_box.text_frame
    tf.word_wrap = True     # 自动换行
    tf.vertical_anchor = MSO_ANCHOR.MIDDLE  # 垂直居中

    p0 = tf.paragraphs[0]   # 第一行段落
    p0.alignment = PP_ALIGN.CENTER  # 设置段落文字居中
    p0.line_spacing = 1.3   # 间距
    p0.font.name = 'Arial Black' # 字体
    p0.font.size = Pt(40)   # 字号
    p0.font.italic = True   # 斜体
    p0.font.bold = True     # 粗体
    p0.font.underline = True    # 显示下划线
    p0.font.color.rgb = RGBColor(255, 0, 0)  # 设置红色
    p0.text = 'Hello World!'

    p1 = tf.add_paragraph()  # 添加新段落
    p1.text = '这是第二行段落'

    run = p1.add_run()
    run.text = "。第二行结尾直接添加文字"
    run.hyperlink.address = 'https://www.baidu.com'    # 添加超链接

    prs.save("G:/simple_ppt/test/blog_test.pptx")

生成的效果
在这里插入图片描述
注意,当给一个文本添加了超链接后,文字的颜色就无法指定了,会变成图中这种蓝色加下划线的样式

段落间距设置

可通过line_spacing指定

p0.line_spacing = 1.3
文字大小自动改变

有时候我们要输入的文本太长,而文本框区域有限,此时可以指定文字的大小根据文本框的大小自动调整文字的大小

from pptx.enum.text import MSO_AUTO_SIZE

tf = tx_box.text_frame
tf.auto_size = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE

MSO_AUTO_SIZE还有其它三个参数

  • NONE:不进行任何自动调整,文字可以超出文本框的边界
  • SHAPE_TO_FIT_TEXT:根据文字的内容自动调整文本框的宽度和高度,这样可以保持文字的大小不变
  • TEXT_TO_FIT_SHAPE:根据文本框的大小自动调整文字的大小,这样可以让文字完全填充文本框

参考:

https://python-pptx.readthedocs.io/en/latest/api/enum/MsoAutoSize.html

文本层级设置

文字层级一般用来处理段落的缩进,对内容进行层级管理,通过level 来指定,每个paragraph的level默认就是0

p2 = tf.add_paragraph()
p2.text = '第一层'
p2.level = 0

p3 = tf.add_paragraph()
p3.text = '第二层'
p3.level = 1

p4 = tf.add_paragraph()
p4.text = '第三层'
p4.level = 2

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

创建图片

使用add_picture 可以添加图片,指定对应的坐标即可

img_path = 'G:/simple_ppt/res/picture.png'
slide.shapes.add_picture(img_path, left=Cm(2.58), top=Cm(6.16), width=Cm(8.3), height=Cm(5.13))

left和top表示图片左上角顶点分别距离幻灯片左边框和上边框的距离,width和height表示图片的宽和高

创建视频或音频

添加视频使用add_movie

video_path = 'G:/simple_ppt/res/movie.mp4'
slide.shapes.add_movie(video_path, Cm(11.66), Cm(6.22), Cm(8.11), Cm(5.07), mime_type='video/mp4')

视频显示的时候不会自动获取视频里的画面作为预览图,只会显示一个默认的喇叭图标,若想要根据视频的画面来生成预览图,可以借助OpenCV工具来获取视频帧存为图片,然后通过poster_frame_image参数来指定

import cv2

video_path = 'G:/simple_ppt/res/movie.mp4'
cap = cv2.VideoCapture(video_path)
cap.set(cv2.CAP_PROP_POS_FRAMES, 0)  # 设置要获取的帧
ret, frame = cap.read()
cv2.imwrite(save_poster_temp, frame)
cap.release()

slide.shapes.add_movie(video_path, Cm(11.66), Cm(6.22), Cm(8.11), Cm(5.07), mime_type='video/mp4', poster_frame_image=save_poster_temp)

Python-pptx中并没有直接提供添加音频的方法,不过其实音频也可以通过add_movie来指定,只需要修改ime_type参数为audio/mp3

audio_path = 'G:/simple_ppt/res/audio.mp3'
slide.shapes.add_movie(audio_path, Cm(19.77), Cm(6.22), Cm(8.11), Cm(5.07), mime_type='audio/mp3')

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

创建形状图形

Python-pptx中支持添加形状图形,也就是下面这些
在这里插入图片描述
可通过add_shape来添加

from pptx.enum.shapes import MSO_SHAPE

slide.shapes.add_shape(MSO_SHAPE.STAR_5_POINT, left=Cm(28.83), top=Cm(6.87), width=Cm(3.7), height=Cm(3.7))

STAR_5_POINT表示一个五角星,更多形状参数可查看以下链接

https://python-pptx.readthedocs.io/en/latest/api/enum/MsoAutoShapeType.html#msoautoshapetype

形状图形的一些属性设置

shape = slide.shapes.add_shape(MSO_SHAPE.STAR_5_POINT, left=Cm(28.83), top=Cm(6.87), width=Cm(3.7), height=Cm(3.7))
shape.rotation = 45  # 旋转图标45°
shape.shadow.inherit = True  # 是否取消倒影显示
shape.fill.solid()  # 设置这个后才能通过下面的fore_color来设置颜色
shape.fill.fore_color.rgb = RGBColor(255, 255, 0)  # 修改填充颜色
shape.line.color.rgb = RGBColor(255, 0, 0)  # 修改边框颜色
shape.line.width = Cm(0.1)  # 修改边框宽度

还可以通过dash_style来指定边框的线条样式

from pptx.enum.dml import MSO_LINE

shape.line.dash_style = MSO_LINE.DASH  # 设置边框为虚线

MSO_LINE其它参数:

  • MSO_LINE.SOLID:实线
  • MSO_LINE.DASH:短划线
  • MSO_LINE.DASH_DOT:点划线
  • MSO_LINE.DASH_DOT_DOT:双点划线
  • MSO_LINE.LONG_DASH:长划线
  • MSO_LINE.LONG_DASH_DOT:长点划线
  • MSO_LINE.ROUND_DOT:圆点线
  • MSO_LINE.SQUARE_DOT:方点线

五角星显示的效果
在这里插入图片描述如果不想要图形的边框,可以使用以下方法将边框指定为透明

shape.line.fill.background()

创建幻灯片背景

可以通过slide的background来指定纯色背景

bg = slide.background
bg.fill.solid()
bg.fill.fore_color.rgb = RGBColor(219, 238, 244)

python-pptx库并没有直接提供设置图片作为幻灯片背景的方法,但可以通过将图片设置为铺满整个幻灯片来达到同样的效果

img_path = "G:/bg_image.png"
slide.shapes.add_picture(img_path, Cm(0), Cm(0), width=prs.slide_width, height=prs.slide_height)

slide_width和slide_height获取的分别是整张幻灯片的宽和高

这里要注意图片的层级问题,由于没有提供设置图片层级的方法,所以作为背景的图片应该放在构建幻灯片的第一位

纯色背景效果
在这里插入图片描述

创建幻灯片备注信息

幻灯片底部的备注信息,在分屏预览时可用于提示演讲人更详细的幻灯片内容细节
通过has_notes_slide来判断幻灯片是否有备注,通过以下代码可以获得幻灯片的备注信息

if slide.has_notes_slide:
    text_frame = slide.notes_slide.notes_text_frame
    print("备注文本:", text_frame.text)

若想修改备注信息,直接通过text指定即可

text_frame = slide.notes_slide.notes_text_frame
text_frame.text = "被修改的备注信息"

备注修改效果
在这里插入图片描述

总结

本篇文章介绍了如何使用python-pptx框架生成PPTX文件的方法,通过以上学习,可以掌握如何通过Python-pptx框架控制幻灯片大小、创建各种样式的文本、在幻灯片中添加图片、视频和音频,添加形状图形及如何修改它的样式,如何设置幻灯片的背景和备注信息等技能

下一篇将会介绍如何针对已有的PPT模板进行修改

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么引入偏向锁、轻量级锁,介绍下升级流程

Synchronized Synchronized 在 jdk1.6 版本之前,是通过重量级锁的方式来实现线程之间锁的竞争。之所以称它为重量级锁,是因为它的底层底层依赖操作系统的 Mutex Lock 来实现互斥功能。(如图)Mutex 是系统方法,由于权限…

【公益案例展】奇安信补天漏洞响应平台——凝聚白帽子志愿力量

‍ 奇安信公益案例 本项目案例由奇安信投递并参与数据猿与上海大数据联盟联合推出的 #榜样的力量# 《2023中国数据智能产业最具社会责任感企业》榜单/奖项”评选。 ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 我国网络安全行业存在人才奇缺、政企机构安全能力不足的现…

winodos下使用VS2022编译eclipse-paho.mqtt.c并演示简单使用的 demo

本文演示C语言如何使用eclipse-paho.mqtt.c库,包含自行编译库的步骤或者下载编译好的文件。 1.下载paho.mqtt.c库源码(zip 文件) 到官网选择C版本的paho源码进行下载 Eclipse Paho | The Eclipse Foundation 或者到下述连接下载 Releases ec…

二维码智慧门牌管理系统升级解决方案:采集项目的建立与运用

文章目录 前言一、采集项目的建立二、采集项目的运用三、采集项目的意义 前言 在二维码智慧门牌管理系统的升级过程中,一个至关重要的环节是采集项目的建立与运用。采集项目是新建采集任务的前提,同时也是整个系统升级的关键步骤。其意义近似于现实中的…

布隆过滤器(Bloom Filter)初学习

目录 1、布隆过滤器是什么 2、布隆过滤器的优缺点 3、使用场景 4、⭐基于Redis的布隆过滤器插件安装 4.1 下载布隆过滤器 4.2 创建文件夹并上传文件 4.3 安装gcc 4.4 解压RedisBloom压缩包 4.5 在解压好的文件夹下输入make 4.6 将编译的好的插件拷贝到docker redis容…

火柴排队.

题意:给两列火柴,可以交换任意相邻的火柴,使得(ai-bi)^2的和最小,求最小交换次数。 分析:使得(ai-bi)^2的和最小,即a^2-2abb^2的和最小,那么使得2ab最大,就可…

荣电集团与钕希科技签署全面战略合作

10月26日,荣电集团(以下简称荣电)与钕希科技南京有限公司(以下简称钕希科技)今天在合肥市签署全面战略合作协议,联合进军混合现实(Mixed Reality,以下简称MR)空间计算高科…

爬虫批量下载科研论文(SciHub)

系列文章目录 利用 eutils 实现自动下载序列文件 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、获取文献信息二、下载文献PDF文件参考 前言 大家好✨,这里是bio🦖。…

底层驱动day8作业

代码&#xff1a; //驱动程序 #include<linux/init.h> #include<linux/module.h> #include<linux/of.h> #include<linux/of_gpio.h> #include<linux/gpio.h> #include<linux/timer.h>struct device_node *dnode; //unsigned int gpiono; …

【云原生】portainer管理多个独立docker服务器

目录 一、portainer简介 二、安装Portainer 1.1 内网环境下&#xff1a; 1.1.1 方式1&#xff1a;命令行运行 1.1.2 方式2&#xff1a;通过compose-file来启动 2.1 配置本地主机&#xff08;node-1&#xff09; 3.1 配置其他主机&#xff08;被node-1管理的节点服务器&…

RabbitMQ基础

目录 RabbitMQ的可靠性投递 确保消息正确地发送至 RabbitMQ 确保消息接收方消费了消息 流程分析 1.生产者发送消息给Broker 2.交换机路由消息到队列 3.消息存储在队列 4.消费者订阅并消费消息 三个重要概念 RabbitMQ集群模式 RabbitMQ的可靠性投递 在 RabbitMQ 中&a…

TS中类型别名和接口区别

在很多场景下&#xff0c;interface 和 type都能使用&#xff0c;因此两者在很多时候会被混淆&#xff1a; 接口可以通过之间的继承&#xff0c;实现多种接口的组合 使用类型别名也可以实现多种的&#xff0c;通过&连接,有差异&#xff1a; 子接口中不能重新覆盖父接口中…

迭代器的封装与反向迭代器

一、反向迭代器 在list模拟实现的过程中&#xff0c;第一次接触了迭代器的封装&#xff0c;将list的指针封装成了一个新的类型&#xff0c;并且以迭代器的基本功能对其进行了运算符重载 反向迭代器是对正向迭代器的封装&#xff0c;并且体现了泛型编程的思想&#xff0c;任意…

0基础学习PyFlink——用户自定义函数之UDAF

大纲 UDAF入参并非表中一行&#xff08;Row&#xff09;的集合计算每个人考了几门课计算每门课有几个人考试计算每个人的平均分计算每课的平均分计算每个人的最高分和最低分 入参是表中一行&#xff08;Row&#xff09;的集合计算每个人的最高分、最低分以及所属的课程计算每课…

中文编程工具免费版下载,中文开发语言工具免费版下载

中文编程工具免费版下载&#xff0c;中文开发语言工具免费版下载 中文编程工具开发的实际部分案例如下图 编程系统化课程总目录及明细&#xff0c;点击进入了解详情。 https://blog.csdn.net/qq_29129627/article/details/134073098?spm1001.2014.3001.5502

栈、队列、矩阵的总结

栈的应用 括号匹配 表达式求值&#xff08;中缀&#xff0c;后缀&#xff09; 中缀转后缀&#xff08;机算&#xff09; 中缀机算 后缀机算 总结 特殊矩阵 对称矩阵的压缩存储 三角矩阵 三对角矩阵 稀疏矩阵的压缩存储

龙芯3A5000上安装微信

原文链接&#xff1a;龙芯3A5000上安装微信 hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇在龙芯3A5000上安装微信的文章&#xff0c;主要给大家展示一下在龙芯架构上使用微信的情况&#xff0c;看看内置浏览器、看一看、小程序等是否能正常打开使用。 1、查看系统…

Hadoop 请求数据长度 Requested Data length 超过配置的最大值

一、问题 现象 Spark 任务速度变慢&#xff0c;也不失败。 DataNode 内存足够 CPU 负载不高 GC 时间也不长。 查看 DataNode 日志&#xff0c;发现有些日志出现很多 Netty RPC 超时。超时的 destination 是一个 NameNode 节点&#xff0c;然后查看 NameNode 节点的日志&…

28 行为型模式-中介者模式

1 中介者模式介绍 2 中介者模式原理 3 中介者模式实现 /*** 抽象中介者**/ public interface Mediator {//处理同事对象注册与转发同事对象信息的方法void apply(String key); }/*** 具体中介者**/ public class MediatorImpl implements Mediator {Overridepublic void apply…

Spring的执行流程与Bean的生命周期

目录 一、Spring的执行流程&#xff08;生命周期&#xff09; 二、Bean的生命周期 一、Spring的执行流程&#xff08;生命周期&#xff09; 首先在Spring的执行过程中会先启动容器&#xff0c;这里是将配置文件进行加载。根据配置文件完成Bean的实例化&#xff0c;比如是配置的…