我有一个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(字符串 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) 在Upload.ProcessRequest(HttpContext context)
该过程正在使用用户NT AUTHORITY \ NETWORK SERVICE运行。 IIS配置为使用匿名身份验证。匿名用户是管理员,我将其设置为允许应用程序运行而不必担心权限。
在我的开发机器中,我有办公室2010 beta1。我已经在Office 2007的pc中测试了可执行文件。如果我从服务器中的可执行文件运行代码,安装了Office 2003,它就可以完美运行。
为确保权限不会出现任何问题,服务器中的每个人都可以完全访问该网站。该网站在IIS7和经典模式下运行。
我还听说Open-office有一个能够做到这一点的API,但我找不到任何关于它的东西。我不介意使用DLLImport做我必须做的事情,我可以在Web服务器上安装open-office。不要担心重写这个方法,只要参数相同,一切都会有效。
感谢您的帮助。
答案 0 :(得分:10)
不要使用ASP.NET应用程序中的Office Interop。请参阅Considerations for server-side Automation of Office。
但是,如果您没有其他选择,则在Windows Server 2008上需要创建以下目录才能使其正常工作:
Windows 2008 Server x64:C:\ Windows \ SysWOW64 \ config \ systemprofile \ Desktop Windows 2008 Server x86:C:\ Windows \ System32 \ config \ systemprofile \ Desktop
答案 1 :(得分:1)
在考虑在服务器上使用Office Automation时,您可能需要阅读以下知识库文章中的信息。
http://support.microsoft.com/kb/257757
上述链接中的关键词
Microsoft目前不建议也不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT服务)自动化Microsoft Office应用程序,因为Office在此环境中运行Office时,可能会出现不稳定的行为和/或死锁。
我可以证实以上情况属实,而不仅仅是MS试图阻止你......
答案 2 :(得分:1)
在我的情况下(将演示文稿转换为视频,我与打开的东西有非常相似的问题)这有助于:
创建以下目录:
C:\的Windows \ Syswow64资料\配置\ systemprofile \桌面
C:\ Windows \ System32 \ config \ systemprofile \ Desktop(我没有这个)
我的操作系统Windows Server 2012 R2 Standard
答案 3 :(得分:0)
Interop库要求将相关应用程序安装在运行它们的计算机上。即,为了使其在您的生产服务器上运行,您需要在该服务器上安装Office。这通常是一个糟糕的主意。设置类型存在许多问题,因为每次有人发出请求时,都会启动相关应用程序的新实例(在您的情况下为PowerPoint)。
如果要在中央服务器上解析PowerPoint文件,则应使用读取PowerPoint文件的库。我知道Aspose制作了这样的产品(Aspose.Slides),但也有其他产品。
如果文档位于PowerPoint 2007中,您可以解析Open Office XML以获取所需的数据。有关详情,请参阅Introducing the Office (2007) Open XML File Formats和Open XML SDK 2.0 for Microsoft Office。
答案 4 :(得分:0)
我可能错了,最近开始研究类似的事情。但是,您不应该在计算机上安装办公室来创建或编辑2007+办公文件。它们基本上是具有不同扩展名的zip文件。如果您将其重命名为.zip,您应该会看到所有文件并能够直接编辑它们。
然后可以解压缩,所有文件都在那里。您可以以类似的方式创建新文件
答案 5 :(得分:0)
不要使用ASP.NET应用程序中的Office Interop。请参阅Considerations for server-side Automation of Office。
但是,我只是想在此注意,我必须在使用Office 2010的Windows 7 Professional 64位计算机上执行Murthy Pantham所描述的修复。它不有Windows 7 Service Pack 1或已安装Office 2010 Service Pack 3。所以这里的教训显然是修复不仅限于Server 2008.希望这有助于某人。