ドキュメントをオンラインで表示する方法

最初の営業日。 Redmineでの最初の挑戦。 最初の仕様はdoc形式です。 新しい作業マシン上。 MS Officeをダウンロードしてインストールしている間に、約3時間で仕様の読み取りを開始しました。 このケースを思い出して、タスク管理システムではドキュメントをオンラインで表示する必要があると確信していました。 妥当な時間と労力で実装するためのアイデアを以下に示します。 最近、Microsoft Office Web Appsという方法を見つけました。



この記事では、オンラインドキュメント表示を製品に追加する方法について説明します。



一般的なビュー



Office Web Appsサーバー(以下OWA)は、Word、Excel、PowerPoint、OneNoteなどの軽量のブラウザーアプリケーションを含む、一般的なアプリケーションのオフィススイートのWebバージョンです。



無料でダウンロードして、ドキュメント表示モードで使用できます。



OneDriveで OWAの動作を見ることができます。 読み取りモードのいくつかのドキュメント:





OWAは別の物理サーバーにインストールされ、ブラウザーでドキュメントを表示する役割のみを果たします。 ファイルストレージを整理するためのすべてのロジックは、アプリケーションに依存します。 OWAとリポジトリ間の相互作用は、実装する必要があるWOPI APIを介して行われます。

画像








ウィザードと[次へ]ボタンを使用してインストールします。

HTTPSでの正常なインストール後:// OWA-server / hosting / discoveryサポートされているアプリケーション、アクション、およびURLアクセスパターンのxml記述があります。



<?xml version="1.0" encoding="utf-8"?> <wopi-discovery> <net-zone name="external-http"> <app name="Excel" favIconUrl="https://OWA-server/x/_layouts/images/FavIcon_Excel.ico" checkLicense="true"> ... </app> <app name="OneNote" favIconUrl="https://OWA-server/o/resources/1033/FavIcon_OneNote.ico" checkLicense="true"> ... </app> <app name="PowerPoint" favIconUrl="https://OWA-server/p/resources/1033/FavIcon_Ppt.ico" checkLicense="true"> ... </app> <app name="Word" favIconUrl="https://OWA-server/wv/resources/1033/FavIcon_Word.ico" checkLicense="true"> ... <action name="view" ext="docx" default="true" urlsrc="https://OWA-server/wv/wordviewerframe.aspx?<ui=UI_LLCC&><rs=DC_LLCC&><showpagestats=PERFSTATS&>" /> ... <action name="view" ext="odt" default="true" urlsrc="https://OWA-server/wv/wordviewerframe.aspx?<ui=UI_LLCC&><rs=DC_LLCC&><showpagestats=PERFSTATS&>" /> ... <action name="edit" ext="docx" requires="locks,cobalt,update" urlsrc="https://OWA-server/we/wordeditorframe.aspx?<ui=UI_LLCC&><rs=DC_LLCC&><showpagestats=PERFSTATS&>" /> ... <action name="editnew" ext="docx" requires="locks,cobalt,update" urlsrc="https://OWA-server/we/wordeditorframe.aspx?new=1&<ui=UI_LLCC&><rs=DC_LLCC&><showpagestats=PERFSTATS&>" /> ... <action name="imagepreview" ext="doc" urlsrc="https://OWA-server/wv/WordPreviewHandler.ashx?<ui=UI_LLCC&><rs=DC_LLCC&><showpagestats=PERFSTATS&>" /> <action name="interactivepreview" ext="doc" urlsrc="https://OWA-server/wv/wordviewerframe.aspx?embed=1&<ui=UI_LLCC&><rs=DC_LLCC&><showpagestats=PERFSTATS&>" /> ... <action name="mobileView" ext="doc" urlsrc="https://OWA-server/wv/wordviewerframe.aspx?<ui=UI_LLCC&><rs=DC_LLCC&><showpagestats=PERFSTATS&>" /> ... <action name="embedview" ext="doc" urlsrc="https://OWA-server/wv/wordviewerframe.aspx?embed=1&<ui=UI_LLCC&><rs=DC_LLCC&><showpagestats=PERFSTATS&>" /> ... </app> <app name="WordPdf" favIconUrl="https://OWA-server/wv/resources/1033/FavIcon_Word.ico" checkLicense="true"> ... </app> </net-zone> <proof-key oldvalue="" value="..." /> </wopi-discovery>
      
      





ドットの後ろに隠されているものがたくさんあります。 ただし、残りの手順では、Microsoft OfficeドキュメントとOpen Officeドキュメントの両方がサポートされていることを示しています。 表示(表示)に加えて、文書を開いて編集することもできます。 モバイル版(mobileView)があります。 OWAは、ドキュメントの最初のページのプレビューを画像として生成(imagepreview)し、ドキュメントのすべてのページのプレビュー(interactivepreview)を生成できます。



