批量转换PPT至PDF/图片格式
批量转换PPT至PDF/图片格式

批量转换PPT至PDF/图片格式

目录

多年学习工作的过程中,积累了许许多多各型各色的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()
				
			

重新搜索后,在网上找到了合适的解决方案一解决方案二但是这两个方案并不完美,在实际执行过程中有如下缺陷:

  1. 无法处理带有保护的ppt文件,会报错弹出无法知道具体错误情况
  2. 对输出的ppt图片命名过于笼统(全部为tu00,tu01,…tu999),在服务器中上传多个ppt时,名字会彼此冲突
  3. 万一遇到意外情况报错,只能重新从头执行无法自我读取、智能识别批处理进度。耗费大量无意义时间创建重复文件覆盖已有文件
  4. 无法控制输出图片分辨率大小
  5. 图片输出的路径不规范、和ppt处于同一文件夹下,文件夹内的输出结果混乱无序无法查找

针对以上代码的问题,我重新编写了所有的功能模块,并添加了额外的处理步骤,让代码每次执行前可以自己识别进度、处理异常,能很好的面对大体量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分别命名,区分开来。

最后感谢你的阅读,希望我的代码可以帮助到你。

密码
To view this protected content, enter the password below:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注