Чтобы создать некоторые пользовательские метаданные и создать резервные копии того, что пользователь делает в текстовом документе на сервере/базе данных, я создал 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
}
... но должно быть более элегантное решение проблемы, которая не требует сохранения документа на диске, а затем считывает его обратно в память, поскольку этот подход по своей сути является недостатком: сохранение документа может происходить много раз, и нежелательно продолжать чтение с жесткого диска несколько раз. Также было бы полезно реализовать эту функцию в другое время без сохранения документа на диск вообще! Любые мысли были бы весьма признательны.
Это именно то, что я искал. Использование кода по ссылке и запись в MemoryStream вместо выходного пути отлично работают. Благодаря! – c0nn