2

我有一种使用 Microsoft.Office.Interop.PowerPoint.Application 接口将 PowerPoint 演示文稿幻灯片转换为 jpeg 文件的方法。在 Windows 2008 服务器上运行的服务应用程序中,它可以正常工作。

但是,现在我正在编写一个新的 Web 应用程序,它使用相同的进程,并且 Presentation.Open 调用上的 degubber 阻塞并出现错误:“PowerPoint 无法打开文件”。

我的环境是 Win 7,VS 2010。我正在使用具有管理员权限的域帐户进行模拟。我试图打开的 PowePoint 文件位于 c:\temp 文件夹中,该文件夹的“所有人”的 NTFS 权限设置为完整;文件不是只读的,我可以使用与我用于模拟的域帐户类似的帐户手动打开文件。我不知道问题是什么。有人可以建议发生了什么吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using AjaxControlToolkit;
using Microsoft.Office.Core;
using Microsoft.Office.Interop.PowerPoint;
using System.Threading;


public partial class _Default : System.Web.UI.Page
{
  private static int folderExtension;
  private static string tempSavePath,
                        fileName;

  protected void Page_Load(object sender, EventArgs e)
  {

  }

  private void Page_Error(object sender, EventArgs e)
  {
    Random r = new Random();
    int eventID = r.Next(1, 65535);
    Exception objErr = Server.GetLastError().GetBaseException();
    string err = "\nPage_Error Event" +
            "\n\nError in: " + Request.Url.ToString() +
            "\n\nError Message:" + objErr.Message.ToString() +
            "\n\nStack Trace:" + objErr.StackTrace.ToString() +
            "\n";
    uploadResult.Text = err.ToString();        
  }

  protected void AsyncFileUpload1_click(object sender, AsyncFileUploadEventArgs e)
  {
     // Temporary folder where the presentation file is uploaded.
     tempSavePath = @"c:\temp\";

     // Checks if there is a file present for uploading.
     if (AsyncFileUpload1.HasFile)
     {
        fileName = AsyncFileUpload1.FileName;

        try
        {
            AsyncFileUpload1.SaveAs(tempSavePath + fileName);
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            ConvertToJpegs();
        }
     }
     else
     {
        uploadResult.Text = "No file to upload.";
     }
 }

 // Converts the presentation slides into individual jpeg files.
 protected void ConvertToJpegs()
 {
    Microsoft.Office.Interop.PowerPoint.Application app = new Microsoft.Office.Interop.PowerPoint.Application();
    Microsoft.Office.Core.MsoTriState ofalse = Microsoft.Office.Core.MsoTriState.msoFalse;
    Microsoft.Office.Core.MsoTriState otrue = Microsoft.Office.Core.MsoTriState.msoTrue;

    Presentation pptPresentation = null;

    try
    {
     **>>> It break here with the ".Open" call <<<**   
        pptPresentation = app.Presentations.Open(tempSavePath + fileName, ofalse, ofalse, ofalse);
        pptPresentation.SaveAs(tempSavePath + ".", PpSaveAsFileType.ppSaveAsJPG, ofalse);
        Thread.Sleep(500);
    }
    catch (Exception ex1)
    {
        throw ex1;
    }
    finally
    {
        pptPresentation.Close();
    }
  }
}
4

2 回答 2

1

首先,微软似乎不支持/不推荐您尝试实现的目标:

所有当前版本的 Microsoft Office 都经过设计、测试和配置,可作为最终用户产品在客户端工作站上运行。他们假设一个交互式桌面和用户配置文件。它们不提供满足设计为无人值守运行的服务器端组件的需求所必需的可重入性或安全性级别。

Microsoft目前不推荐也不支持任何无人值守、非交互式客户端应用程序或组件(包括 ASP、ASP.NET、DCOM 和 NT 服务)的 Microsoft Office 应用程序自动化,因为 Office 可能表现出不稳定的行为和/或在此环境中运行 Office 时出现死锁。

如果您正在构建在服务器端上下文中运行的解决方案,您应该尝试使用已确保无人值守执行安全的组件。或者,您应该尝试找到允许至少部分代码在客户端运行的替代方案。如果您使用来自服务器端解决方案的 Office 应用程序,该应用程序将缺少许多成功运行所需的功能。此外,您将承担整体解决方案稳定性的风险。

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

话虽如此,似乎其他几个人在这些设置下也经历过类似的行为,所以我建议你看看:

此外,为了检查您是否打开了.pptx右侧,我刚刚在标准台式 PC 上使用 PowerPoint Interop v. 15(适用于 Office 2013)在 C# .NET 4.5 控制台应用程序中尝试了代码示例的 PowerPoint Interop 位。这是开箱即用的。

于 2012-11-20T06:58:13.753 回答
0

你如何运行你的网络应用程序?是 IIS 7.5 还是 Asp.Ne 开发服务器?如果是 asp.net 开发服务器,你应该以管理员身份启动它。如果那是 IIS,我将需要 IIS 版本。

于 2012-11-16T23:14:57.330 回答