2013-06-12 9 views
5

Ich versuche, ein Dokumenten-Management-System im Browser mit Office zu haben. Ich habe diese Lösung http://www.edrawsoft.com/officeviewer.php gefunden, aber es verwendet die Clientkopie von Office.Kann ich nur Office Web Apps Server verwenden

Ich möchte Office Web Apps verwenden, aber meine Frage ist ... muss ich es über SharePoint oder andere Microsoft-Produkte verwenden oder kann ich einfach eine Website anschließen, um Office Web Apps im Browser für mein eigenes Dokument zu verwenden System

Antwort

10

Sie können einen eigenen Server schreiben, der das WOPI-Protokoll implementiert, dies unterstützt PPTX/XSLX im Ansichts-/Bearbeitungsmodus, DOCX/PDF nur im Ansichtsmodus. WOPI-Server ist ziemlich einfach zu implementieren.

Um Word-Dokumente zu bearbeiten, müssen Sie das Cobalt- oder FSSHTTP/FSSHTTPB-Protokoll implementieren.

Vergessen Sie auch nicht die Lizenzierung, Office Web Apps erfordert, dass alle Benutzer eine gültige Office-Lizenz haben.

Hier ist ein Beispiel-.NET-Wopi Server:

Nennen Sie es mit:

http://OFFICEWEBAPPS.HOST/p/PowerPointFrame.aspx?PowerPointView=EditView&access_token=12345&WOPISrc=URLENCODED_URL_OF_THE_WOPI_SERVER

Like: http://WOPISERVER.HOST:2000/wopi/files/1.pptx

Dies wird in Ihrem c öffnen 1.pptx: \ temp

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Collections; 
using System.Runtime.Serialization; 
using System.Net; 
using System.Net.Http; 
using System.Threading.Tasks; 
using System.Web; 
using System.IO; 
using System.Runtime.Serialization.Json; 

namespace WopiServerTutorial 
{ 
    public class WopiServer 
    { 
     private HttpListener Listener; 

     static void Main(string[] args) 
     { 
      WopiServer s = new WopiServer(); 
      s.Start(); 

      Console.WriteLine("A simple wopi webserver. Press a key to quit."); 
      Console.ReadKey(); 

      s.Stop(); 
     } 

     public void Start() 
     { 
      Listener = new HttpListener(); 
      Listener.Prefixes.Add(@"http://+:8080/"); 
      Listener.Start(); 
      Listener.BeginGetContext(ProcessRequest, Listener); 
      Console.WriteLine(@"WopiServer Started"); 
     } 

     public void Stop() 
     { 
      Listener.Stop(); 
     } 

