2015-01-23 2 views
0

Чтобы создать некоторые пользовательские метаданные и создать резервные копии того, что пользователь делает в текстовом документе на сервере/базе данных, я создал VSTO надстройка уровня приложения и использовала событие DocumentBeforeSave, чтобы удержать функциональные возможности сохранения по умолчанию Word.VSTO: как сохранить interop doc (с настраиваемыми частями и метаданными) в память

Я хотел бы преобразовать текущий документ в двоичный блок или полное представление openXML, содержащее документ, пользовательскую часть xml и со всеми данными, которые необходимы для беспрепятственного открытия того же документа с копии сервера. Поэтому мне нужно не только добавлять какие-либо пользовательские части XML, но и информацию об отслеживании изменений и другие метаданные, которые сохраняются внутри документа. Моя идея, соответственно, должен был просто захватить сохраненный блоб, который создается:

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 
} 

... но должно быть более элегантное решение проблемы, которая не требует сохранения документа на диске, а затем считывает его обратно в память, поскольку этот подход по своей сути является недостатком: сохранение документа может происходить много раз, и нежелательно продолжать чтение с жесткого диска несколько раз. Также было бы полезно реализовать эту функцию в другое время без сохранения документа на диск вообще! Любые мысли были бы весьма признательны.

ответ

1

Получить свойство WordOpenXML из документа или диапазона (он содержит формат документа OPC документа), а затем преобразовать его в пакет DocX, как показано в http://blogs.msdn.com/b/ericwhite/archive/2008/09/29/transforming-flat-opc-format-to-open-xml-documents.aspx.

Результат должен быть эквивалентен сохранению как DocX, но может быть выполнен полностью в памяти.

+0

Это именно то, что я искал. Использование кода по ссылке и запись в MemoryStream вместо выходного пути отлично работают. Благодаря! – c0nn