2010-04-16 27 views
5

我有一个ASP.NET 2.0的Web应用程序,应该上传一个PPT文件,然后将其幻灯片提取到图像。对于我已经进口office.dll和Microsoft.Office.Interop.PowerPoint.dll组件和写了下面的代码asp.net中的办公自动化问题。我可以使用替代办法,如开放式办公室,如果我知道如何

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 could not open the file. at 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。不要担心重写这个方法,只要参数是一样的,一切都会工作。

我感谢您的帮助。

+0

永远不要从ASP.NET应用程序使用Office Interop。请参阅[有关办公室服务器端自动化的注意事项](http://support.microsoft.com/kb/257757) – 2011-10-06 02:52:05

回答

0

Interop库需要将相关应用程序安装在运行它们的机器上。也就是说,为了在生产服务器上正常工作,您需要在该服务器上安装Office。这通常是一个可怕的想法。每次有人发出请求时,设置类型都有很多问题,所以应用程序的新实例(在您的案例中为PowerPoint)已启动。

如果您想解析中央服务器上的PowerPoint文件,那么您应该使用读取PowerPoint文件的库。我知道Aspose制造这种产品(Aspose.Slides),但也有其他人。

如果文档在PowerPoint 2007中,您可能可以解析Open Office XML以获取所需的数据。有关更多信息,请参阅Introducing the Office (2007) Open XML File FormatsOpen XML SDK 2.0 for Microsoft Office

+0

打开办公室资源的良好链接...不应该需要外部库来处理2007+ Office文件,尽管它们可能会使它更容易。 – Jon 2010-04-16 16:23:47

+0

服务器已经安装了Office 2003,我们只接受上载的ppt文件,而不是pptx。这就是为什么我正在考虑使用Open-Office。 – 2010-04-16 19:05:06

+0

是的,你不希望每个请求调用interop/com。您宁愿使用像“观看”文件夹这样的后台服务,以免发生交通事故。 – FlavorScape 2012-09-17 18:51:20

0

我可能是错的,最近开始寻找类似的东西。但是,您不应该在计算机上安装Office来创建或编辑2007+ Office文件。它们基本上是带有不同扩展名的zip文件。如果您将其重命名为.zip,则应该看到所有文件并能够直接编辑它们。

然后它可以解压缩,所有的文件都在那里。您可以用类似的方式创建新文件

+0

读取xml文件并不能真正帮助将幻灯片导出为图像,除非您可以用相同的方式构建这些幻灯片 – cjk 2010-04-16 16:30:32

1

当考虑在服务器上使用Office Automation时,您可能需要阅读以下知识库文章中的信息。

http://support.microsoft.com/kb/257757

从上面的链接

微软目前并不提倡一个关键短语,并且不支持,从任何无人参与的非交互式客户端应用程序或组件Microsoft Office应用程序自动化(包括ASP,ASP.NET,DCOM和NT服务),因为Office在此环境中运行时可能会出现不稳定的行为和/或死锁。

而且我可以证实,上面的是非常真实的,而不仅仅是MS试图劝阻你...

+0

是的,如果您直接自动化它们,您可能会考虑保姆程序在失败时重新启动办公室废话。 – FlavorScape 2012-09-17 18:55:51

10

千万不要使用Office互操作从ASP.NET应用程序。见Considerations for server-side Automation of Office

但是,如果你没有选择,Windows Server 2008上,您需要创建以下目录来得到这个工作:

的Windows 2008服务器的x64:C:\ WINDOWS \ Syswow64资料\ CONFIG \ systemprofile \桌面 Windows 2008 Server x86:C:\ Windows \ System32 \ config \ systemprofile \ Desktop

+0

这对我有效! – 2011-05-10 19:09:20

+1

你不知道这个问题给我们带来了多少挫折。如果你曾经在丹佛地区,我想给你买一瓶啤酒。谢谢。 – sarumont 2012-01-11 00:15:32

+0

非常感谢:)。 – Zafer 2012-05-08 12:43:07

0

永远不要从ASP.NET应用程序使用Office Interop。见Considerations for server-side Automation of Office

不过,我只是想在这里指出,我不得不这样做与Office 2010的它确实一个Windows 7专业版64位计算机上通过穆尔蒂Pantham描述的修补程序不有Windows 7 Service Pack 1或Office 2010的服务Pack 3已安装。所以这里的教训显然是修复不限于服务器2008年。希望这可以帮助某人。

+0

编辑是否更改我的回复的含义?不知道为什么有必要添加“不要从ASP.NET应用程序中使用Office Interop”,请参阅服务器端Office自动化注意事项。 – ptrc 2013-12-03 19:16:27

1

在我的情况(转换演示视频,和我有一个开放的东西非常类似的问题),这有助于:

创建以下目录:

C:\ WINDOWS \ Syswow64资料\设置\ systemprofile \桌面

C:\ WINDOWS \ system32 \设置\ systemprofile \桌面(我没有这个)

我的操作系统的Windows Server 2012 R2标准