2013-06-05 65 views
10

Hiện tại tôi có một hệ thống tài liệu khởi chạy tài liệu trong Star Office hoặc LibreOffice trong khung nội tuyến.cách sử dụng MS Office với hệ thống tài liệu back-end java độc quyền

Di chuyển đến tương lai Tôi lý tưởng muốn giữ lại hệ thống tài liệu mà tôi có nhưng tích hợp vào SharePoint để cho phép chúng tôi mở và chỉnh sửa tài liệu bằng MS Office.

Vì không có Java Api để tích hợp với MS Office, đây là lý do tại sao tôi đã chọn để đi với SharePoint.

Tôi có thể quản lý để tải tài liệu của mình từ liên kết trên trang chia sẻ nhưng sau đó đến phần khó thao tác các tính năng lưu trong MS Office và đảm bảo rằng tài liệu của tôi không được lưu trong SharePoint.

Có ai đó đã làm bất cứ điều gì tương tự.

Về cơ bản tôi chỉ muốn sử dụng MS Office để tương tác với tài liệu của mình mà không lưu trữ mọi thứ trong SharePoint. Vì vậy, tôi cần truy cập vào các chức năng lưu, vv

Theo tôi thấy Apache POI không phải là giải pháp khả thi vì nó không mở tài liệu và cho phép người dùng nhấp vào tệp -> lưu. Sự hiểu biết của tôi là nó có thể thao tác các tài liệu bằng cách thao tác chúng trong mã nhưng không thể sử dụng bất kỳ điều khiển nào trong văn phòng.

Tôi đã đọc ở đây http://msdn.microsoft.com/en-us/library/office/bb462633(v=office.12).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2 mà bạn có thể sử dụng lại các lệnh trong văn phòng và sửa đổi ribbon?

Cảm ơn lời khuyên nào

Có vẻ như có thể với WOPI và ứng dụng web Office. Về cơ bản cần tạo một ứng dụng WOPI

+0

Tôi tìm thấy thành phần này dường như thực hiện chính xác những gì chúng tôi yêu cầu http: // www. edrawsoft.com/officeviewer.php. Tôi đang tự hỏi có bất kỳ lựa chọn thay thế? – topcat3

+0

Tìm thấy câu trả lời ở đây http://stackoverflow.com/questions/17065029/can-i-just-use-office-web-apps-server – topcat3

+0

Bạn đã triển khai FSSHTTP chưa? Tôi đang làm việc với điều đó ngay bây giờ, bất kỳ trợ giúp nào? cảm ơn bạn –

Trả lời

4

Tôi cũng có cùng một vấn đề, vì vậy tôi thực sự đã viết một trình soạn thảo PPT nhanh với Apache POI và chỉnh sửa SVG .. Nhưng sau đó tôi chuyển sang ứng dụng Web Office .. Sau đây là triển khai nhanh máy chủ WOPI, tôi là Anh chàng Java nên kỹ năng .NET của tôi khá khủng khiếp. Viết một servlet nên tầm thường.

Logic là đơn giản:

đèo WOPISrc để các ứng dụng web văn phòng - điều này về cơ bản là URL của máy chủ WOPI của bạn với vị trí tập tin trong đó. Bạn có thể bỏ qua access_token/access_token_ttl bây giờ.

Các Office Web Apps với nhấn url WOPISrc với ít nhất 2 yêu cầu:

  1. Nó sẽ là một yêu cầu dữ liệu meta, mà về cơ bản là một cuộc gọi GET đến WOPIsrc. Bạn sẽ tạo một đối tượng WOPI (CheckFileInfo) và gửi nó trở lại JSON được mã hóa tới các ứng dụng web văn phòng.
  2. Hiện tại, Ứng dụng web Office sẽ yêu cầu tệp, chính nó sẽ thêm (/ nội dung) vào cuối WOPIsrc. Vì vậy, chỉ cần gửi nó trở lại ở định dạng nhị phân.
  3. (Tùy chọn) Ứng dụng web Office sẽ thực hiện POST (WOPISrc + "/ contents") khi lưu. Bạn có thể lấy dữ liệu từ POST và lưu vào đĩa.

Lưu ý: Word không hoạt động:/Bạn chỉ có thể xem, để chỉnh sửa bạn cần triển khai giao thức Cobalt (FSSHTTP). Tôi phần nào nghiên cứu chủ đề này, nhưng nó sẽ dễ dàng hơn để viết trong C# vì bạn có thể lấy một cụm Cobalt.Nếu không giao thức này thực hiện SOAP (FSSHTTP) với Base64 mã hóa thông điệp nhị phân (FSSHTTPB)

Mở Web Apps văn phòng với một cái gì đó như thế này:

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

Giống như: http://WOPISERVER.HOST:2000/wopi/files/1.pptx

này sẽ mở ra 1 .pptx trong 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

chúng tôi đang làm việc về triển khai FSSHTTP. Bạn có sẵn lòng trò chuyện không? Email của tớ nằm trong phần thông tin cá nhân nhé. – Nils

+0

@ 17Grams cũng làm việc về điều này. không nhìn thấy email của bạn – topcat3

+0

MS-WOPI được bảo vệ bởi các bằng sáng chế của Microsoft. Tôi điền vào điều này có thể là một vấn đề cho WOPI thực hiện? –

3

Văn phòng hỗ trợ các tệp chỉnh sửa bằng giao thức WebDAV. Có những thư viện giúp thực hiện nó.

+1

bạn có thể xem câu trả lời của tôi trong phần bình luận. Mặc dù WebDav là có thể nó là lý tưởng bây giờ để sử dụng WOPI với Office Web Apps. Người dùng trả lời câu hỏi ở đây xứng đáng với tiền thưởng Tôi tin rằng http://stackoverflow.com/questions/17065029/can-i-just-use-office-web-apps-server – topcat3

Các vấn đề liên quan