1

VSTO を使用してドキュメントをダウングレードしようとしています。

バイト配列を受け取る Web サービスがあります。このバイトは、現在アクティブなドキュメントからのものです。

Web サービスは、2007/2003 ワードの doc ファイルのみを処理できます。

だから私は使いたい

document.DowngradeDocument();

しかし、バイト配列を送信すると、Web サービスはエラーを報告します。名前を付けて保存し、単語を強制的に 2007/2003 doc 形式で保存する場合、問題はありません。

だから私の質問は:

1) DowngradeDocument() 関数が機能しないのはなぜですか。適切なダウングレードを行っていないのはなぜですか。2) DowngradeDocument() を呼び出したときに何か他のことをする必要がありますか?

たまたま作業中のファイルがディスクに保存されていないため、これはメモリ内にある必要があります。

// デニス

これを読んでくれてありがとう

--- d を編集します。20120904 ---

エラーの意味がわからないため、Webサービスエラーを使用できません。ファイルを見つけることができると表示されていますが、これは相手側のアプリケーション内のエラーです。

そのため、ドキュメントを正しい形式で保存し、ダウングレードしたものを保存しようとしました。同じコードを使用しました。1つは機能し、もう1つは機能しませんでした。

ただし、ファイルを一時的に保存する方法は次のとおりです。この関数を呼び出す前に、document.DowngradeDocument(); を実行しました。

そのため、ダウングレード機能を呼び出しながら、保存するときにフォーマットも変更する必要があります。この関数のドキュメントでは、関数が呼び出された場合、Office の以前のバージョンはすべてそれを読み取ることができることが明らかです。

/// <summary>
/// Make a copy of ActiveDocument in current user temp folder, and get a byte[].
/// </summary>
/// <param name="filename"></param>
/// <param name="document"></param>
/// <param name="file"></param>
/// <returns></returns>
private byte[] MakeCopy(string filename, Document document, out FileInfo file)
{
  // http://blogs.msdn.com/b/pranavwagh/archive/2008/04/03/how-to-do-a-save-copy-as-in-word.aspx
  // http://stackoverflow.com/questions/12175273/serialize-current-activedocument-from-office-2007-add-in

  Microsoft.Office.Interop.Word.Application wdApp = new Microsoft.Office.Interop.Word.Application();
  wdApp.Visible = false;
  {
    // make a fil i Current user temp folder
    // http://stackoverflow.com/questions/944483/how-to-get-temporary-folder-for-current-user
    string tempPath = System.IO.Path.GetTempPath();

    string fileName = Path.Combine(tempPath, GenerateValidFileName(filename)) + ".doc";

    IPersistFile compoundDocument = document as IPersistFile;
    compoundDocument.Save(fileName, false);

    byte[] content = File.ReadAllBytes(fileName);

    file = new FileInfo(fileName);
    wdApp.Quit();

    return content; 
  }
}
4

0 に答える 0