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

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 Cmprs = 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 Cmdef 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_framep0 = 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_ANCHORtf = 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_ALIGNtf = 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_ALIGNdef 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_frametf.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_SIZEtf = 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 = 0p3 = tf.add_paragraph()
p3.text = '第二层'
p3.level = 1p4 = 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 cv2video_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_SHAPEslide.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_LINEshape.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_frameprint("备注文本:", text_frame.text)

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

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

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

总结

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

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

相关文章:

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

简介 python-pptx是一个用于创建、读取和更新PowerPoint(.pptx)文件的python库。 典型的用途是根据动态内容(如数据库查询、分析数据等),将这些内容自动化生成PowerPoint演示文稿,将数据可视化&#xff0c…...

k8s 使用ingress-nginx访问集群内部应用

k8s搭建和部署应用完成后,可以通过NodePort,Loadbalancer,Ingress方式将应用端口暴露到集群外部,提供外部访问。 缺点: NodePort占用端口,大量暴露端口非常不安全,并且有端口数量限制【不推荐】…...

企业数据泄露怎么办?

随着数字化时代的到来,威胁企业数据安全的因素越来越多。一旦机密数据泄露,不仅会对企业造成巨大的经济损失,还会对企业的声誉和客户信任度造成严重影响。发生数据泄露情况时,企业该怎样应对? 1.确认数据泄露 确认是…...

GoLong的学习之路(一)语法之变量与常量

目录 GoLang变量批量声明变量的初始化类型推导短变量声明匿名变量 常量iota(特殊)(需要重点记忆) GoLang go的诞生为了解决在21世纪多核和网络化环境越来越复杂的变成问题而发明的Go语言。 go语言是从Ken Thomepson发明的B语言和…...

Go-Python-Java-C-LeetCode高分解法-第十一周合集

前言 本题解Go语言部分基于 LeetCode-Go 其他部分基于本人实践学习 个人题解GitHub连接:LeetCode-Go-Python-Java-C 欢迎订阅CSDN专栏,每日一题,和博主一起进步 LeetCode专栏 我搜集到了50道精选题,适合速成概览大部分常用算法 突…...

封装axios的两种方式

作为前端工程师,经常需要对axios进行封装以满足复用的目的。在不同的前端项目中使用相同的axios封装有利于保持一致性,有利于数据之间的传递和处理。本文提供两种对axios进行封装的思路。 1. 将请求方式作为调用参数传递进来 首先导入了axios, AxiosIn…...

【自然语言处理】NLTK库的概念和作用

文章目录 一、NLTK库介绍二、NLTK库的使用2.1 初级使用2.2 中级使用 参考资料 一、NLTK库介绍 Natural Language Toolkit (NLTK)是一个广泛使用的Python自然语言处理工具库,由Steven Bird、Edward Loper和Ewan Klein于2001年发起开发。NLTK的目的是为自然语言处理&…...

Python爬虫如何解决提交参数js加密

注意!!!! 仅做知识储备莫拿去违法乱纪,有问题指出来,纯做笔记记录 由于¥%…………&&%#%** 所以!#¥……&*……* 啥也不说直接上代码 import execjs js_ji…...

云数据库及RDS数据库介绍

1.云数据库概念 云数据库是指被优化或部署到一个虚拟计算环境中的数据库,具有按需付费、按需扩展、高可用性以及存储整合等能力。 2.云数据库特性 云数据库的特性有:实例创建快速、支持只读实例、读写分离、故障自动切换、数据备份、Binlog备份、SQL审…...

c语言进阶部分详解(详细解析自定义类型——枚举,联合(共用体))

上篇文章介绍了结构体相关的内容,大家可以点击链接进行浏览:c语言进阶部分详解(详细解析自定义类型——结构体,内存对齐,位段)-CSDN博客 各种源码大家可以去我的gitee主页进行查找:唔姆 (Nerow…...

使用 Requests 库和 PHP 的下载

以下是一个使用 Requests 库和 PHP 的下载器程序,用于从 www.people.com.cn 下载音频。此程序使用了 https://www.duoip.cn/get_proxy 这段代码。 import requests from bs4 import BeautifulSoup import pafy import timedef get_proxy():url "https://www.…...

ConcurrentHashMap底层具体实现知道吗?实现原理是什么

从这三个方面来回答: ConcurrentHashMap 的整体架构 ConcurrentHashMap 的基本功能 ConcurrentHashMap 在性能方面的优化 ConcurrentHashMap 的整体架构 这个是 ConcurrentHashMap 在 JDK1.8 中的存储结构,它是由数组、单向链表、红黑树组成. 当我们初始…...

Go语言“Go语言:掌握未来编程的利器“

Go语音的发展史可以追溯到2009年,当时谷歌公司推出了一款名为“Google Assistant”的智能助手,它使用自然语言处理技术来与用户进行交互。随后,Go语音逐渐发展成为一种广泛使用的语音技术,其发展历程如下: 起步阶段&a…...

达梦管理工具报错“结果集不可更新,请确认查询列是否出自同一张表,并且包含值唯一的列。”

在使用达梦数据库管理工具时,我们测试过程中时常需要更新表数据,有时为了便捷,会直接使用管理工具修改表数据的值,但偶尔会遇到“结果集不可更新,请确认查询列是否出自同一张表,并且包含值唯一的列。”的报…...

TensorFlow2从磁盘读取图片数据集的示例(tf.keras.utils.image_dataset_from_directory)

import os import warnings warnings.filterwarnings("ignore") import tensorflow as tf from tensorflow.keras.optimizers import Adam from tensorflow.keras.applications.resnet import ResNet50#数据所在文件夹 base_dir ./data/cats_and_dogs train_dir os…...

Unity开发过程中的一些小知识点

1、如何查询挂载了指定脚本的游戏物体 可以直接在Hierarchy面板上,搜索想要找的脚本名 2、如何将Unity生成的多个相同游戏物体获得序号 可以使用Unity的API Transform.GetSiblingIndex() 实现。 Transform.GetSiblingIndex()gameobject.idTransform.GetSiblingI…...

大语言模型(LLM)综述(一):大语言模型介绍

A Survey of Large Language Models 前言1. INTRODUCTION2. OVERVIEW2.1 大语言模型的背景2.2 GPT系列模型的技术演变 前言 随着人工智能和机器学习领域的迅速发展,语言模型已经从简单的词袋模型(Bag-of-Words)和N-gram模型演变为更为复杂和…...

在Ubuntu上安装和挂载NFS

在Ubuntu上安装和挂载NFS可以按照以下步骤进行: 安装NFS客户端工具:在Ubuntu上,可以使用以下命令安装NFS客户端工具: shell复制代码 sudo apt-get install nfs-common 创建挂载点:在本地Ubuntu计算机上,…...

Python 实现的简易数据库管理系统 (DBMS)

在这篇文章中,我们将深入探讨如何使用 Python 从头开始实现一个简易的数据库管理系统 (DBMS)。这不是一个生产级的 DBMS,但它为我们提供了一个如何构建数据库系统的基础概念。 1. 数据表的实现 首先,我们定义了一个 Table 类来模拟数据库中…...

1.初识MySQL

初识 MySQL 1.服务器处理客户端请求2.常用存储引擎3.关于存储引擎的一些操作3.1 查看当前服务器程序支持的存储引擎3.2 设置表的存储引擎3.2.1 创建表时指定存储引擎3.2.2 修改表的存储引擎 4.总结 MySQL 默认采用 TCP/IP 的方式来处理客户端与服务器连接过程。 1.服务器处理客…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

JVM垃圾回收机制全解析

Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层&#xf…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...