2013-06-24 7 views
4

아이디어는 Office Web Apps를 사용하여 독점적 인 Java 백엔드 문서 시스템을 구축하는 것입니다.Office Web Apps Word 편집

우리는 PowerPoint 및 Excel 웹 응용 프로그램 문서를 보거나 편집 할 수있는 WOPI 클라이언트를 만들었지 만 Word 문서 만 볼 수 있습니다.

Word Web App 문서를 편집하려면 MS-FSSHTTP를 구현해야합니다.

실제로 코드에서이 작업을 수행하는 방법에 대한 정보는 없습니다. 아무도 이것을 수행했거나 어떻게 알았습니까?

답변

4

최근에 저의 팀과 저는 Word, PPT 및 Excel 문서를보고 편집 할 수있는 WOPI 호스트를 구현했습니다. 8080 포트에서 수신 대기하고 Microsoft Office Web Apps를 통해 워드 문서를 편집하고 볼 수있는 명령 프롬프트 프로젝트 인 https://github.com/marx-yu/WopiHost을 살펴볼 수 있습니다.

우리는 webApi에서이 솔루션을 구현했으며 훌륭하게 작동합니다. 희망이 샘플 프로젝트는 당신을 도울 것입니다.

요청을받은 후, 필자는 webApi 구현을 기반으로 구현하는 방법을 명확히하기 위해 코드 샘플을 추가하려고 시도하지만 실제로 제대로 작동하도록 구현할 코드가 많습니다.

먼저 편집을 사용하려면 FilesController에서 Http Post를 캡처해야합니다. 실제 편집과 관련된 각 게시물의 헤더는 X-WOPI-Override이며 COBALT입니다. 이 글에서는 InputStream is과 Atom type을 발견 할 것이다. MS-WOPI 문서를 기반으로 응답에 다음과 같은 헤더 X-WOPI-CorrelationIDrequest-id을 포함시켜야합니다.

다음은 내 webApi 게시 메소드의 코드입니다 (아직 WOPI 프로토콜을 구현하고 있기 때문에 완료되지 않았습니다).

string wopiOverride = Request.Headers.GetValues("X-WOPI-Override").First(); 
if (wopiOverride.Equals("COBALT")) 
{ 
    string filename = name; 
    EditSession editSession = CobaltSessionManager.Instance.GetSession(filename); 
    var filePath = HostingEnvironment.MapPath("~/App_Data/"); 
    if (editSession == null){ 
     var fileExt = filename.Substring(filename.LastIndexOf('.') + 1); 
     if (fileExt.ToLower().Equals(@"xlsx")) 
     editSession = new FileSession(filename, filePath + "/" + filename, @"yonggui.yu", @"yuyg", @"[email protected]", false); 
     else 
     editSession = new CobaltSession(filename, filePath + "/" + filename, @"patrick.racicot", @"Patrick Racicot", @"[email protected]", false); 
     CobaltSessionManager.Instance.AddSession(editSession); 
     } 

     //cobalt, for docx and pptx 
     var ms = new MemoryStream(); 

     HttpContext.Current.Request.InputStream.CopyTo(ms); 
     AtomFromByteArray atomRequest = new AtomFromByteArray(ms.ToArray()); 
     RequestBatch requestBatch = new RequestBatch(); 

     Object ctx; 
     ProtocolVersion protocolVersion; 

     requestBatch.DeserializeInputFromProtocol(atomRequest, out ctx, out protocolVersion); 
     editSession.ExecuteRequestBatch(requestBatch); 


     foreach (Request request in requestBatch.Requests) 
     { 
     if (request.GetType() == typeof(PutChangesRequest) && request.PartitionId == FilePartitionId.Content) 
     { 
      //upload file to hdfs 
      editSession.Save(); 
     } 
     } 
     var responseContent = requestBatch.SerializeOutputToProtocol(protocolVersion); 
     var host = Request.Headers.GetValues("Host"); 
     var correlationID = Request.Headers.GetValues("X-WOPI-CorrelationID").First(); 

     response.Headers.Add("X-WOPI-CorrelationID", correlationID); 
     response.Headers.Add("request-id", correlationID); 
     MemoryStream memoryStream = new MemoryStream(); 

     var streamContent = new PushStreamContent((outputStream, httpContext, transportContent) => 
     { 
     responseContent.CopyTo(outputStream); 
     outputStream.Close(); 
     }); 

     response.Content = streamContent; 
     response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
     response.Content.Headers.ContentLength = responseContent.Length; 
} 

당신은 내가 CobaltSessionManager과 코발트 프로토콜에 편집 세션을 생성하고 관리하는데 사용됩니다 CobaltSession의 활용이 방법에서 볼 수 있듯이. 또한 에디션 초기화시 Office Web App 서버와 통신 할 때 여러 요청을 처리하는 데 사용되는 CobaltHostLockingStore가 필요합니다.

내가 게시 한 샘플 github 프로젝트에 이미 코딩되어 있기 때문에이 3 개의 클래스에 대한 코드를 게시하지 않으며 크다고해도 이해하기가 쉽습니다.

더 많은 질문이 있거나 명확하지 않은 경우 주저하지 말고 그에 따라 내 게시물을 업데이트 할 것입니다.

+0

프로젝트에 대한 링크를 게시하지 않고 여기에 몇 가지 예를 추가 할 수 있습니까? – VMAtm

0

Patrick Racicot, 훌륭한 답변을 제공합니다. 하지만 문제가 docx (CobaltCore.dll 예외) 저장하고 심지어 그것을 알아 내려고 dotPeak 반사판을 사용하여 시작했다.

그러나 내 WebApi 메서드에서 editSession 변수를 잠근 후에 모든 것이 마술처럼 작동하기 시작했습니다. OWA는 일반적으로 컨트롤러 메서드가 작동하기 때문에 병렬로 처리하지 말고 체인으로 처리해야하는 요청을 보내는 것 같습니다.