2015-01-23 6 views
0

사용자 지정 메타 데이터를 만들고 사용자가 워드 문서에서 수행하는 작업을 서버/데이터베이스에 백업하기 위해 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 
} 

...하지만 디스크에 문서를 저장 요구하지 않는 문제에 더 우아한 해결책이 있어야한다 : 내 생각은, 따라서 단순히 만들어 저장 한 방울을 잡기 위해이었다 이 방법은 본질적으로 결함이 있기 때문에 문서를 저장하는 것은 여러 번 발생할 수 있으며 하드 드라이브에서 여러 번 읽는 것이 바람직하지 않습니다. 또한 문서를 디스크에 저장하지 않고 다른 시간에이 기능을 구현하는 것이 도움이 될 것입니다! 어떤 생각이라도 대단히 감사하겠습니다.

답변

1

WordOpenXML 속성을 문서 또는 범위 (문서의 플랫 OPC 형식 포함)에서 가져온 다음 http://blogs.msdn.com/b/ericwhite/archive/2008/09/29/transforming-flat-opc-format-to-open-xml-documents.aspx과 같이 DocX 패키지로 변환하십시오.

결과는 DocX로 저장하는 것과 동일해야하지만 메모리에서 전체적으로 수행 할 수 있습니다.

+0

이것이 내가 원하는 것입니다. 링크에서 코드를 사용하고 출력 경로 대신 MemoryStream에 쓰면 완벽하게 작동합니다. 감사! – c0nn