我正在尝试使用 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;
}
}