最近忙期末复习,才发现老师的课件都是 20MB 一个一个的,暴汗。分析了下,发现很多嵌入式的声音,而这些声音都是wav格式的,所以ppt被撑暴了,很不爽,所以研究了半个小时 Powerpoint.Application 这个VBA COM对象,写了个 SoundButtonRipper.vbs。
原理很简单,遍历一个ppt的所有形状(Presentation.Shapes),如果是自动绘图对象(AutoShape)并且类型是135(Sound Button),那么删除这个形状,最后另存为 原文件名_ripped.ppt
- Windows Vista Ultimate 32bit, Windows Script Host 5.7, Office 2007 with VBA 测试通过
-
- '======================================
- '
- 'SoundButtonRipper.vbs V1.0
- '
- 'Author: est
- 'Email: electroniXtar@Gmail.com
- 'Modified: 14:36 2007/7/9
- '
- '======================================
- '全局变量
- Dim PptApp, PptPre
- Set PptApp=CreateObject("powerpoint.application")
- PptApp.Visible=True '必须为True否则出错
- PptApp.WindowState=1 '最小化以免影响视线
- WScript.Sleep 1000
- Function RipSndBtns(strFilePath)
- Set PptPre=PptApp.Presentations.Open(strFilePath) '必须是完整路径,出错就用 8.3 路径
- 'Set PptPre=PptApp.ActivePresentation '测试用
- For Each PptSlide In PptPre.Slides
- For Each PptShape In PptSlide.Shapes
- 'WScript.Echo PptSlide.SlideIndex & " " & PptShape.Type & " " & PptShape.Id & " " & PptShape.AutoShapeType 测试用
- If PptShape.Type=1 And PptShape.AutoShapeType=135 Then
- PptShape.Delete
- End If
- Next
- Next
- '分析ppt的路径,另存为 原文件名_ripped.ppt
- strPathPart=Split(strFilePath,"\")
- strFileName=strPathPart(UBound(strPathPart))
- lenFileName=Len(strFileName)
- Call PptPre.Saveas(Left(strFilePath,Len(strFilepath)-lenFileName) & Left(strfilename,lenFileName-4)&"_ripped.ppt")
- Call PptPre.Close()
- End Function
- Call RipSndBtns(WScript.Arguments(0))
- PptApp.Quit
- '"E:\script\Powerpoint.Application\1.ppt" '测试用
测试了一下,一个20MB的ppt被压缩成 613KB,再WinRAR一下300KB,爽。