最全总结 | 聊聊 Python 办公自动化之 PDF(上)
1. 前言
自动化办公,非 Python 莫属!
从本篇文章开始,我们继续聊聊自动化办公中另外一个常用系列:PPT
2. 准备一下
Python 操作 PPT 最强大的依赖库是:python-pptx
所以,在开始操作之前,我们需要在虚拟环境下安装这个依赖库
# 安装依赖
pip3 install python-pptx
3. PPT 结构
首先,我们需要了解一个 PPT 文档的页面结构
一个 PPT 文档对应一个 Presentation 对象
一个 Presentation 包含多个 Slide 对象,每一个 Slide 代表一个幻灯片
每一张幻灯片的内容都是由各种形状 Shape 组成
其次,PPT 中的内容元素都是由各种形状构成
比如:文字框、图片、占位符、表格、普通形状等
通过翻看源码,发现他们都定义在 MSO_SHAPE_TYPE 类中
最后,我们需要了解一下 PPT 中的 版式模板
使用 Presentation 对象的 属性方法 slide_layouts 可以获取内置的 11 种母版样式
# 使用Presentation获取PPT内置的11种版式样式
# 版式索引从0开始
slide_layout = presentation.slide_layouts[slide_style_index]
他们分别是:
Title Slide 标题幻灯片
Title and Content 标题和内容幻灯片
Section Header 节标题幻灯片
Two Content 两栏内容幻灯片
Comparison 比较幻灯片
Title Only 仅标题的幻灯片
Blank 空白幻灯片
Content with Caption 内容和标题的幻灯片
Picture with Caption 图片和标题的幻灯片
Title and Vertical Text 标题和竖排内容
Vertical Title and Text 竖排标题和文本
当然,也可以在 Microsoft PPT / WPS 中查看对应母版的样式
这里补充一下,除了内置的版式样式,也可以通过占位符 PlaceHolder 去自定义母版,满足一些特定的场景需求
4. 幻灯片管理
一个 PPT 文件是由一个或多张幻灯片组成
1-1 那如何添加一张一张幻灯片呢?
这里,只需要通过下面 3 个步骤
实例化一个 Presentation 对象
通过内置的版本样式,新建一个版本样式 Layout
通过版本样式 Layout,添加一张幻灯片
def add_slide(presentation, slide_style_index):
"""
在PPT文档中,以内置的版式添加幻灯片
:param presentation:文档对象
:param slide_style_index:版式索引
:return:
"""
# PPT版式样式
# 内置有11种版式样式
# 0:Title Slide 标题幻灯片
# 1:Title and Content 标题和内容
# 2:Section Header 节标题
# 3:Two Content 两栏内容
# 4:Comparison 比较
# 5:Title Only 仅标题
# 6:Blank 空白
# 7:Content with Caption 内容和标题
# 8:Picture with Caption 图片和标题
# 9:Title and Vertical Text 标题和竖排内容
# 10:Vertical Title and Text 竖排标题和文本
slide_layout = presentation.slide_layouts[slide_style_index]
# 通过样式Layout,新增一张幻灯片
slide = presentation.slides.add_slide(slide_layout)
return slide
# 1.1 新增幻灯片
slide1 = add_slide(self.presentation, 0)
slide2 = add_slide(self.presentation, 1)
slide3 = add_slide(self.presentation, 2)
slide4 = add_slide(self.presentation, 3)
1-2 获取已有的幻灯片或某一张幻灯片?
Presentation 对象的 slides 属性 会返回当前 PPT 文档中所有的幻灯片对象列表
def get_slides(presentation):
"""
获取所有的幻灯片
:param presentation:
:return:
"""
# 所有幻灯片
slides = presentation.slides
# 幻灯片数目
slide_num = len(slides)
return slides, slide_num
def get_slide(presentation, slide_index):
"""
根据索引,获取某一个幻灯片
:param presentation:
:param slide_index:页面索引,从0开始
:return:
"""
slides, slide_num = get_slides(presentation=presentation)
return slides[slide_index]
# 1.2.1 获取所幻灯片
slides, slide_num = get_slides(self.presentation)
print('现有幻灯片:', slides)
print('幻灯片数目:', slide_num)
# 1.2.2 获取某一个幻灯片
slide = get_slide(self.presentation, 1)
print(slide.shapes)
1-3 如果需要删除某一张幻灯片,如何破?
这个也简单,只需要先获取目前幻灯片对象,然后使用下面方法移除即可
def del_slide(presentation, slide_index=0):
"""
删除某一张幻灯片
:param presentation:
:param slide_index: 索引
:return:
"""
# 所有幻灯片的列表
slides = list(presentation.slides._sldIdLst)
# 根据索引,删除某一张幻灯片
presentation.slides._sldIdLst.remove(slides[slide_index])
# 1.3 根据索引,删除PPT文档中某一张幻灯片
# 比如:删除第4张幻灯片
del_slide(self.presentation, 3)
5. 文字及段落
我们首先需要指定一个幻灯片对象 Slide,它可以是已有的幻灯片,也可以是新建的一张幻灯片
接着,使用幻灯片对象的 slide.shapes 属性,获取当前幻灯片中的所有形状 Shape 组成的队列
最后利用形状队列的下面这个函数添加一个文本框,函数返回值为一个:文本框对象
add_textbox( left , top , width , height )
该函数参数分别为:
left 左边距
top 上边距
width 文字框宽度
height 文字框高度
这里需要引出另外一个概念:文字形状
PS:文字形状便于在文字框中添加段落和设置样式,通过「文本框对象」的属性函数 text_frame 获取
def insert_textbox(slide, left, top, width, height, unit=Inches):
"""
幻灯片中添加文本框
:param unit: 单元,默认设置为Inches
:param slide: 幻灯片对象
:param left: 左边距
:param top: 上边距
:param width: 宽度
:param height: 高度
:return:
"""
# 文本框
textbox = slide.shapes.add_textbox(left=unit(left),
top=unit(top),
width=unit(width),
height=unit(height))
# 文本框形状
tf = textbox.text_frame
return textbox, tf
为了便于使用,我对幻灯片中插入文字框这一动作进行了一次封装
长度单位默认设置为:Inches,也可以自定义为厘米等单位
接下来,我们来操作文字框及段落的常见操作
1-1 插入文本框,并设置默认段落内容
插入文本框的同时,文本框形状对象会自带一个段落,可以对这个段落设置内容
# 2、往幻灯片中插入一个文本框,返回一个文本框对象和一个文本框形状对象
textbox, tf = insert_textbox(slide, 8, 2, 10, 4, unit=Cm)
# 2.1 默认的段落
paragraph_default = tf.paragraphs[0]
paragraph_default.text = "设置段落默认的内容"
1-2 文本框中新增一个段落
查看源码发现,文本框形状对象是 TextFrame 的子类,因此可以使用 TextFrame 类中的 add_paragraph() 函数添加一个新的段落
# 2.2 添加一个新的段落
paragraph_new = tf.add_paragraph()
# 2.3 给段落设置内容
paragraph_new.text = "欢迎关注公众号:AirPython\n每周分享 Python 原创技术干货!"
1-3 设置段落及文字样式
和 Word 一样,使用 python-pptx 同样可以设置 PPT 文档的段落样式
其中
对齐方式:对齐方式是针对段落的,只需要指定段落对象的 alignment 的属性值即可
def set_parg_font_style(paragraph, font_name=None, font_color=None, font_size=-1, font_bold=False, font_italic=False,
paragraph_alignment=PP_ALIGN.CENTER):
"""
设置段落中文本的样式,包含:字体名称、颜色、大小、是否加粗、是否斜体
:param paragraph_alignment: 段落对齐方式
:param paragraph:
:param font_name:
:param font_color:
:param font_size:
:param font_bold:
:param font_italic:
:return:
"""
# 对齐方式
# 注意:对齐方式是针对段落的
paragraph.alignment = paragraph_alignment
# 获取段落中字体对象
font = paragraph.font
# 设置字体样式
set_font_style(font, font_name, font_color, font_size, font_bold, font_italic)
return font
段落文字属性:使用段落对象的 font 属性获取字体对象,接着设置字体名称、大小、颜色、是否斜体、加粗
def set_font_style(font, font_name=None, font_color=None, font_size=-1, font_bold=False, font_italic=False):
"""
设置字体样式
:param font:
:param font_name:
:param font_color:
:param font_size:
:param font_bold:
:param font_italic:
:return:
"""
# 字体名称
if font_name:
font.name = font_name
# 字体颜色
if font_color and len(font_color) == 3:
font.color.rgb = RGBColor(font_color[0], font_color[1], font_color[2])
# 字体大小
if font_size != -1:
font.size = Pt(font_size)
# 是否加粗,默认不加粗
font.bold = font_bold
# 是否倾斜,默认不倾斜
font.italic = font_italic
1-4 设置文字框的背景颜色
设置文字框背景颜色只需要 2 步
将形状的填充类型设置为纯色
设置文字框的背景颜色
def set_widget_bg(widget, bg_rgb_color=None):
"""
设置【文本框textbox/单元格/形状】的背景颜色
:param widget:文本框textbox、单元格、形状
:param bg_rgb_color:背景颜色值
:return:
"""
if bg_rgb_color and len(bg_rgb_color) == 3:
# 1、将形状填充类型设置为纯色
widget.fill.solid()
# 2、设置文本框的背景颜色
widget.fill.fore_color.rgb = RGBColor(bg_rgb_color[0], bg_rgb_color[1], bg_rgb_color[2])
# 4、设置文字框的背景颜色
set_widget_bg(textbox, [0, 255, 0])
需要指出的是,该方法同样适用于设置表格单元格、普通形状的背景颜色
1-5 文本框的自动对齐
一旦文本框设置一段很长的文字,单行可能显示不完全
这时候,我们只需要设置文字形状的 word_wrap 值为 True,则可以让文本框的文字自动换行显示
# 5、设置文本框的文字自动对齐
tf.word_wrap = True
6. 最后
受限于篇幅,本篇文章仅聊到了 PPT 的结构、幻灯片管理、段落及文字;更多复杂操作、项目实战,会在后面的文章中进行说明
要获取全部源码,关注公众号「 AirPython 」,后台回复「 ppt 」即可获得全部源码
如果你觉得文章还不错,请大家 点赞、分享、留言下,因为这将是我持续输出更多优质文章的最强动力!
推荐阅读
最全总结 | 聊聊 Python 办公自动化之 Excel(上)
最全总结 | 聊聊 Python 办公自动化之 Excel(中)
最全总结 | 聊聊 Python 办公自动化之 Excel(下)
最全总结 | 聊聊 Python 办公自动化之 Word(上)
最全总结 | 聊聊 Python 办公自动化之 Word(中)
最全总结 | 聊聊 Python 办公自动化之 Word(下)
最全总结 | 聊聊 Python 办公自动化之 PDF(上)的更多相关文章
- 最全总结 | 聊聊 Python 办公自动化之 Excel(中)
1. 前言 上一篇文章中,我们聊到使用 xlrd.xlwt.xlutils 这一组合操作 Excel 的方法 最全总结 | 聊聊 Python 办公自动化之 Excel(上) 本篇文章将继续聊另外一 ...
- 最全总结 | 聊聊 Python 办公自动化之 Excel(下)
1. 前言 前面谈到 Python 处理 Excel 文件最常见的两种方式,即:xlrd/xlwt.openpyxl 其中, xlrd/xlwt 这一组合,xlrd 可以负责读取数据,而 xlwt ...
- 最全总结 | 聊聊 Python 办公自动化之 Word(上)
1. 前言 日常自动化办公中,使用 Python 真的能做到事半功倍! 在上一个系列中,我们对 Python 操作 Excel 进行了一次全面总结 最全总结 | 聊聊 Python 办公自动化之 Ex ...
- 最全总结 | 聊聊 Python 办公自动化之 Word(中)
1. 前言 上一篇文章,对 Word 写入数据的一些常见操作进行了总结 最全总结 | 聊聊 Python 办公自动化之 Word(上) 相比写入数据,读取数据同样很实用! 本篇文章,将谈谈如何全面读取 ...
- 最全总结 | 聊聊 Python 办公自动化之 Word(下)
1. 前言 关于 Word 文档的读写,前面两篇文章分别进行了一次全面的总结 最全总结 | 聊聊 Python 办公自动化之 Word(上) 最全总结 | 聊聊 Python 办公自动化之 Word( ...
- 最全总结 | 聊聊 Python 办公自动化之 PPT(中)
1. 前言 上一篇文章简单地介绍了 PPT 的文档结构,并使用 python-pptx 这个依赖库完成对 PPT 文档最基本的操作 最全总结 | 聊聊 Python 办公自动化之 PPT(上) 作为 ...
- 最全总结 | 聊聊 Python 办公自动化之 Excel(上)
1. 前言 在我们日常工作中,经常会使用 Word.Excel.PPT.PDF 等办公软件 但是,经常会遇到一些重复繁琐的事情,这时候手工操作显得效率极其低下:通过 Python 实现办公自动化变的很 ...
- 最全总结 | 聊聊 Python 数据处理全家桶(PgSQL篇)
1. 前言 大家好,我是安果! Python 数据处理全家桶,截止到现在,一共写过 6 篇文章,有兴趣的小伙伴可以去了解一下! 最全总结 | 聊聊 Python 数据处理全家桶(Mysql 篇) 最全 ...
- 最全总结 | 聊聊 Python 数据处理全家桶(Mysql 篇)
1. 前言 在爬虫.自动化.数据分析.软件测试.Web 等日常操作中,除 JSON.YAML.XML 外,还有一些数据经常会用到,比如:Mysql.Sqlite.Redis.MongoDB.Memch ...
随机推荐
- 对于线程池ThreadPool的学习总结
线程池:就是一个管理线程的池子. 优点: 它帮我们管理线程,避免增加创建线程和销毁线程的资源损耗.因为线程其实也是一个对象,创建一个对象,需要经过类加载过程,销毁一个对象,需要走GC垃圾回收流程,都是 ...
- 全网最全!这份深入讲解jdk和jvm原理的笔记,刷新了我对JVM的认知
前言 前两天和朋友探讨技术的时候有聊到JVM和JDK这一块,聊到这里两个人就像高山流水遇知音那是根本停不下来,事后我想着趁现在印象还比较深刻就把这些东西整理起来分享给大家来帮助更多的人吧.话不多说,满 ...
- Docker这么火爆。章节一:带你详尽了解Docker容器的介绍及使用
前言 很多小伙伴可能在工作中都听说过Docker,但是实际工作中却没有使用过,听得多了,也对Docker内心有一种很深切的想了解,但是因为各种原因而不知道如何去了解而发愁,不要急,这篇文章带你认识Do ...
- 如何输入x的平方
随着电脑的普及,现在都流行在电脑上做教学课件,撰写文章,尤其是理科文献,涉及的数学符号有很多,它包括了我们常见的四则运算符号和平方.立方等,也包括了高等数学中用到的积分.极限符号等,打这些公式就需要用 ...
- AFNetWorking 丢失数据
问题描述: 使用AFNetWorking请求数据,请求成功,但是拿不到所需要的数据,但是使用其他平台都可以拿到数据. 原因分析: AFNetWorking无法解析. 解决方式: AFJSONRespo ...
- 【电子取证:镜像仿真篇】Windows Server镜像仿真、vmdk镜像仿真
Windows Server镜像仿真.vmdk镜像仿真 时间过得真快呀!--[suy999] Windows Server镜像仿真.vmdk镜像仿真 一.qemu-img镜像转换工具 (一)raw.q ...
- Java蓝桥杯01——第一题集锦:堆煤球、购物单、哪天返回、第几天、分数
堆煤球(2016JavaB) 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100 ...
- jmp使用
jps -l jmap 36429 jmap -heap 36429 jmap -histo:live 36429 jmap -clstats 36429 jmap -finalizerinfo 3 ...
- MySQL 连接为什么挂死了
声明:本文为博主原创文章,由于已授权部分平台发表该文章(知乎.云社区),可能造成发布时间方面的困扰. 一.背景 近期由测试反馈的问题有点多,其中关于系统可靠性测试提出的问题令人感到头疼,一来这类问题有 ...
- 阿里云ECS服务器连接MongoDB
第一次接触MongoDB,第一次部署.将一些步骤整理出来,希望以后会用到,也希望能帮组到有这方面需求的小伙伴. 设备说明: 服务器为阿里云ECS服务器,网络为专有网络VPC,Mango为买的阿里云Ma ...