基本思路:使用 Microsoft Office 开放式编程组件。
在使用这个方法之前我有了解过许多其它方式,比如 Spire.Presentation,Aspose 这些组件,Spire.Presentation 使用起来很便捷,但是免费版有图片张数限制,Aspose 好像并不是单纯的 PPT 处理,应该是把 PPT 先转为 PDF,再从 PDF 进行输出的。但毕竟是商业项目,收费问题是避免不了的,而如果自己从底层解析 PPT 的话那难度过大,即使费好久功夫解析出来也要考虑很多兼容性的问题,所以最终我还是选择了 Microsoft Office 组件。不过使用 Office 套件的缺点实际上也非常明显,比如程序体积庞大,本来只需要这么一个小点的功能却要安装几个 GB 的多余部件,部署环境从此需要依赖 Windows + Office。不过倒是相比较其它商业项目,Microsoft Office 可以不必激活就能够使用可编程的组件(过期后可能会存在一点小问题),这确实是一个比较具有说服力的理由。功能的实现从代码上来看并不多:
using Microsoft.Office.Core;
using Microsoft.Office.Interop.PowerPoint;
Application app = new Application();
Presentation ppt = app.Presentations.Open(fileName, MsoTriState.msoTrue, MsoTriState.msoTrue, MsoTriState.msoFalse);
int slideCounts = ppt.Slides.Count + 1;
for (int i = 1; i < slideCounts; i++)
{
string picSavePath = "D:/filename_" + i + ".jpg";
ppt.Slides[i].Export(picSavePath, ".jpg");
}
ppt.Close();
app.Quit();
调用代码到这里实际上就已经完了,添加的引用是 COM 程序集里的 Microsoft PowerPoint 15.0 Object Library 与 Microsoft Office 15.0 Object Library,具体的版本号视情况而定。
【踩坑记】
虽然代码没有什么问题,或许本地调试也没有什么问题,但是部署到大多数的生产环境中多半是不能执行的,因为 COM 程序集的调用需要一定的权限,如果某些地方的配置不当就可能会遇到各种各样的错误,而且大多数的异常消息可能也很难看出问题所在。我是把程序作为 ASP.NET 网站给部署到 IIS 上的,比如下面就是我遇到的各种异常:

甚至还会有看似毫无关系的这种错误:

解决办法是把应用程序池的标识改为更高的权限所有者,比如 LocalSystem;这可能还不够,还需要在 Windows 组件服务(dcomcnfg)中设定 PPT 组件的权限:

安全选项卡中默认为管理员提供了权限,所以只要应用程序池设定了 LocalSystem 就不用去管它,否则就视情况更改用户的权限。

组件服务的配置完成后基本上大多数的环境都能够正常使用功能了,但是在我所用的环境中还遇到了另一个异常:

大概意思好像是什么类型不匹配,这个奇怪的问题困扰了我很长的时间,直到后面我重新引用 COM 组件时发现了金山公司的 WPS 也提供了一个名字叫做 office 的组件,里面具有 Microsoft.Office.Interop.PowerPoint 命名空间,里面具有错误中的这个 _Application 类型,我就发现我被误导了,用了微软的 PowerPoint 类型,却引用了金山的 Office 组件,我不明白究竟是金山 WPS 使用了微软 Office 的内核还是金山 WPS 篡改了微软 Office 的内核,反正我也装上了微软 Office,所以我就干脆把 WPS 给卸载掉,重新引用微软清一色的组件就好了,至此功能实现。