【问题标题】:Office Web Apps Word EditingOffice Web 应用程序 Word 编辑
【发布时间】:2013-06-24 16:11:12
【问题描述】:

这个想法是使用 Office Web Apps 构建一个专有的 Java 后端文档系统。

我们创建了 WOPI 客户端,它允许我们查看/编辑 PowerPoint 和 Excel 网络应用程序文档,但我们只能查看 Word 文档。

为了编辑 Word Web App 文档,您需要实现 MS-FSSHTTP。

似乎没有关于如何在代码中实际执行此操作的信息。有没有人做过这个或者知道怎么做的?

【问题讨论】:

    标签: java c# ms-word fsshttp ms-wopi


    【解决方案1】:

    最近我和我的团队实现了一个支持查看和编辑 Word、PPT 和 Excel 文档的 WOPI-Host。您可以查看https://github.com/marx-yu/WopiHost,它是一个命令提示符项目,它侦听8080 端口并允许通过Microsoft Office Web Apps 编辑和查看word 文档。

    我们已经在 webApi 中实现了这个解决方案,并且效果很好。希望这个示例项目对您有所帮助。

    根据要求,我将尝试添加代码示例,以根据我的 webApi 实现来阐明实现它的方式,但它们需要实现很多代码才能真正使其正常工作。

    首先,要启用编辑,您需要在 FilesController 中捕获 Http Posts。每个涉及实际编辑的帖子的标题X-WOPI-Override 等于COBALT。在这些帖子中,您会发现 InputStream 是和 Atom 类型。根据 MS-WOPI 文档,您需要在回复中包含以下标头 X-WOPI-CorrelationIDrequest-id

    这是我的 webApi post 方法的代码(它不完整,因为我仍在实现该 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", @"yonggui.yu@emacle.com", false);
          else
             editSession = new CobaltSession(filename, filePath + "/" + filename, @"patrick.racicot", @"Patrick Racicot", @"patrick.racicot@hospitalis.com", 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;
    }
    

    正如你在这个方法中看到的,我使用了CobaltSessionManagerCobaltSession,它们用于在 Cobalt 协议上创建和管理编辑会话。您还需要一个我称之为 CobaltHostLockingStore 的东西,用于在版本初始化中与 Office Web App 服务器通信时处理不同的请求。

    我不会发布这 3 个类的代码,因为它们已经在我发布的示例 github 项目中进行了编码,并且即使它们很大,也很容易理解。

    如果您有更多问题或不清楚的地方,请随时发表评论,我会相应地更新我的帖子。

    【讨论】:

    • 您能在此处添加一些示例,而不是简单地发布有关您的项目的链接吗?
    • 我也有同样的问题。但我无法为我的客户提供另一台 Microsoft 服务器。不提供 Microsoft Web 在线服务器,如何与办公产品交互?我搜索了 webdave 但 web dav 需要 ActiveX 和 Firefox 和 chrome 不支持。
    【解决方案2】:

    Patrick Racicot,提供了很好的答案。但是我在保存 docx 时遇到了问题(CobaltCore.dll 中的异常),我什至开始使用 dotPeak 反射器试图解决这个问题。

    但是当我在我的 WebApi 方法中锁定 editSession 变量后,一切都开始像魔术一样工作。似乎 OWA 正在发送应作为链处理的请求,而不是像通常控制器方法行为那样并行处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多