사용자 지정 메타 데이터를 만들고 사용자가 워드 문서에서 수행하는 작업을 서버/데이터베이스에 백업하기 위해 VSTO 응용 프로그램 수준 추가 기능을 사용하고 DocumentBeforeSave
이벤트를 사용하여 Word의 기본 저장 기능을 도용했습니다.VSTO : 사용자 지정 파트와 메타 데이터가 포함 된 interop 문서를 메모리에 저장하는 방법
현재 문서를 이진 blob 또는 문서, 사용자 정의 xml 부분 및 이 들어있는 완전한 openXML 표현으로 변환하고 싶습니다. 서버 복사본에서 동일한 문서를 완벽하게 열 수있는 모든 데이터가 필요합니다.. 따라서 추가 한 사용자 지정 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