このトピックでは、オンラインドキュメントコラボレーションの機能、実装、および使用方法について説明します。
機能
オンラインドキュメントコラボレーションを使用すると、複数のユーザーが同じドキュメントをオンラインでリアルタイムにプレビューまたは編集できます。 これにより、作業効率が向上します。 次の機能がサポートされています。
ドキュメントの更新は自動的に同期され、保存されるため、ドキュメントの内容が失われることはありません。
履歴バージョンはリアルタイムで保存されます。 ドキュメントを指定した履歴バージョンに復元できます。
アプリケーションは、携帯電話、コンピューター、Web ページなど、すべてのプラットフォームで使用できます。
オフィスソフトウェアに精通している人なら誰でも、オンラインドキュメントコラボレーションを簡単に使用できます。
さまざまな種類のドキュメントをプレビューまたは編集できます。
プレビューでサポートされているファイル形式:
ドキュメント (Word): .doc、.dot、.wps、.wpt、.docx、.dotx、.docm、.dotm、および .rtf。
プレゼンテーション (PowerPoint): .ppt、.pptx、.pptm、.ppsx、.ppsm、.pps、.potx、.potm、.dpt、および .dps。
表 (Excel): .xls、.xlt、.et、.xlsx、.xltx、.csv、.xlsm、および .xltm。
PDF ファイル (PDF): .pdf。
編集でサポートされているファイル形式:
ドキュメント (Word): .doc、.dot、.wps、.wpt、.docx、.dotx、.docm、および .dotm。
プレゼンテーション (PowerPoint): .ppt、.pptx、.pptm、.ppsx、.ppsm、.pps、.potx、.potm、.dpt、および .dps。
表 (Excel): .xls、.xlt、.et、.xlsx、.xltx、.xlsm、および .xltm。
コンポーネントステータス、イベント、テキストドキュメントの機能、表ドキュメントの機能の構成など、ドキュメントコラボレーションのカスタム構成がサポートされています。
ドキュメントのプレビューと編集でサポートされているドキュメント形式の詳細については、「ドキュメントの制限」をご参照ください。
ドキュメントのプレビュー中にオンラインの共同編集を無効にする場合、またはプレビュー中にコンテンツの更新が表示されないようにする場合は、キャッシュされたプレビューを使用できます。 キャッシュされたプレビューモードでは、オンライン編集はプレビュー中のコンテンツに影響を与えたり、更新したりしません。 キャッシュされたプレビューの構成方法の詳細については、「API ドキュメント」をご参照ください。
実装
IMM の WebOffice サービスと統合するには、Web アプリケーションのサーバー側とフロントエンドの両方のコードを変更する必要があります。
最初に、元のドキュメントが OSS に保存されていることを確認します。 フロントエンドは、サーバーでカプセル化された操作を呼び出して、ドキュメントのコラボレーション URL と AccessToken を取得します。 次に、フロントエンドは js-sdk を呼び出して初期化し (指定されたブロック要素の下にiframe
を動的に生成します)、AccessToken を設定してドキュメントのプレビューまたは編集を実装します。
前提条件
AccessKey ペアが作成され、取得されます。 詳細については、「AccessKey ペアの取得」をご参照ください。
Object Storage Service (OSS) がアクティブ化され、バケットが作成され、ドキュメントがバケットにアップロードされます。 詳細については、「オブジェクトをアップロードする」をご参照ください。
Intelligent Media Management (IMM) がアクティブ化されます。 詳細については、「IMM をアクティブ化する」をご参照ください。
IMM コンソールでプロジェクトが作成されます。 詳細については、「プロジェクトを作成する」をご参照ください。
説明CreateProject 操作を呼び出して、プロジェクトを作成できます。 詳細については、「CreateProject - プロジェクトを作成する」をご参照ください。
ListProjects - すべてのプロジェクト情報を一覧表示する 操作を呼び出して、指定したリージョンに作成されたすべてのプロジェクトを一覧表示できます。
OSS バケットのドメイン名がプレビューサービスのドメイン名と異なる場合は、ドキュメントを保存するバケットにオリジン間リソース共有 (CORS) が構成されていることを確認して、プレビューサービスのドメイン名からのアクセスを許可してください。 詳細については、「CORS を構成する」をご参照ください。
その他の制限
ドキュメントの編集とドキュメントのプレビューは、JS-SDK によって提供される同じ API 操作を呼び出します。 GenerateWebofficeToken - Weboffice トークンを取得する 操作を呼び出して AccessToken を取得する場合は、プレビューモードで注:注:
true
パラメーターの パラメーターを に設定します。GenerateWebofficeToken - Weboffice トークンを取得する 操作によって返される URL は、直接開くことができません。 JS-SDK を使用して URL にアクセスする必要があります。
GenerateWebofficeToken - Weboffice トークンを取得する 操作によって返される AccessToken は 30 分間有効です。 AccessToken の有効期限が切れる前にプレビューを開く必要があります。 有効期限が切れるとプレビューを開くことができません。
GenerateWebofficeToken - Weboffice トークンを取得する 操作によって返される RefreshToken は 1 回だけ使用でき、更新に再利用することはできません。
PDF ファイルはオンラインプレビューのみをサポートし、編集はサポートしていません。 権限 パラメーターの 読み取り専用 パラメーターを
true
に設定する必要があります。HTML ページは、ドキュメントのプレビューまたは編集用に 1 つの WebOffice インスタンスのみをサポートします。
使用方法
手順 1: サーバーで操作をカプセル化する
GenerateWebofficeToken - Weboffice トークンを取得する 操作と RefreshWebofficeToken - Weboffice トークンを更新する 操作をサーバーでカプセル化して、フロントエンドが直接呼び出すための編集 URL と AccessToken を取得します。 次の例では、test-project
という名前のプロジェクトと oss://test-bucket/test-object.docx
にある OSS ファイルの操作をカプセル化する方法について説明します。
GenerateWebofficeToken - Weboffice トークンを取得する 操作を呼び出して、コラボレーション URL を取得します。
クエリの例
{ "ProjectName": "test-project", // IMM プロジェクトの名前。 "SourceURI": "oss://test-bucket/test-object.docx", // OSS 内のドキュメントの URI。 "Filename": "test-object.docx", // ドキュメントの名前。 "UserData": "{\"fid\": \"123\"}", // ユーザーデータ。MNS 通知で返されます。 "PreviewPages": 3, // プレビューページの数。 "Permission": "{\"Rename\": \"true\", \"Readonly\": \"false\"}", // 権限。 "User": "{\"Id\": \"test\", \"Name\": \"testuser\", \"Avatar\": \"http://xx.com/avatar.jpg\"}", // オンラインコラボレーションに表示されるユーザー情報。 "Watermark": "{\"Type\": \"1\", \"Value\": \"imm\"}" // ウォーターマークを設定します。 }
サンプルレスポンス
{ "RefreshToken": "f1fd1afd79ee445f95d3dd99f34f35ffv3", "RequestId": "BC63D209-5E53-00E9-8D24-7043943DBC89", "AccessToken": "3de242da81e1433abefbbea000aaae39v3", "RefreshTokenExpiredTime": "2022-07-06T23:18:52.856132358Z", "WebofficeURL": "https://office-cn-shanghai.imm.aliyuncs.com/office/w/7c1a7b53d6a4002751ac4bbaea69405a01475f4a?_w_tokentype=1", "AccessTokenExpiredTime": "2022-07-05T23:48:52.856132358Z" }
完全なサンプルコード (Python V1.27.3 用 IMM SDK)
# -*- coding: utf-8 -*- import os from alibabacloud_imm20200930.client import Client as imm20200930Client from alibabacloud_tea_openapi import models as open_api_models from alibabacloud_imm20200930 import models as imm_20200930_models from alibabacloud_tea_util import models as util_models from alibabacloud_tea_util.client import Client as UtilClient class Sample: def __init__(self): pass @staticmethod def create_client( access_key_id: str, access_key_secret: str, ) -> imm20200930Client: """ AccessKey ID と AccessKey シークレットを使用してクライアントを初期化します。 @param access_key_id: @param access_key_secret: @return: Client @throws Exception """ config = open_api_models.Config( access_key_id=access_key_id, access_key_secret=access_key_secret ) # アクセスするドメイン名を指定します。 config.endpoint = f'imm.cn-shenzhen.aliyuncs.com' return imm20200930Client(config) @staticmethod def main() -> None: # Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持っています。 これらの資格情報を使用して操作を実行することは、リスクの高い操作です。 RAM ユーザーを使用して API 操作を呼び出したり、日常的な O&M を実行することをお勧めします。 # データセキュリティ上の理由から、プロジェクトコードに AccessKey ペア (AccessKey ID と AccessKey シークレット) を含めないことをお勧めします。 # この例では、環境変数から AccessKey ペアを読み取って、API アクセスの ID 検証を実装しています。 環境変数の構成方法については、https://www.alibabacloud.com/help/ja/imm/developer-reference/configure-environment-variables?spm=a3c0i.29367734.6737026690.8.6d266e9bORGXvg をご参照ください。 imm_access_key_id = os.getenv("AccessKeyId") imm_access_key_secret = os.getenv("AccessKeySecret") client = Sample.create_client(imm_access_key_id, imm_access_key_secret) # ウォーターマークを設定します。 weboffice_watermark = imm_20200930_models.WebofficeWatermark( type=1, value='imm' ) # コラボレーター情報を設定します。 weboffice_user = imm_20200930_models.WebofficeUser( id='test', name='testuser', avatar='http://xx.com/avatar.jpg' ) # 権限を設定します。 weboffice_permission = imm_20200930_models.WebofficePermission( rename=True ) get_weboffice_urlrequest = imm_20200930_models.GenerateWebofficeTokenRequest( # IMM プロジェクト名を設定します。 project_name='test-project', # コラボレーションするドキュメントの URI を設定します。 source_uri='oss://test-bucket/test-object.docx', # ドキュメントの名前を設定します。 filename='test-object.docx', # ユーザーデータを設定します。 user_data='{"fid": "123"}', preview_pages=3, external_uploaded=False, permission=weboffice_permission, user=weboffice_user, watermark=weboffice_watermark ) runtime = util_models.RuntimeOptions() try: # API 操作の戻り値を出力します。 response = client.get_weboffice_urlwith_options(get_weboffice_urlrequest, runtime) print(response.body.to_map()) except Exception as error: # 必要に応じて、エラーメッセージを出力します。 UtilClient.assert_as_string(error.message) print(error) if __name__ == '__main__': Sample.main()
RefreshWebofficeToken - Weboffice トークンを更新する 操作を呼び出して、AccessToken を更新します。
AccessToken の有効期限が切れると、フロントエンドはサーバーの RefreshWebofficeToken 操作を呼び出して AccessToken を更新する必要があります。 レスポンスの形式は、GenerateWebofficeToken 操作を呼び出した場合のレスポンスの形式と同じです。
手順 2: フロントエンドで JS-SDK を使用する
JS-SDK を使用して、返されたコラボレーション URL を HTML ページのブロック要素にマウントし、AccessToken を設定します。
JS-SDK をインポートします。
この例では、
${x.y.z}
は JS-SDK の最新バージョン番号を示しています。 実際のバージョン番号に置き換えてください。 最新バージョンについては、「JS-SDK バージョン」をご参照ください。<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>デモ</title> </head> <body> <script src="https://g.alicdn.com/IMM/office-js/${x.y.z}/aliyun-web-office-sdk.min.js"></script> <script> console.log('インポート後、JS-SDK を使用できます!'); console.log(aliyun); //グローバル変数名。 </script> </body> </html>
初期化。
フロントエンドは、サーバーでカプセル化された GenerateWebofficeToken 操作を使用して、tokenInfo オブジェクトを取得します。
この例では、tokenInfo オブジェクトが GenerateWebofficeToken 操作へのレスポンスと同じ構造であると想定しています。 次のコードでは、サーバーでカプセル化された GenerateWebofficeToken 操作
/getTokenInfo
を使用しています。// コラボレーション URL と AccessToken を取得します。 var tokenInfo = await $.get('http://example.com/getTokenInfo') // 初期化 let instance = aliyun.config({ url: tokenInfo.WebofficeURL // ドキュメントコラボレーション URL を設定します。 })
iframe のマウントポイントを設定します。
説明DOMContentLoaded イベントがトリガーされた後、初期化を実行する前にマウントノードが存在することを確認してください。
デフォルトでは、iframe は body 要素にマウントされます。 必要に応じて、iframe のマウントポイントを設定できます。
let instance = aliyun.config({ mount: document.querySelector('#container'), url: 'ドキュメントコラボレーション URL' // 手順 2 のドキュメントコラボレーション URL tokenInfo.WebofficeURL。 })
iframe オブジェクトをカスタマイズする必要がある場合は、インスタンス化された JS-SDK を使用して iframe のドキュメントオブジェクトモデル (DOM) オブジェクトを取得できます。
var instance = aliyun.config({ mount: document.querySelector('#container') //... }) console.log(instance.iframe)
トークンを設定します。
重要2023 年 5 月 1 日より前に作成されたプロジェクトの WebOffice オンラインドキュメントコラボレーションは、コラボレーション URL が開かれた回数に基づいて課金されます。
2023 年 5 月 1 日以降に作成されたプロジェクトの WebOffice オンラインドキュメントコラボレーションは、API 呼び出し回数に基づいて課金されます。 GenerateWebofficeToken 操作と RefreshWebofficeToken 操作を呼び出すと課金されます。
JS-SDK は、RefreshWebofficeToken 操作を呼び出して、有効期限が切れる 5 分前にトークンを更新します。 したがって、タイムアウト値は 20 分 (20 × 60 × 1000 ミリ秒) より大きくする必要があります。 トークンのデフォルトの有効期間は 30 分です。 これにより、頻繁なトークンの更新と追加料金を防ぎます。
取得したコラボレーション URL にアクセスするには、トークンを設定する必要があります。
各トークンが更新された後、このメソッドを使用してトークンを設定する必要があります。
//https://www.alibabacloud.com/help/ja/imm/developer-reference/api-imm-2020-09-30-createsimilarimageclusteringtask?spm=a2c63.p38356.0.i3 // ビジネス要件に基づいて、非同期リクエストまたはテンプレート出力を使用してトークンを取得します。 var token = 'yourToken'; // トークンを指定します。 instance.setToken({ token: token, timeout: 25 * 60 * 1000, // トークンの有効期間。 このパラメーターは必須です。 単位: ミリ秒。 この例では、トークンの有効期間は 25 分に設定されています。 有効期限が切れる 5 分前に refreshToken 関数を使用してトークンを更新できます。 })
タイムアウト後にトークンを更新します。
フロントエンドは、サーバーでカプセル化された RefreshWebofficeToken 操作を使用して、tokenInfo オブジェクトを取得します。 この例では、tokenInfo オブジェクトが RefreshWebofficeToken 操作へのレスポンスと同じ構造であると想定しています。
トークンを取得する関数を渡すことができます。 トークンの有効期間がタイムアウトすると、JS-SDK は自動的に関数を呼び出し、新しいトークンを含む promise オブジェクトまたは共通オブジェクトを返します。
次の例では、サーバーでカプセル化された GetWebofficeToken 操作
/refreshTokenInfo
を使用しています。// トークンの更新のために最後の tokenInfo をキャッシュします。 let lastTokenInfo = tokenInfo // トークン関数を取得します。 // 注: refreshToken は非同期関数をサポートしていません。 promise または {token,timeout} オブジェクトのみを返すことができます。 const refreshToken = function() { return new Promise(function(resolve){ // ビジネス処理ロジック。 サーバーでカプセル化された refreshToken 操作を呼び出します。 $.get('http://example.com/refreshTokenInfo',{ RefreshToken: lastTokenInfo.RefreshToken, AccessToken: lastTokenInfo.AccessToken, //.... }).then(function(tokenInfo){ lastTokenInfo = tokenInfo resolve({ token: tokenInfo.AccessToken, // このパラメーターは必須です。 timeout: 25 * 60 * 1000, // トークンの有効期間。 このパラメーターは必須です。 単位: ミリ秒。 この例では、トークンの有効期間は 25 分に設定されています。 有効期限が切れる 5 分前に refreshToken 関数を使用してトークンを更新できます。 }) }) }) } // トークンを取得する関数を構成します。 aliyun.config({ //... refreshToken })
サンプルコード
ドキュメントプレビューの完全な JS-SDK サンプルコードについては、以下をご参照ください。