• 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')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    上例中的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)
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

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

    创建文本

    段落创建

    想要在幻灯片中添加文本,先要通过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")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

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

    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
    
    • 1
    • 2
    二、文本布局样式

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

    from pptx.enum.text import MSO_ANCHOR
    
    tf = tx_box.text_frame
    tf.vertical_anchor = MSO_ANCHOR.MIDDLE
    
    • 1
    • 2
    • 3
    • 4
    • 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    效果如图
    在这里插入图片描述
    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")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

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

    段落间距设置

    可通过line_spacing指定

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

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

    from pptx.enum.text import MSO_AUTO_SIZE
    
    tf = tx_box.text_frame
    tf.auto_size = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE
    
    • 1
    • 2
    • 3
    • 4

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

    创建图片

    使用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))
    
    • 1
    • 2

    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')
    
    • 1
    • 2

    视频显示的时候不会自动获取视频里的画面作为预览图,只会显示一个默认的喇叭图标,若想要根据视频的画面来生成预览图,可以借助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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    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')
    
    • 1
    • 2

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

    创建形状图形

    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))
    
    • 1
    • 2
    • 3

    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)  # 修改边框宽度
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    from pptx.enum.dml import MSO_LINE
    
    shape.line.dash_style = MSO_LINE.DASH  # 设置边框为虚线
    
    • 1
    • 2
    • 3

    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()
    
    • 1

    创建幻灯片背景

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

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

    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)
    
    • 1
    • 2

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

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

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

    创建幻灯片备注信息

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

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

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

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

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

    总结

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

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

  • 相关阅读:
    算法通关村第十关-白银挑战数组最大K数
    [Typescript]基础篇之接口
    深入理解Java虚拟机:Jvm性能调优
    不学51直接学stm32可以吗?学stm32需要哪些基础?
    计算机毕业设计选题推荐-体育赛事微信小程序/安卓APP-项目实战
    《学术小白学习之路》论文常见方法:Doc2vec-句向量模型实现
    Java通过HttpURLConnection访问页面并解析HTML文件元素
    MyBatis【一】
    如何在Linux系统中安装MySQL数据库
    基于springboot实现二手交易平台管理系统演示【项目源码】分享
  • 原文地址:https://blog.csdn.net/zhuwentao2150/article/details/134015468