目录
多年学习工作的过程中,积累了许许多多各型各色的PPT模板,为了将这些ppt制成略缩图并上传到我的资源分享网站,以便大家浏览挑选,我选择通过python自动化帮我完成格式转变、提取信息的所有流程。
如果直接上网搜索对ppt截图的代码,会得到下面的答案,但是如果真的执行此代码,大概率会报错(比如我),comtypes没有权限去打开ppt文件,会在powerpoint.Open(path_to_ppt)这一步报错。
import os
import comtypes.client
def export_presentation(path_to_ppt, path_to_folder):
if not (os.path.isfile(path_to_ppt) and os.path.isdir(path_to_folder)):
raise "Please give valid paths!"
powerpoint = comtypes.client.CreateObject("Powerpoint.Application")
# Needed for script to work, though I don't see any reason why...
powerpoint.Visible = True
powerpoint.Open(path_to_ppt)
# Or some other image types
powerpoint.ActivePresentation.Export(path_to_folder, "JPG")
#这里可以写成:
#Presentation.Slides[1].Export("C:/path/to/jpg.jpg","JPG",800,600);
powerpoint.Presentations[1].Close()
powerpoint.Quit()



针对以上代码的问题,我重新编写了所有的功能模块,并添加了额外的处理步骤,让代码每次执行前可以自己识别进度、处理异常,能很好的面对大体量ppt转pdf/jpg/png的场景。以下是功能代码,在Jupyter Notebook中执行,运行环境为Python 3.9。
PPT/PPTX转PDF

第一部分中ppt2pdf(filename, output_filename,filename_forprint)模块我添加了额外的参数filename_forprint,这是方便在转换过程中代码实时向我汇报工作进度。
主体代码中,用户只需要改变dirname参数内的文件位置,就可以在任何文件夹下,处理转换里面所有的ppt/pptx格式文件,代码会自己读取识别文件夹下的所有文件内容,并排除文件夹格式的文件以及无关的文件,即:只留下所有有文件后缀为.pdf/ppt/pptx的文件。


接下来的代码,会继续执行查看文件夹内的文件。如果ppt已经被转换为pdf,代码会从记录表中删除记录,使之后的代码免除重复执行转换;如果遇到其他文件夹内的错误,也会相应报警提示。之后开始执行下半段代码,将没有转换为pdf的ppt文件按照ppt的名字进行转换,输出的pdf结果和ppt源文件在同一级。



如果遇到错误,会如左图报警;如果转换失败也不会直接报警弹出,而是跳过并指出所有没有成功转换的ppt文件名。此代码可以重复执行、去处理没有成功转换的ppt文件。但这不意味一定会完成转换,有些情况下ppt由于权限(如下图),代码实在无法转换,请通过手工转换或重新保存文件为有权限的ppt后再尝试执行。全部(再次)成功转换后会输出信息如上图、右上图。



PDF转图片

PDF转图片的模块中有三部分的代码,首先 pdf2img(dirname,filename,base) 函数控制图片的输出以及参数的设置,其中zoom_x、zoom_y是每张slide宽高的缩放比,值越小 输出的图片尺寸、空间越小,可以通过改变此值控制输出的图片占用空间。重新编写的pm.writePNG(dirname + r’\\’ +base+ r’\\’+base+r’%s.png’ % count) 则负责控制每张slide的命名,命名规则为:ppt的文件名+每张ppt的slide的序号,这样在上传到VPS的过程中,只要ppt命名不冲突,所有的图片命名也不会冲突。
其次 mkdir(path) 负责文件夹的创建,原代码将所有图片输出和ppt文件处于同一文件夹下,文件夹内的结果混乱无序无法查找,通过这个函数我们将每张ppt的截图都存储在ppt对应名字的文件夹下,如果没有文件夹就创建对应文件夹,例如:
商业计划PPT模板 (4).ppt (共3页PPT)
- 商业计划PPT模板 (4)\商业计划PPT模板 (4)00.jpg
- 商业计划PPT模板 (4)\商业计划PPT模板 (4)01.jpg
- 商业计划PPT模板 (4)\商业计划PPT模板 (4)02.jpg
最后就是主体代码,负责执行函数运行所有的转换程序。这块程序会实时显示执行过程,并在所有进程完成后输出”转换完成“的结果,如下:

结果展示
接下来就只要等我们的输出结果啦,下图就是所有程序完成后,文件夹内的部分文件截图。但是在执行代码前有一点需要注意:在ppt命名时,不要出现重复命名的情况(如:商业计划PPT模板 (4).ppt和商业计划PPT模板 (4).pptx),会出现覆盖的情况,所以面对大体量ppt文件命名时,需要注意对ppt和pptx分别命名,区分开来。
最后感谢你的阅读,希望我的代码可以帮助到你。
