请选择 进入手机版 | 继续访问电脑版
爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 2603|回复: 3

[源代码] 自动化办公:python制作ppt

[复制链接]
回帖奖励 47 金钱 回复本帖可获得 1 金钱奖励! 每人限 1 次

新浪微博达人勋

发表于 2021-9-25 10:11:57 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本文搬运自公众号:气象备忘录。分享编程语言和模式技巧,欢迎关注、点赞和转发~ 微信图片_20210925100732.jpg
https://mp.weixin.qq.com/s/gNwE9WvtnD44Grd50dcXRw


                               
登录/注册后可看大图



科研或者业务中,在制作ppt时常常遇到重复粘贴大量图片的情况,手动制作难免需要不断复制粘贴,裁剪白边,调整位置等一系列操作,颇为繁琐,这里介绍利用python自动生成ppt并批量贴图的方法,从此解放双手,ppt一键搞定,不仅可以节省大量时间,提高工作效率,还可大大提升幸福感哦。
现在以自动生成每页贴16张图片,图片按4×4方式排列的ppt为例,对方法进行详细介绍。(PS 脚本通顺,粘贴即可直接使用。)
首先需要导入的模块:
  1. import os
  2. from PIL import Image, ImageOps
  3. from pptx import Presentation
  4. from pptx.util import Inches, Pt, Cm
复制代码
对图片的处理主要分为三部分:
  • 裁剪图片白边:

  1. def crop_margin(img_fileobj, out, padding=(0, 0, 0, 0)):
  2.     image = Image.open(img_fileobj).convert('RGB')
  3.     ivt_image = ImageOps.invert(image)
  4.     bbox = ivt_image.getbbox()
  5.     left = bbox[0] - padding[0]
  6.     top  = bbox[1] - padding[1]
  7.     right  = bbox[2] + padding[2]
  8.     bottom = bbox[3] + padding[3]
  9.     cropped_image = image.crop([left, top, right, bottom])
  10.     cropped_image.save(out)
  11.     return
复制代码
  • 生成空白页:



  1. def new_page(prs, SLD_LAYOUT_TITLE_AND_CONTENT = 6):
  2.    slide_layout = prs.slide_layouts[SLD_LAYOUT_TITLE_AND_CONTENT]
  3.    slide = prs.slides.add_slide(slide_layout)
  4.    return slide
复制代码
  • 按照预设版式添加图片:

  1. def Add_pic(slide, img, img_left, img_top, img_height):
  2.     img_path = img
  3.     left = Cm(img_left)
  4.     top  = Cm(img_top)
  5.     pic  = slide.shapes.add_picture(img_path, left, top, height=Cm(img_height))
复制代码
下面是主程序代码:
  1. if __name__ == "__main__":

  2.     prs = Presentation()   # 新建ppt
  3.     prs.slide_width  = Cm(33.867)  # 调整页面大小
  4.     prs.slide_height = Cm(19.05)

  5.     imagePath = r'F:\kk'
  6.     imgs = os.listdir(imagePath)
  7.     imgs.sort()
  8.     imgs_list = [os.path.join(imagePath, i) for i in imgs if i[-4:] == '.png']

  9.     for ith,img in enumerate(imgs_list):
  10.         crop_margin(img, img)  #切除图片白边  
  11.         print(ith, img)
  12.         res = ith % 16   # 这里以一页ppt放16张图为例,获取图片序号

  13.         if res == 0:  slide = new_page(prs) # 如果是第一张图,则新建空白页
  14.         # 指定每一张图的位置信息(可以先手动贴图获取 )
  15.         if res in [0, 4,  8, 12]:  img_left = 0.12   #第一列
  16.         if res in [1, 5,  9, 13]:  img_left = 8.47   #第二列
  17.         if res in [2, 6, 10, 14]:  img_left = 16.94  #第三列
  18.         if res in [3, 7, 11, 15]:  img_left = 25.38

  19.         if res in [ 0,  1,  2,  3]:  img_top = 0.05     #第一行
  20.         if res in [ 4,  5,  6,  7]:  img_top = 4.64
  21.         if res in [ 8,  9, 10, 11]:  img_top = 9.25
  22.         if res in [12, 13, 14, 15]:  img_top = 13.91

  23.         Add_pic(slide, img, img_left, img_top, 5) # 贴图
  24.     prs.save(imagePath+'/pic.pptx') # 保存ppt
复制代码


贴出来的成品如下图所示:
QQ浏览器截图20210925100629.png


是不是十分整齐美观呢?按照上面脚本的思路,还可以衍生出一页ppt贴不同类型、大小、位置的图片、添加文本,以及编辑两页循环,三页循环等更加丰富的ppt版式,看到这里是不是已经心动了呢,那就赶快试一试吧!

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2021-9-25 10:19:51 | 显示全部楼层

回帖奖励 +1 金钱

很不错!!!!
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2021-9-29 15:59:21 | 显示全部楼层

回帖奖励 +1 金钱

{:5_213:}{:5_213:}{:5_213:}
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-12-13 22:42:42 | 显示全部楼层

回帖奖励 +1 金钱


很不错!!!!
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

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