     private void ProcessRequest(IAsyncResult result) 
     { 
      HttpListener listener = (HttpListener)result.AsyncState; 
      HttpListenerContext context = listener.EndGetContext(result); 

      Console.WriteLine(@"Got a " + context.Request.HttpMethod + " request for URL: " + context.Request.Url.PathAndQuery); 
      var stringarr = context.Request.Url.AbsolutePath.Split('/'); 
      var rootDir = @"C:\\temp\\"; 

      if (stringarr.Length == 5 && context.Request.HttpMethod.Equals(@"GET")) 
      { 
       Console.WriteLine(@"Getting content for the file: " + rootDir + stringarr[3]); 

       // get file's content 
       var file = rootDir + stringarr[3]; 
       var stream = new FileStream(file, FileMode.Open); 
       var fi = new FileInfo(file); 

       context.Response.ContentType = @"application/octet-stream"; 
       context.Response.ContentLength64 = fi.Length; 
       stream.CopyTo(context.Response.OutputStream); 
       context.Response.Close(); 
      } 
      //else if (stringarr.Length == 5 && context.Request.HttpMethod.Equals(@"POST")) 
      //{ 
      // // write 
      //} 
      else if (stringarr.Length == 4 && context.Request.HttpMethod.Equals(@"GET")) 
      { 
       Console.WriteLine(@"Getting metdata for the file: " + rootDir + stringarr[3]); 
       var fi = new FileInfo(rootDir + stringarr[3]); 

       CheckFileInfo cfi = new CheckFileInfo(); 
       cfi.AllowExternalMarketplace = false; 
       cfi.BaseFileName = fi.Name; 
       cfi.BreadcrumbBrandName = ""; 
       cfi.BreadcrumbBrandUrl = ""; 
       cfi.BreadcrumbDocName = ""; 
       cfi.BreadcrumbDocUrl = ""; 
       cfi.BreadcrumbFolderName = ""; 
       cfi.BreadcrumbFolderUrl = ""; 
       cfi.ClientUrl = ""; 
       cfi.CloseButtonClosesWindow = false; 
       cfi.CloseUrl = ""; 
       cfi.DisableBrowserCachingOfUserContent = true; 
       cfi.DisablePrint = true; 
       cfi.DisableTranslation = true; 
       cfi.DownloadUrl = ""; 
       cfi.FileUrl = ""; 
       cfi.FileSharingUrl = ""; 
       cfi.HostAuthenticationId = "s-1-5-21-3430578067-4192788304-1690859819-21774"; 
       cfi.HostEditUrl = ""; 
       cfi.HostEmbeddedEditUrl = ""; 
       cfi.HostEmbeddedViewUrl = ""; 
       cfi.HostName = @"SharePoint"; 
       cfi.HostNotes = @"HostBIEnabled"; 
       cfi.HostRestUrl = ""; 
       cfi.HostViewUrl = ""; 
       cfi.IrmPolicyDescription = ""; 
       cfi.IrmPolicyTitle = ""; 
       cfi.OwnerId = @"4257508bfe174aa28b461536d8b6b648"; 
       cfi.PresenceProvider = "AD"; 
       cfi.PresenceUserId = @"S-1-5-21-3430578067-4192788304-1690859819-21774"; 
       cfi.PrivacyUrl = ""; 
       cfi.ProtectInClient = false; 
       cfi.ReadOnly = false; 
       cfi.RestrictedWebViewOnly = false; 
       cfi.SHA256 = ""; 
       cfi.SignoutUrl = ""; 
       cfi.Size = fi.Length; 
       cfi.SupportsCoauth = false; 
       cfi.SupportsCobalt = false; 
       cfi.SupportsFolders = false; 
       cfi.SupportsLocks = true; 
       cfi.SupportsScenarioLinks = false; 
       cfi.SupportsSecureStore = false; 
       cfi.SupportsUpdate = true; 
       cfi.TenantId = @"33b62539-8c5e-423c-aa3e-cc2a9fd796f2"; 
       cfi.TermsOfUseUrl = ""; 
       cfi.TimeZone = @"+0300#0000-11-00-01T02:00:00:0000#+0000#0000-03-00-02T02:00:00:0000#-0060"; 
       cfi.UserCanAttend = false; 
       cfi.UserCanNotWriteRelative = false; 
       cfi.UserCanPresent = false; 
       cfi.UserCanWrite = true; 
       cfi.UserFriendlyName = ""; 
       cfi.UserId = ""; 
       cfi.Version = @"%22%7B59CCD75F%2D0687%2D4F86%2DBBCF%2D059126640640%7D%2C1%22"; 
       cfi.WebEditingDisabled = false; 

       // encode json 
       var memoryStream = new MemoryStream(); 
       var json = new DataContractJsonSerializer(typeof(CheckFileInfo)); 
       json.WriteObject(memoryStream, cfi); 
       memoryStream.Flush(); 
       memoryStream.Position = 0; 
       StreamReader streamReader = new StreamReader(memoryStream); 
       var jsonResponse = Encoding.UTF8.GetBytes(streamReader.ReadToEnd()); 

       context.Response.ContentType = @"application/json"; 
       context.Response.ContentLength64 = jsonResponse.Length; 
       context.Response.OutputStream.Write(jsonResponse, 0, jsonResponse.Length); 
       context.Response.Close(); 
      } 
      else 
      { 
       byte[] buffer = Encoding.UTF8.GetBytes(""); 
       context.Response.ContentLength64 = buffer.Length; 
       context.Response.ContentType = @"application/json"; 
       context.Response.OutputStream.Write(buffer, 0, buffer.Length); 
       context.Response.OutputStream.Close(); 
      } 

      Listener.BeginGetContext(ProcessRequest, Listener); 
     } 
    } 

