我有一个 ASP.NET 2.0 Web 应用程序,它应该上传一个 ppt 文件,然后将其幻灯片提取到图像中。为此,我导入了 office.dll 和 Microsoft.Office.Interop.PowerPoint.dll 程序集并编写了以下代码
public static int ExtractImages(string ppt, string targetPath, int width, int height)
{
var pptApplication = new ApplicationClass();
var pptPresentation = pptApplication.Presentations.Open(ppt, MsoTriState.msoTrue, MsoTriState.msoFalse, MsoTriState.msoFalse);
var slides = new List<string>();
for (var i = 1; i <= pptPresentation.Slides.Count; i++)
{
var target = string.Format(targetPath, i);
pptPresentation.Slides[i].Export(target, "jpg", width, height);
slides.Add(new FileInfo(target).Name);
}
pptPresentation.Close();
return slides.Count;
}
如果我在本地机器、asp.net 或可执行文件中运行此代码,它会完美运行。但是如果我尝试在生产服务器中运行它,我会收到以下错误:
System.Runtime.InteropServices.COMException (0x80004005):PowerPoint 无法打开文件。在 Microsoft.Office.Interop.PowerPoint.Presentations.Open(String FileName, MsoTriState ReadOnly, MsoTriState Untitled, MsoTriState WithWindow) at PPTImageExtractor.PptConversor.ExtractImages(String caminhoPpt, String caminhoDestino, Int32 largura, Int32 altura, String caminhoThumbs, Int32 larguraThumb, Int32 alturaThumb, Boolean geraXml) at Upload.ProcessRequest(HttpContext context)
该进程正在使用用户 NT AUTHORITY\NETWORK SERVICE 运行。IIS 配置为使用匿名身份验证。匿名用户是管理员,我这样设置是为了让应用程序运行而不必担心权限问题。
在我的开发机器中,我有 Office 2010 beta1。我也在带有office 2007的电脑上测试了可执行文件。如果我从服务器中的可执行文件运行代码,并安装了 Office 2003,它运行完美。
为确保权限不会出现任何问题,服务器中的每个人都可以完全访问该网站。该网站在 IIS7 和经典模式下运行。
我还听说 Open-office 有一个 API 应该能够做到这一点,但我找不到任何关于它的信息。我不介意使用 DLLImport 来做我必须做的事情,我可以在 Web 服务器上安装 open-office。不用担心重写这个方法,只要参数相同,一切都会工作。
我感谢您的帮助。