VBA/Python/VBScript导出PowerPoint(PPT)幻灯片为JPG图片或者纯文本TXT
提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!
最近需要对一堆幻灯片进行整理,为了便于检索,决定做一个全文检索系统,整个系统依旧考虑采用Python技术构建,不得不承认Python的开发效率挺高,我采用
Flask
+
Whoosh
一个下午就搭建好搜索平台了。今天把一些细节和大家分享一下,首先是幻灯片不同于Word文档,对于幻灯片的检索我是这样考虑的:对于每一张幻灯片分别保存一张图片和纯文本文字,然后让全文检索引擎检索文本,向最终用户提供纯文本和图片化的幻灯片。这里涉及的技术细节是如何将幻灯片导出为图片格式,当然这里还得请出ActiveX/COM对象VBA技术,对于幻灯片的控制采用的ProgID为
PowerPoint.Application
。
这里同样的采用
PyWin32
的
Dispatch
或者
DispatchEx
方法:
from win32com.client import DispatchEx
powerpoint = DispatchEx("PowerPoint.Application")
powerpoint.Visible = True # 为了便于查阅PPT工作情况,这里设置为可见
powerpoint.DisplayAlerts = False # 为了使工作不中断,忽略可能的弹出警告
这里再提供一段对应的VBScript的代码片段,供大家参考,我就不测试了:
Dim objPowerPoint
Set objPowerPoint = CreateObject("PowerPoint.Application")
objPowerPoint.Visible = True
objPowerPoint.DisplayAlerts = False
PowerPoint.Application
对象自带有导出(Export)功能,可以直接将单张PPT幻灯片导出为图像格式,所以对于整个PPT文件,我们只需要枚举每一张幻灯片然后调用Export即可:
import os
filename = "/path/to/file" # 这里是幻灯片PPT文件所在位置
export_dir = os.getcwd() # 导出图像存放的文件夹,这里是当前文件夹
ppt = powerpoint.Presentations.Open(filename)
for i,slide in enumerate(ppt.Slides):
slide.Select
fullpath = os.path.join(export_dir, "%d.jpg" % i)
slide.Export(fullpath, "JPG")
ppt.Close()
同样的VBScript版本如下:
Dim i, objPPT, objSlide, strFileName, strExportDir
strFileName = "/path/to/file" ' 这里是幻灯片PPT文件所在位置
strExportDir = "/path/to/dir" ' 导出图像存放的文件夹
i = 0
Set objPPT = objPowerPoint.Presentations.Open(strFileName)
For Each objSlide In objPPT.Slides
objSlide.Select
objSlide.Export(strExportDir & "\" & i & ".jpg", "JPG")
i += 1
Next
objPPT.Close
Set objPPT = Nothing
到这里我们已经可以依次导出一个PPT文件中所有的幻灯片为jpeg图像格式了,在我做检索系统的时候图片不能被直接索引,所以我们还需要导出对应的文本内容,对于文本的导出可以依次枚举每张幻灯片的Shape,然后判断是否有文本框,然后进一步判断文本框是否有文字,我在这里给出的是一个函数,用于处理PPT文件中单张幻灯片并解出纯文本的:
def extract_slide_text(slide):
result = []
for shape in slide.shapes:
if shape.HasTextFrame:
if shape.TextFrame.HasText:
result.append(shape.TextFrame.TextRange.Text)
return "\n".join(result)
对应的VBScript如下所示:
Function ExtractTextFromSlide(objSlide)
Dim objShape, strResult : strResult = ""
For Each objShape In objSlide.Shapes
If objShape.HasTextFrame Then
If objShape.TextFrame.HasText Then
strResult = strResult & objShape.TextFrame.TextRange.Text
strResult = strResult & vbCrLf
End If
End If
Next
ExtractTextFromSlide = strResult
End Function
好了,有了图片和解出来的文字,我们只要对应编排好就可以对整个幻灯片进行索引了,今天的内容就介绍到这儿。