2

Microsoft.Office.Interop.PowerPoint.Application インターフェイスを使用して PowerPoint プレゼンテーション スライドを jpeg ファイルに変換する方法があります。Windows 2008 サーバーで実行されるサービス アプリケーションでは、問題なく動作します。

しかし、現在、同じプロセスを使用する新しい Web アプリケーションを作成しており、degubber が Presentation.Open 呼び出しで「PowerPoint はファイルを開けませんでした」というエラーでチョークします。

私の環境は Win 7、VS 2010 です。管理者権限を持つドメイン アカウントで偽装を使用しています。私が開こうとしている PowePoint ファイルは、「全員」の NTFS 権限が完全に設定されている c:\temp フォルダーにあります。ファイルは読み取り専用ではありません。なりすましに使用しているドメイン アカウントと同様のアカウントを使用して、ファイルを手動で開くことができます。何が問題なのかわからない。誰かが何が起こっているのか提案できますか?

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によってサポートされていない/推奨されていないようです:

Microsoft Officeの現在のすべてのバージョンは、クライアントワークステーションでエンドユーザー製品として実行するように設計、テスト、および構成されています。インタラクティブなデスクトップとユーザープロファイルを想定しています。これらは、無人で実行するように設計されたサーバー側コンポーネントのニーズを満たすために必要なレベルの再入可能性またはセキュリティを提供しません。

Officeは不安定な動作を示す可能性があるため、Microsoftは現在、無人の非対話型クライアントアプリケーションまたはコンポーネント(ASP、ASP.NET、DCOM、およびNTサービスを含む)からのMicrosoftOfficeアプリケーションの自動化を推奨してません。または、Officeがこの環境で実行されている場合はデッドロック。

サーバー側のコンテキストで実行されるソリューションを構築している場合は、無人での実行に対して安全になっているコンポーネントの使用を試みる必要があります。または、コードの少なくとも一部がクライアント側で実行できるようにする代替手段を見つけるようにしてください。サーバー側のソリューションからOfficeアプリケーションを使用する場合、アプリケーションは正常に実行するために必要な機能の多くを欠いています。さらに、ソリューション全体の安定性でリスクを冒すことになります。

ソース:http ://support.microsoft.com/kb/257757

そうは言っても、他の何人かの人々がこれらの設定の下で同様の振る舞いを経験したようですので、私はあなたが見てみることをお勧めします:

さらに、右を開いていることを確認する.pptxために、標準のデスクトップPCでPowerPoint Interop v。15(Office 2013用)を使用して、C#.NET4.5コンソールアプリケーションでコードサンプルのPowerPointInteropビットを試しました。そして、それは箱から出して動作します。

于 2012-11-20T06:58:13.753 に答える
0

Web アプリをどのように実行しますか? IIS 7.5 または Asp.Ne 開発サーバーですか? asp.net 開発サーバーの場合は、管理者として起動する必要があります。それが IIS の場合、IIS のバージョンが必要になります。

于 2012-11-16T23:14:57.330 に答える