提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

最近需要对一堆幻灯片进行整理,为了便于检索,决定做一个全文检索系统,整个系统依旧考虑采用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

好了,有了图片和解出来的文字,我们只要对应编排好就可以对整个幻灯片进行索引了,今天的内容就介绍到这儿。