2013-06-05 46 views
10

Şu anda bir iframe'de Star Office veya LibreOffice belgelerini başlatan bir belge sistemim var.MS Office'i tescilli java arka uç belge sistemi ile birlikte kullanma

Geleceğe taşınmak Sahip olduğum belge sistemini en iyi şekilde saklamak istiyorum ancak MS Office'i kullanarak belgeleri açmamıza ve düzenlememize olanak sağlamak için bunu SharePoint'e entegre ediyorum.

MS Office ile tümleştirilebilecek bir Java API'si olmadığından, bu yüzden SharePoint ile birlikte gitmeyi seçtim.

Belgelerimin bir paylaşım sayfasındaki bir bağlantıdan yüklenmesini sağlamayı başarabilirim, ancak MS Office'teki kaydetme özelliklerini işlemek ve belgemin paylaşım noktasında kaydedilmemesini sağlamanın zor kısmı geliyor.

Benzer bir şey yapan var mı?

Temel olarak, MS Office'i belgelerim ile etkileşim kurmak ve paylaşımda bulunmak. Bu yüzden kaydetme işlevlerine erişmem gerekiyor.

Apache'yi gördüğüm kadarıyla POI, belgeyi fiziksel olarak açmadığından ve kullanıcının dosyayı tıklatmasına izin vermediğinden geçerli bir çözüm değildir -> kaydet. Anlayışım, belgeleri kodda işleyerek belgeleyebileceği, ancak ofis içindeki denetimlerin hiçbirini kullanamayacağıdır.

http://msdn.microsoft.com/en-us/library/office/bb462633(v=office.12).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2 numaralı belgeyi okudum ve ofisteki komutları yeniden kullanabilir ve şeridi değiştirebilir misiniz? Herhangi bir tavsiye O WOPI ve Office Web Uygulamaları ile mümkündür görünür

için

teşekkürler. Temel olarak bir WOPI uygulaması oluşturmaya ihtiyaç duyuyor

+0

Tam olarak gereksinim duyduğumuz gibi görünen bu bileşeni buldum: http: // www. edrawsoft.com/officeviewer.php. Merak ediyorum başka alternatif var mı? – topcat3

+0

Burada bulunan cevap burada http://stackoverflow.com/questions/17065029/can-i-just-use-office-web-apps-server – topcat3

+0

FSSHTTP'yi hayata geçirdiniz mi? Teşekkürler –

cevap

4

Ben de aynı sorunu yaşadım, bu yüzden Apache POI ve SVG düzenleme ile hızlı bir PPT editörü yazdım. Ama sonra Office Web Apps'a geçtim. İşte WOPI sunucusunun hızlı bir şekilde uygulanması. Java adam benim .NET becerileri oldukça korkunç. Bir sunucu uygulaması yazmak önemsiz olmalıdır.

Mantık basittir: ofis web uygulamalarına

Geçiş WOPISrc - Bu temelde o dosya konumuna ile WOPI sunucusunun URL adresidir. Şu an için access_token/access_token_ttl öğesini yok sayabilirsiniz.

Office Web Uygulamaları, en az 2 istekleri ile vurmak WOPISrc url ile:

  1. Bu temelde WOPIsrc bir GET çağrıdır meta veri isteği olacaktır. Bir WOPI (CheckFileInfo) nesnesi oluşturacak ve Office web uygulamalarına kodlanmış JSON'ı geri göndereceksiniz.
  2. Artık Office Web Uygulamaları dosyayı kendisi ister, WOPIsrc'nin sonuna (/ content) ekler. Yani sadece ikili biçimde geri gönderin.
  3. (İsteğe Bağlı) Office Web Uygulamaları, kaydetme sırasında (WOPISrc + "/ content") bir POST yapar. Verileri POST'tan alabilir ve diske kaydedebilirsiniz.

Not: Word çalışmaz:/Kobalt protokolünü (FSSHTTP) uygulamanız gereken düzenlemeyi yalnızca görüntüleyebilirsiniz. Bu konuyu biraz araştırıyorum ama C# 'da yazmak daha kolay olacaktır çünkü bir Kobalt topluluğu kurabiliyorsunuz.

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

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

Bu 1 açılacaktır Aksi takdirde bu protokoller böyle bir şey ile BASE64 kodlanmış ikili mesajları (FSSHTTPB)

Open Office Web Uygulamaları ile SOAP (FSSHTTP) uygular .pptx, c: \ 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; } 
    } 
} 
+0

'un bir FSSHTTP uygulaması üzerinde çalıştığına inanıyorum. Sohbet etmek ister misin? E posta adresim profilimde var. – Nils

+0

@ 17Grams da bunun üzerinde çalışıyor. Sizin e-postalarınızı göremiyordum – topcat3

+0

MS-WOPI, Microsoft patentleriyle kaplıdır. Bunu doldurmak WOPI uygulayıcısı için sorun olabilir mi? –

3

Office, WebDAV protokolünü kullanarak dosyaları düzenlemeyi destekler. Bunu uygulamaya yardımcı olan kütüphaneler var.

+1

Cevabımı yorumlarda görebilirsiniz. WebDav mümkün olsa da, şimdi WOPI'yi Office Web Apps ile kullanmak idealdir. Burada soruya cevap veren kullanıcı, http://stackoverflow.com/questions/17065029/can-i-just-use-office-web-apps-server – topcat3

İlgili konular