    [DataContract] 
    public class CheckFileInfo 
    { 
     [DataMember] 
     public bool AllowExternalMarketplace { get; set; } 
     [DataMember] 
     public string BaseFileName { get; set; } 
     [DataMember] 
     public string BreadcrumbBrandName { get; set; } 
     [DataMember] 
     public string BreadcrumbBrandUrl { get; set; } 
     [DataMember] 
     public string BreadcrumbDocName { get; set; } 
     [DataMember] 
     public string BreadcrumbDocUrl { get; set; } 
     [DataMember] 
     public string BreadcrumbFolderName { get; set; } 
     [DataMember] 
     public string BreadcrumbFolderUrl { get; set; } 
     [DataMember] 
     public string ClientUrl { get; set; } 
     [DataMember] 
     public bool CloseButtonClosesWindow { get; set; } 
     [DataMember] 
     public string CloseUrl { get; set; } 
     [DataMember] 
     public bool DisableBrowserCachingOfUserContent { get; set; } 
     [DataMember] 
     public bool DisablePrint { get; set; } 
     [DataMember] 
     public bool DisableTranslation { get; set; } 
     [DataMember] 
     public string DownloadUrl { get; set; } 
     [DataMember] 
     public string FileSharingUrl { get; set; } 
     [DataMember] 
     public string FileUrl { get; set; } 
     [DataMember] 
     public string HostAuthenticationId { get; set; } 
     [DataMember] 
     public string HostEditUrl { get; set; } 
     [DataMember] 
     public string HostEmbeddedEditUrl { get; set; } 
     [DataMember] 
     public string HostEmbeddedViewUrl { get; set; } 
     [DataMember] 
     public string HostName { get; set; } 
     [DataMember] 
     public string HostNotes { get; set; } 
     [DataMember] 
     public string HostRestUrl { get; set; } 
     [DataMember] 
     public string HostViewUrl { get; set; } 
     [DataMember] 
     public string IrmPolicyDescription { get; set; } 
     [DataMember] 
     public string IrmPolicyTitle { get; set; } 
     [DataMember] 
     public string OwnerId { get; set; } 
     [DataMember] 
     public string PresenceProvider { get; set; } 
     [DataMember] 
     public string PresenceUserId { get; set; } 
     [DataMember] 
     public string PrivacyUrl { get; set; } 
     [DataMember] 
     public bool ProtectInClient { get; set; } 
     [DataMember] 
     public bool ReadOnly { get; set; } 
     [DataMember] 
     public bool RestrictedWebViewOnly { get; set; } 
     [DataMember] 
     public string SHA256 { get; set; } 
     [DataMember] 
     public string SignoutUrl { get; set; } 
     [DataMember] 
     public long Size { get; set; } 
     [DataMember] 
     public bool SupportsCoauth { get; set; } 
     [DataMember] 
     public bool SupportsCobalt { get; set; } 
     [DataMember] 
     public bool SupportsFolders { get; set; } 
     [DataMember] 
     public bool SupportsLocks { get; set; } 
     [DataMember] 
     public bool SupportsScenarioLinks { get; set; } 
     [DataMember] 
     public bool SupportsSecureStore { get; set; } 
     [DataMember] 
     public bool SupportsUpdate { get; set; } 
     [DataMember] 
     public string TenantId { get; set; } 
     [DataMember] 
     public string TermsOfUseUrl { get; set; } 
     [DataMember] 
     public string TimeZone { get; set; } 
     [DataMember] 
     public bool UserCanAttend { get; set; } 
     [DataMember] 
     public bool UserCanNotWriteRelative { get; set; } 
     [DataMember] 
     public bool UserCanPresent { get; set; } 
     [DataMember] 
     public bool UserCanWrite { get; set; } 
     [DataMember] 
     public string UserFriendlyName { get; set; } 
     [DataMember] 
     public string UserId { get; set; } 
     [DataMember] 
     public string Version { get; set; } 
     [DataMember] 
     public bool WebEditingDisabled { get; set; } 
    } 
} 

Update für den 1. Juni 3. 2014:

