VSTO:如何将互操作文档(带有自定义部件和元数据)保存到内存中

VSTO: how to save an interop doc (with custom parts and metadata) to memory

为了创建一些自定义元数据并将用户在 word 文档中所做的事情备份到 server/database,我创建了一个 VSTO 应用程序级加载项,并使用了 DocumentBeforeSave 事件来劫持 Word 的默认保存功能。

我想将当前文档转换成一个二进制 blob 或一个完整的 openXML 表示,其中包含文档、自定义 xml 部分和 以及所有数据从服务器副本 无缝打开同一文档是必要的。因此,我不仅需要我添加的任何自定义 XML 部分,还需要有关更改跟踪和保存在文档中的其他元数据的信息。因此,我的想法是简单地获取创建的保存的 blob:

private void ThisAddIn_Startup(object sender, EventArgs e)
{
    Application.DocumentBeforeSave += application_DocumentBeforeSave;
}

private void application_DocumentBeforeSave(Document doc, ref bool saveAsUI, ref bool cancel)
{
    // generate some xml
    string customPart = @"<foo>some xml here</foo>";

    Office.CustomXMLPart rangeListXmlPart = doc.CustomXMLParts.Add(customPart, missing);

    // suppress default save functionality           
    saveAsUI = false;
    cancel = true;

    // manually generate save dialog
    Dialog dlg = Application.Dialogs[WdWordDialog.wdDialogFileSaveAs]
    object oDlg = dlg;
    object[] oArgs = new object[1];
    oArgs[0] = @"C:\";
    oDlg.GetType().InvokeMember("Name", BindingFlags.SetProperty, null, dlg, oArgs);
    dlg.Show(ref missing);

    // read in file blob
    byte[] data = null;

    FileInfo fileDetails = new FileInfo(doc.FullName);
    long fileSize = fileDetails.Length;

    FileStream fStream = new FileStream(path, FileMode.Open, FileAccess.Read);

    BinaryReader bReader = new BinaryReader(fStream);
    data = bReader.ReadBytes((int) fileSize);

    // send data up to the server, along with the file type
}

...但是必须有一个更优雅的解决方案来解决这个问题,不需要将文档保存到磁盘,然后将其读回内存,因为这种方法存在固有缺陷:文档保存可能会发生很多次,多次从硬盘读取是不可取的。在其他时间实现此功能而根本不将文档保存到磁盘也会很有帮助!任何想法将不胜感激。

从文档或范围中获取 WordOpenXML 属性(它包含文档的平面 OPC 格式),然后将其转换为 DocX 包,如 http://blogs.msdn.com/b/ericwhite/archive/2008/09/29/transforming-flat-opc-format-to-open-xml-documents.aspx 所示。

结果应该等同于保存为 DocX,但可以完全在内存中完成。