Wordブラウザーで拡張子docxのドキュメントを表示するとします。 URLテンプレートを見つけます。

HTTP://OWA-server/wv/wordviewerframe.aspx?<Ui = UI_LLCC&> <rs = DC_LLCC&> <showpagestats = PERFSTATS&>

オプションのパラメーターは山括弧(<>)で囲まれています:





このURLに、OWAがリポジトリからドキュメントを要求するWOPISrcパラメーターと、承認のためのファイル要求とともに送信されるaccess_tokenパラメーターを追加する必要があります。



その結果、HTTPSという形式のURLがあります://OWA-server/wv/wordviewerframe.aspx?WOPISrc = https%3A%2F%2Fmy-wopi-host%2Fwopi%2Ffiles%2FDocument.docx&access_token = 0bf6fe96-3510-4105-ac1cfc1cfc (*)



ウォピ



WOPI(Webアプリケーションオープンプラットフォームインターフェイス)は、ファイルストレージ上のファイルにアクセスして変更するための一連の操作を定義するRESTful APIです。 HTTP / HTTPSを介して機能します。



WOPIからドキュメントを表示するために必要な最小限の操作で、単純なファイルストレージのを用意しました。 ASP.Net MVC 5のプロジェクト。しかし、他のフレームワークとプログラミング言語の使用を妨げるものは何もありません。



少し前に受け取ったURL(*)をブラウザーで開きましょう。



まず、OWAはHTTPアドレスで利用可能なCheckFileInfoメソッドを呼び出します:// server / <...> / wopi * / files / <id>?Access_token = <token>。

メソッドの実装:

 [Route("files/{fileName}")] [HttpGet] public FileInfoDto CheckFileInfo(string fileName, [FromUri(Name = "access_token")] Guid tokenId) { var fullFileName = GetFullPath(fileName); Validation(tokenId, fullFileName); return new FileInfoDto { BaseFileName = fileName, OwnerId = "admin", ReadOnly = true, SHA256 = GetChecksum(fullFileName), Size = new FileInfo(fullFileName).Length, Version = 1 }; } private static string GetChecksum(string filePath) { using (var stream = new BufferedStream(File.OpenRead(filePath), 1200000)) { var checksum = SHA256.Create().ComputeHash(stream); return Convert.ToBase64String(checksum); } }
      
      







必須パラメーターのみがここに返されます。 これはファイル情報です。 たとえば、ファイルを編集できるかどうか、作成者に関する情報、フォルダーの操作のサポート、ユーザー権限に関する情報、ファイルをコピーから保護する必要があるかどうかなど、多くのオプションのパラメーターで説明します。 すべての設定はここで説明されています



メソッドが正常に完了して正しいデータを返した場合、OWA HTTPアドレス// server / <...> / wopi * / files / <id> / contents?Access_token = <token>でファイル自体を要求します。

ファイルを提供します:

 [Route("wopi/files/{fileName}/contents")] [HttpGet] public HttpResponseMessage GetFile(string fileName, [FromUri(Name = "access_token")] Guid tokenId) { var fullFileName = GetFullPath(fileName); Validation(tokenId, fullFileName); var stream = new FileStream(fullFileName, FileMode.Open); var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StreamContent(stream) }; result.Content.Headers.ContentType = new MediaTypeHeaderValue(MimeMapping.GetMimeMapping(fileName)); result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = fileName }; return result; }
      
      







実際、ファイルを表示するために必要な機能を作成しました!





このアイデア全体の中で最も狭くて高価な場所。



最小システム要件:





8 GBのRAMを搭載した8コアサーバーは10,000ユーザーの負荷に耐えることができると言われています。 16 GBおよび16 GBのRAM-20,000ユーザー。



サポートされているオペレーティングシステム:





別の物理サーバーまたは仮想サーバーに配置されます。 ただし、他のサーバーアプリケーション(MS SQL Serverなど)を同じサーバーにインストールすることはできません。



サーバーはドメインの一部である必要があります 。そうしないと、OWAがインストールされません。 また、ドメインコントローラーにインストールした場合、OWAは機能しません。



ブラウザでドキュメントを編集することは可能ですか?



OWAは編集をサポートしていますが、ドキュメント表示は無料でのみ使用できます。 編集にはライセンスが必要です。



デフォルトでは、編集モードはオフになっています。 ただし、いつでもオンにすることができます。 PowerPointおよびExcelドキュメントの編集は、WOPIを介して機能します。 ただし、Wordの場合はFSSHTTPを実装する必要があります。



All Articles