.NET Framework 技术分享,C# 操作 PPT 导出为图片

c# 使用 microsoft office 组件导出 ppt 成图片

发布用户:小梦

2023/02/17 17:40


基本思路:使用 Microsoft Office 开放式编程组件。

在使用这个方法之前我有了解过许多其它方式,比如 Spire.PresentationAspose 这些组件,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 LibraryMicrosoft 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 给卸载掉,重新引用微软清一色的组件就好了,至此功能实现。



代码写多了,脑力不够用了,请我喝杯咖啡提提神 ☕

警告!禁止网络诈骗、非法集资、非法套现等法律外的缘由转账汇款,你的赞赏转账请考虑再三后支付,此收款不作任何形式的退款。





金额:

* 支付宝支付后如果没有自动返回请手动返回此页并刷新。



* 在线内容服务不支持任何形式的退款/退费操作;支付后的订单记录可以在“用户主页 - 用户订单中心”查看。

此网站可能不完全兼容您目前的浏览器!
此页随时可能被替换下线,请不要依赖此页功能!
此页正在维护更新,可能会出现错误或卡顿。
通知 & 公告

暂时还没有消息