Mit Cobalt API ist es möglich, Word-Dokumente zu bearbeiten, obwohl meine Implementierung bei weitem nicht perfekt ist. Lass uns mit den Grundlagen beginnen. FSSHTTP erfordert Shredded Storage, SharePoint implementiert in der Datenbank, aber nachdem ich mich in Cobalt Assembly umgesehen habe, habe ich die Art und Weise gefunden, eine zerfetzte Datei im Dateisystem zu erstellen ... Hier sind die Fragmente des relevanten Codes, dieser erste Teil nimmt das Wort doc von c : \ tmp \ test.docx und wandelt in c geschreddert Blobs: \ tmp \ Dateispeicher und c: \ tmp \ wacupdate

  DisposalEscrow disposal = new DisposalEscrow("temp1"); 

      CobaltFilePartitionConfig content = new CobaltFilePartitionConfig(); 
      content.IsNewFile = false; 
      content.HostBlobStore = new FileSystemHostBlobStore("C:\\tmp\\filestore\\", "filestore", new FileSystemHostBlobStore.Config(), disposal, true, false); 
      content.cellSchemaIsGenericFda = true; 
      content.CellStorageConfig = new CellStorageConfig(); 
      content.Schema = CobaltFilePartition.Schema.ShreddedCobalt; 
      content.PartitionId = FilePartitionId.Content; 

      CobaltFilePartitionConfig wacupdate = new CobaltFilePartitionConfig(); 
      wacupdate.IsNewFile = false; 
      wacupdate.HostBlobStore = new FileSystemHostBlobStore("C:\\tmp\\wacstore\\", "wacstore", new FileSystemHostBlobStore.Config(), disposal, true, false); 
      wacupdate.cellSchemaIsGenericFda = false; 
      wacupdate.CellStorageConfig = new CellStorageConfig(); 
      wacupdate.Schema = CobaltFilePartition.Schema.ShreddedCobalt; 
      wacupdate.PartitionId = FilePartitionId.WordWacUpdate; 

      Dictionary<FilePartitionId, CobaltFilePartitionConfig> pd = new Dictionary<FilePartitionId, CobaltFilePartitionConfig>(); 
      pd.Add(FilePartitionId.Content, content); 
      pd.Add(FilePartitionId.WordWacUpdate, wacupdate); 

    // custom locking store is my implementation of hostlockingstore 
      CobaltFile cobaltFile = new CobaltFile(disposal, pd, new CustomHostLockingStore(), null); 

      var src = FileAtom.FromExisting("C:\\tmp\\Test.docx", disposal); 
      Cobalt.Metrics o1; 
      cobaltFile.GetCobaltFilePartition(FilePartitionId.Content).SetStream(RootId.Default.Value, src, out o1); 
      cobaltFile.GetCobaltFilePartition(FilePartitionId.Content).GetStream(RootId.Default.Value).Flush(); 

      cobaltFile.CommitChanges(); 

Nachdem Sie nun die cobaltFile haben Sie meinen ursprünglichen Wopi Code mit diesem bearbeiten:

 } 
     else if (context.Request.HttpMethod.Equals(@"POST") && context.Request.Headers["X-WOPI-Override"].Equals("COBALT")) 
     { 
      Console.WriteLine(@"Got a cobalt request for the file"); 
      var ms = new MemoryStream(); 
      context.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); 

      cobaltFile.CobaltEndpoint.ExecuteRequestBatch(requestBatch); 
      cobaltFile.CommitChanges(); 


      var response = requestBatch.SerializeOutputToProtocol(protocolVersion); 

      context.Response.Headers.Add("X-WOPI-MachineName", "test"); 
      context.Response.Headers.Add("X-WOPI-CorellationID", context.Request.Headers["X-WOPI-CorrelationID"]); 
      context.Response.Headers.Add("request-id", context.Request.Headers["X-WOPI-CorrelationID"]); 
      context.Response.ContentType = @"application/octet-stream"; 
      context.Response.ContentLength64 = response.Length; 
      response.CopyTo(context.Response.OutputStream); 
      context.Response.Close(); 

     } 

und customlockingstore kommt bald. Konvertieren von zurück zum Word-Dokument geschreddert ich noch nicht getan haben, aber ich glaube, ich weiß, wie

das letzte Update - die Komplettlösung hier:

https://github.com/thebitllc/WopiBasicEditor

+0

I Office Web Apps Setup auf eine virtuelle Box auf Windows Server 2012 und kann http: // localhost/hosting/discovery treffen. Ich frage mich, wie man das jetzt testen kann – topcat3

+0

Dieser Leitfaden ist, was ich brauche glaube ich http://blogs.msdn.com/b/officedevdocs/archive/2013/03/20/introducing-wopi.aspx – topcat3

+0

Vielen Dank . Wenn Sie eine Antwort hier setzen können http://stackoverflow.com/questions/16937990/how-to-use-ms-office-with-proprietary-java-back-end-document-system/17101144?noredirect=1#17101144 Ich werde dir das Kopfgeld geben. Die gleiche Antwort entspricht meinen Bedürfnissen – topcat3

Verwandte Themen