VBA/Python/VBScript导出PowerPoint(PPT)幻灯片为JPG图片或者纯文本TXT

!本文可能 超过1年没有更新,今后内容也许不会被维护或者支持,部分内容可能具有时效性,涉及技术细节或者软件使用方面,本人不保证相应的兼容和可操作性。

最近需要对一堆幻灯片进行整理,为了便于检索,决定做一个全文检索系统,整个系统依旧考虑采用Python技术构建,不得不承认Python的开发效率挺高,我采用Flask+Whoosh一个下午就搭建好搜索平台了。今天把一些细节和大家分享一下,首先是幻灯片不同于Word文档,对于幻灯片的检索我是这样考虑的:对于每一张幻灯片分别保存一张图片和纯文本文字,然后让全文检索引擎检索文本,向最终用户提供纯文本和图片化的幻灯片。这里涉及的技术细节是如何将幻灯片导出为图片格式,当然这里还得请出ActiveX/COM对象VBA技术,对于幻灯片的控制采用的ProgID为PowerPoint.Application

这里同样的采用PyWin32Dispatch或者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

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

若无特别说明,本网站文章均为原创,原则上这些文章不允许转载,但是如果阁下是出于研究学习目的可以转载到阁下的个人博客或者主页,转载遵循创作共同性“署名-非商业性使用-相同方式共享”原则,请转载时注明作者出处谢绝商业性、非署名、采集站、垃圾站或者纯粹为了流量的转载。谢谢合作!
请稍后...

发表评论

电子邮件地址不会被公开。 必填项已用*标注