как использовать MS Office с проприетарной серверной системой документации Java

В настоящее время у меня есть система документов, которая запускает документы в Star Office или LibreOffice в iframe.

Двигаясь в будущее, в идеале я хочу сохранить имеющуюся у меня систему документов, но интегрировать ее в SharePoint, чтобы мы могли открывать и редактировать документы с помощью MS Office.

Поскольку нет Java Api для интеграции с MS Office, поэтому я выбрал SharePoint.

Мне удается загрузить мои документы по ссылке на странице sharepoint, но затем наступает сложная часть - манипулировать функциями сохранения в MS Office и гарантировать, что мой документ не будет сохранен в sharepoint.

Кто-нибудь делал что-нибудь подобное.

В основном я просто хочу использовать MS Office для взаимодействия с моими документами, не сохраняя вещи в sharepoint. Поэтому мне нужно получить доступ к функциям сохранения и т. Д.

Насколько я понимаю, Apache POI не является жизнеспособным решением, поскольку он физически не открывает документ и не позволяет пользователю щелкнуть файл -> сохранить. Насколько я понимаю, он может манипулировать документами, манипулируя ими в коде, но не может использовать какие-либо элементы управления в офисе.

Я прочитал здесь http://msdn.microsoft.com/en-us/library/office/bb462633(v=office.12).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2, что можно изменить назначение команд в офисе и изменить ленту?

Спасибо за любой совет

Похоже, это возможно с WOPI и Office Web Apps. В основном необходимо создать приложение WOPI


person topcat3    schedule 05.06.2013    source источник
comment
Я нашел этот компонент, который, кажется, делает именно то, что нам нужно edrawsoft.com/officeviewer.php. Интересно, есть ли альтернативы?   -  person topcat3    schedule 11.06.2013
comment
Нашел здесь ответ stackoverflow .com / questions / 17065029 /.   -  person topcat3    schedule 13.06.2013
comment
Вы реализовали FSSHTTP? Я работаю над этим сейчас, есть помощь? Спасибо   -  person Marx Yu    schedule 16.04.2014
comment
@ Маркс ударил им о кирпичную стену. Даже связались с Microsoft, у которых есть рабочие образцы кода, но, к сожалению, они не поделились. Теперь просто посмотрим на кнопки Sharepoint или java, подключающиеся к ms office через javascript. Жалость. Хотелось бы, чтобы они выпустили код.   -  person topcat3    schedule 16.04.2014


Ответы (2)


Ну, у меня была та же проблема, поэтому я написал быстрый редактор PPT с Apache POI и редактированием SVG .. Но затем я переключился на Office Web Apps .. Вот быстрая реализация сервера WOPI, я парень Java, так что мой Навыки .NET ужасны. Написание сервлета должно быть тривиальным.

Логика проста:

Передайте WOPISrc офисным веб-приложениям - это, по сути, URL-адрес вашего сервера WOPI с указанием местоположения файла. Вы можете пока игнорировать access_token / access_token_ttl.

Веб-приложения Office с обращением к URL-адресу WOPISrc как минимум с двумя запросами:

  1. Это будет запрос метаданных, который по сути представляет собой вызов GET для WOPIsrc. Вы создадите объект WOPI (CheckFileInfo) и отправите его обратно в формате JSON в офисные веб-приложения.
  2. Теперь Office Web Apps будет запрашивать сам файл, он добавит (/ contents) в конец файла WOPIsrc. Так что просто отправьте его обратно в двоичном формате.
  3. (Необязательно) Office Web Apps выполнит POST для (WOPISrc + "/ contents") при сохранении. Вы можете получить данные из POST и сохранить на диск.

Примечание: Word не работает: / Вы можете только просматривать, для редактирования вам необходимо реализовать протокол Cobalt (FSSHTTP). Я немного исследую эту тему, но будет легче писать на C #, так как вы можете получить сборку Cobalt. В противном случае эти протоколы реализуют SOAP (FSSHTTP) с двоичными сообщениями в кодировке BASE64 (FSSHTTPB).

Откройте Office Web Apps примерно так:

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

Как 2_

Это откроет 1.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; }
    }
}
person thebitllc    schedule 17.06.2013
comment
мы работаем над реализацией FSSHTTP. Вы бы хотели поболтать? Моя электронная почта находится в моем профиле. - person Nils; 27.06.2013
comment
MS-WOPI защищена патентами Microsoft. Залил это может проблема для разработчика WOPI? - person IT Hit WebDAV; 05.08.2013
comment
кто-нибудь реализует FSSHTTP или любую помощь? Спасибо - person Marx Yu; 16.04.2014

Office поддерживает редактирование файлов с использованием протокола WebDAV. Есть библиотеки, которые помогают его реализовать.

person Sergey Zyuzin    schedule 14.06.2013
comment
вы можете увидеть мой ответ в комментариях. Хотя WebDav возможен, сейчас идеально использовать WOPI с Office Web Apps. Пользователь, ответивший на вопрос здесь, заслуживает награды, я считаю, stackoverflow.com/questions/17065029/ - person topcat3; 14.06.2013