找回密码
 会员注册
查看: 27|回复: 0

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

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
73249
发表于 2024-9-4 15:59:56 | 显示全部楼层 |阅读模式
简介python-pptx是一个用于创建、读取和更新PowerPoint(.pptx)文件的python库。典型的用途是根据动态内容(如数据库查询、分析数据等),将这些内容自动化生成PowerPoint演示文稿,将数据可视化,方便查看我们也可以用它做办公自动化,定义一套模板,然后根据给出的内容批量生成PPT文件,大大提高我们的办公效率Python-pptx的Github地址https://github.com/scanny/python-pptx开发文档https://python-pptx.readthedocs.io/en/latest/安装python-pptxpipinstallpython-pptx本文使用的版本为0.6.21使用python-pptx创建新的PPT生成一个全新的PPT文件,这种方式适用于所有样式都是由代码来控制的场景幻灯片效果实现以上效果的代码frompptximportPresentation#创建一个新的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-pptxcreateit"#保存创建的PPT文件prs.save('G:/simple_ppt/test/test1.pptx')1234567891011121314151617上例中的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指定frompptx.utilimportCmprs=Presentation()prs.slide_width=Cm(33.85)prs.slide_height=Cm(19.02)123452、通过模板指定可以先自定义一个指定了宽高的空白页PPT模板,创建Presentation对象时引用它,后续创建的幻灯片就能继承到对应的宽高大小prs=Presentation("G:/simple_ppt/test/template.pptx")1创建文本段落创建想要在幻灯片中添加文本,先要通过add_textbox创建一个文本框,然后取得text_frame来进行操作frompptximportPresentationfrompptx.utilimportCmdeftest_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")12345678910111213141516171819202122232425生成效果如下Tips:上面代码中的:tx_box=slide.shapes.add_textbox(…slide.shapes代表的是当前幻灯片中所有元素的集合,如文本框、图片、图标、视频等等可框选的东西,都是shapes,所以若要添加什么东西,也是通过shapes.add_xxx的方式来实现文本样式添加一、自动换行如果我们输入的文本大于文本框的长度时,默认是不会换行的,可以使用tf.word_wrap来指定自动换行tf=tx_box.text_frametf.word_wrap=True12二、文本布局样式文本框中的文本默认是上方对齐,可以使用tfvertical_anchor来指定文本的布局方式frompptx.enum.textimportMSO_ANCHORtf=tx_box.text_frametf.vertical_anchor=MSO_ANCHOR.MIDDLE1234TOP:将文本与文本框顶部对齐MIDDLE:垂直居中文本BOTTOM:将文本与文本框底部对齐参考:https://python-pptx.readthedocs.io/en/latest/api/enum/MsoVerticalAnchor.html注意,这个只是指定了文本垂直方向上的移动,如想文本基于整个文本框居中需要指定段落的布局方式设置文本段落布局可以通过设置p.alignment的方式frompptx.enum.textimportMSO_ANCHOR,PP_ALIGNtf=tx_box.text_frametf.vertical_anchor=MSO_ANCHOR.MIDDLEp0=tf.paragraphs[0]p0.text='这是第一行段落'p0.alignment=PP_ALIGN.CENTER1234567效果如图PP_ALIGN的参数有以下几个CENTER:居中对齐DISTRIBUTE:在一行中从左到右均匀分布JUSTIFY:每行都在页边空白处开始和结束,并调整单词之间的间距,使该行正好填满段落的宽度JUSTIFY_LOW:在单词之间使用少量空格进行对齐LEFT:默认的,左对齐RIGHT:右对齐THAI_DISTRIBUTE:泰语分散对齐,输入泰语时候指定以上效果就不一一演示了,自己尝试下选择合适的就行参考:https://python-pptx.readthedocs.io/en/latest/api/enum/PpParagraphAlignment.html三、文字样式修改文字的字体、字号、加粗、斜体、下划线、颜色、超链接等,这些样式通过font来设置参数较多,直接上代码frompptximportPresentationfrompptx.utilimportCm,Ptfrompptx.dml.colorimportRGBColorfrompptx.enum.textimportMSO_ANCHOR,PP_ALIGNdeftest_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='ArialBlack'#字体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='HelloWorld!'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")1234567891011121314151617181920212223242526272829303132333435363738生成的效果注意,当给一个文本添加了超链接后,文字的颜色就无法指定了,会变成图中这种蓝色加下划线的样式段落间距设置可通过line_spacing指定p0.line_spacing=1.31文字大小自动改变有时候我们要输入的文本太长,而文本框区域有限,此时可以指定文字的大小根据文本框的大小自动调整文字的大小frompptx.enum.textimportMSO_AUTO_SIZEtf=tx_box.text_frametf.auto_size=MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE1234MSO_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默认就是0p2=tf.add_paragraph()p2.text='第一层'p2.level=0p3=tf.add_paragraph()p3.text='第二层'p3.level=1p4=tf.add_paragraph()p4.text='第三层'p4.level=21234567891011效果如下创建图片使用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))12left和top表示图片左上角顶点分别距离幻灯片左边框和上边框的距离,width和height表示图片的宽和高创建视频或音频添加视频使用add_movievideo_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')12视频显示的时候不会自动获取视频里的画面作为预览图,只会显示一个默认的喇叭图标,若想要根据视频的画面来生成预览图,可以借助OpenCV工具来获取视频帧存为图片,然后通过poster_frame_image参数来指定importcv2video_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)12345678910Python-pptx中并没有直接提供添加音频的方法,不过其实音频也可以通过add_movie来指定,只需要修改ime_type参数为audio/mp3audio_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')12效果如下创建形状图形Python-pptx中支持添加形状图形,也就是下面这些可通过add_shape来添加frompptx.enum.shapesimportMSO_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))123STAR_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)#修改边框宽度1234567还可以通过dash_style来指定边框的线条样式frompptx.enum.dmlimportMSO_LINEshape.line.dash_style=MSO_LINE.DASH#设置边框为虚线123MSO_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.backgroundbg.fill.solid()bg.fill.fore_color.rgb=RGBColor(219,238,244)123python-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)12slide_width和slide_height获取的分别是整张幻灯片的宽和高这里要注意图片的层级问题,由于没有提供设置图片层级的方法,所以作为背景的图片应该放在构建幻灯片的第一位纯色背景效果创建幻灯片备注信息幻灯片底部的备注信息,在分屏预览时可用于提示演讲人更详细的幻灯片内容细节通过has_notes_slide来判断幻灯片是否有备注,通过以下代码可以获得幻灯片的备注信息ifslide.has_notes_slide:text_frame=slide.notes_slide.notes_text_frameprint("备注文本:",text_frame.text)123若想修改备注信息,直接通过text指定即可text_frame=slide.notes_slide.notes_text_frametext_frame.text="被修改的备注信息"12备注修改效果总结本篇文章介绍了如何使用python-pptx框架生成PPTX文件的方法,通过以上学习,可以掌握如何通过Python-pptx框架控制幻灯片大小、创建各种样式的文本、在幻灯片中添加图片、视频和音频,添加形状图形及如何修改它的样式,如何设置幻灯片的背景和备注信息等技能下一篇将会介绍如何针对已有的PPT模板进行修改
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-12 20:54 , Processed in 0.504359 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表