1

我正在尝试使用 VSTO 降级文档。

我有一个网络服务,它接收一个字节数组。该字节来自当前活动文档。

Web 服务只能处理 2007/2003 的 word doc 文件。

所以我想使用

document.DowngradeDocument();

但是webservice在发送字节数组的时候报错。如果做一个 SaveAs 并强制 word 保存为 2007/2003 doc 格式,那么没有问题。

所以我的问题是:

1) 为什么 DowngradeDocument() 函数不起作用。为什么它没有进行适当的降级。2) 当我调用 DowngradeDocument() 时是否需要做其他事情

这必须在内存中,因为正在处理的文件没有保存在磁盘上。

//丹尼斯

感谢您抽出时间来阅读

--- 编辑 d. 20120904 ---

我不能使用 web 服务错误,因为它对错误没有意义。它说它可以找到该文件,这是内部和另一端应用程序的错误。

因此,我尝试以正确的格式保存文档,并且已降级。使用相同的代码。一项工作,另一项没有。

但这是我将文件保存为临时文件的方式。在我调用这个函数之前,我已经完成了一个 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