Todos os produtos
Search
Central de documentação

Intelligent Media Management:Início Rápido: Colaboração em Documentos Online com WebOffice

Última atualização: Jun 27, 2026

Integre o serviço WebOffice à sua aplicação web para permitir que vários usuários visualizem e editem documentos armazenados no OSS em tempo real, com sincronização automática das alterações.

Recursos

Vários usuários podem visualizar ou editar o mesmo documento simultaneamente. Os principais recursos incluem:

  • Sincronização e salvamento automáticos -- O sistema sincroniza e salva as atualizações automaticamente para evitar perda de conteúdo.

  • Histórico de versões -- As versões são salvas em tempo real. Restaure o documento para uma versão histórica específica quando necessário.

  • Compatibilidade multiplataforma -- Funciona em todas as plataformas, incluindo celulares, computadores e navegadores web.

  • Facilidade de uso -- Qualquer pessoa familiarizada com softwares de escritório consegue começar a usar imediatamente.

  • Configurações personalizadas -- Configure o status do componente, eventos e recursos específicos para documentos de texto e planilhas.

  • Visualização em cache -- Desativa a edição colaborativa online durante a visualização para impedir que atualizações de conteúdo apareçam. Nesse modo, as edições em andamento não afetam o conteúdo exibido. Para detalhes de configuração, consulte a documentação da API GenerateWebofficeToken.

Formatos de arquivo suportados

Os formatos de arquivo listados abaixo são suportados para visualização e edição. Para obter a lista completa de limites de formato de documento, consulte Limites de documentos.

Tipo de arquivo

Visualização

Edição

Documentos (Word)

.doc, .dot, .wps, .wpt, .docx, .dotx, .docm, .dotm, .rtf

.doc, .dot, .wps, .wpt, .docx, .dotx, .docm, .dotm

Apresentações (PowerPoint)

.ppt, .pptx, .pptm, .ppsx, .ppsm, .pps, .potx, .potm, .dpt, .dps

.ppt, .pptx, .pptm, .ppsx, .ppsm, .pps, .potx, .potm, .dpt, .dps

Planilhas (Excel)

.xls, .xlt, .et, .xlsx, .xltx, .csv, .xlsm, .xltm

.xls, .xlt, .et, .xlsx, .xltx, .xlsm, .xltm

Arquivos PDF (PDF)

.pdf

Não suportado

Nota

Arquivos PDF suportam apenas visualização online e não permitem edição. Defina o parâmetro Readonly dentro de Permission como true.

Arquitetura

A integração do serviço WebOffice do IMM exige alterações tanto no código do servidor quanto no frontend da sua aplicação web.

O documento source deve estar armazenado no OSS. O frontend chama operações do lado do servidor para obter a URL de colaboração e o AccessToken. Em seguida, utiliza o JS-SDK para inicializar o editor (gerando dinamicamente um iframe sob o elemento de bloco especificado) e define o AccessToken para habilitar a visualização ou edição do documento.

Architecture diagram

Pré-requisitos

  1. Crie e obtenha um par de AccessKey. Para mais informações, consulte Obter um par de AccessKey.

  2. Ative o Object Storage Service (OSS), crie um bucket e faça upload dos documentos para esse bucket. Para mais informações, consulte Fazer upload de objetos.

  3. Ative o Intelligent Media Management (IMM). Para mais informações, consulte Ativar o IMM.

  4. Crie um projeto no console do IMM. Para mais informações, consulte Criar um projeto.

    Nota
  5. Se o nome de domínio do bucket do OSS for diferente do nome de domínio do serviço de visualização, configure o compartilhamento de recursos de origem cruzada (CORS) no bucket para permitir o acesso a partir do domínio do serviço de visualização. Para mais informações, consulte Configurar CORS.

Limitações

Limitação

Detalhes

A URL do WebOffice não pode ser aberta diretamente

A URL retornada por GenerateWebofficeToken não pode ser aberta diretamente no navegador. Use o JS-SDK para acessá-la.

Validade do AccessToken

O AccessToken é válido por 30 minutos. Abra a visualização antes que o token expire; caso contrário, ela não será carregada.

Uso único do RefreshToken

O RefreshToken pode ser usado apenas uma vez e não permite reutilização para atualização.

PDF apenas para visualização

Arquivos PDF suportam somente visualização online, sem suporte a edição. Defina Readonly em Permission como true.

Uma instância por página

Uma página HTML suporta apenas uma instância do WebOffice para visualização ou edição de documentos.

Modo de visualização versus edição

A edição e a visualização de documentos chamam a mesma API via JS-SDK. Para ativar o modo de visualização, defina o parâmetro Readonly em Permission como true ao chamar GenerateWebofficeToken.

Ciclo de vida do token

Token

Finalidade

Validade

Mecanismo de atualização

AccessToken

Autentica requisições do JS-SDK

30 minutos

Chame RefreshWebofficeToken no servidor

RefreshToken

Obtém um novo AccessToken

1 dia (uso único)

Uso único; cada atualização retorna um novo RefreshToken

O JS-SDK chama automaticamente RefreshWebofficeToken 5 minutos antes da expiração do token. Defina o valor de timeout como superior a 20 minutos (20 x 60 x 1000 milissegundos) para evitar atualizações frequentes de token. O período de validade padrão do token é de 30 minutos.

Importante

A atualização de tokens gera cobranças de chamadas de API. Para detalhes de faturamento, consulte Faturamento do IMM.

  • Projetos criados antes de 1º de maio de 2023: Cobrança baseada no número de vezes que a URL de colaboração é aberta.

  • Projetos criados após 1º de maio de 2023: Cobrança baseada no número de chamadas de API para GenerateWebofficeToken e RefreshWebofficeToken.

Etapa 1: Configurar o servidor

Encapsule as operações GenerateWebofficeToken e RefreshWebofficeToken em seu servidor para que o frontend possa obter a URL de colaboração e o AccessToken.

O exemplo a seguir utiliza um projeto chamado test-project e um arquivo do OSS localizado em oss://test-bucket/test-object.docx.

Chamar GenerateWebofficeToken para obter a URL de colaboração

Exemplo de requisição

{
    "ProjectName": "test-project",        // The name of the IMM project.
    "SourceURI": "oss://test-bucket/test-object.docx", // The URI of the document in OSS.
    "Filename": "test-object.docx",       // The name of the document.
    "UserData": "{\"fid\": \"123\"}",     // The user data, which is returned in the MNS notification.
    "PreviewPages": 3,                    // The number of preview pages.
    "Permission": "{\"Rename\": \"true\", \"Readonly\": \"false\"}", // The permissions.
    "User": "{\"Id\": \"test\", \"Name\": \"testuser\", \"Avatar\": \"http://xx.com/avatar.jpg\"}", // The user information displayed for online collaboration.
    "Watermark": "{\"Type\": \"1\", \"Value\": \"imm\"}" // Set a watermark.
}

Exemplo de resposta

{
    "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"
}

Código de exemplo completo (SDK do IMM para Python V1.27.3)

# -*- 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:
        """
        Use the AccessKey ID and AccessKey secret to initialize a client.
        @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
        )
        # Specify the domain name you want to access.
        config.endpoint = f'imm.cn-shenzhen.aliyuncs.com'
        return imm20200930Client(config)

    @staticmethod
    def main() -> None:
        # The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. Using these credentials to perform operations is a high-risk operation. We recommend that you use a RAM user to call API operations or perform routine O&M.
        # We recommend that you do not include your AccessKey pair (AccessKey ID and AccessKey secret) in your project code for data security reasons.
        # In this example, the AccessKey pair is read from the environment variables to implement identity verification for API access. For information about how to configure environment variables, visit https://www.alibabacloud.com/help/en/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)
        # Set a watermark.
        weboffice_watermark = imm_20200930_models.WebofficeWatermark(
            type=1,
            value='imm'
        )
        # Set the collaborator information.
        weboffice_user = imm_20200930_models.WebofficeUser(
            id='test',
            name='testuser',
            avatar='http://xx.com/avatar.jpg'
        )
        # Set permissions.
        weboffice_permission = imm_20200930_models.WebofficePermission(
            rename=True
        )
        get_weboffice_urlrequest = imm_20200930_models.GenerateWebofficeTokenRequest(
            # Set the IMM project name.
            project_name='test-project',
            # Set the URI of the document for collaboration.
            source_uri='oss://test-bucket/test-object.docx',
            # Set the name of the document.
            filename='test-object.docx',
            # Set user data.
            user_data='{"fid": "123"}',
            preview_pages=3,
            external_uploaded=False,
            permission=weboffice_permission,
            user=weboffice_user,
            watermark=weboffice_watermark
        )
        runtime = util_models.RuntimeOptions()
        try:
            # Print the return value of the API operation.
            response = client.get_weboffice_urlwith_options(get_weboffice_urlrequest, runtime)
            print(response.body.to_map())
        except Exception as error:
            # Print the error message if necessary.
            UtilClient.assert_as_string(error.message)
            print(error)

if __name__ == '__main__':
    Sample.main()

Chamar RefreshWebofficeToken para atualizar o AccessToken

Quando um AccessToken expira, o frontend chama a operação RefreshWebofficeToken no servidor para obter um novo token. O formato da resposta corresponde ao da resposta de GenerateWebofficeToken.

Etapa 2: Configurar o frontend com JS-SDK

Use o JS-SDK para montar a URL de colaboração em um elemento de bloco na sua página HTML e configurar o AccessToken.

Importar o JS-SDK

No exemplo a seguir, ${x.y.z} é um espaço reservado para o número da versão do JS-SDK. Substitua-o pela versão mais recente disponível. Para informações sobre versões, consulte Versões do 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>Demo</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('After importing, the JS-SDK is available for use!');
    console.log(aliyun); //Global variable name.
  </script>
</body>
</html>

Inicializar o JS-SDK

O frontend obtém o objeto tokenInfo chamando a operação GenerateWebofficeToken em seu servidor.

Este exemplo pressupõe que o objeto tokenInfo corresponda à estrutura de resposta de GenerateWebofficeToken. O endpoint do servidor /getTokenInfo representa o wrapper do lado do servidor para GenerateWebofficeToken.

// Obtain the collaboration URL and AccessToken.
var tokenInfo = await $.get('http://example.com/getTokenInfo')

// Initialization
let instance = aliyun.config({
  url: tokenInfo.WebofficeURL // Set the document collaboration URL.
})

Definir o ponto de montagem do iframe

Nota

Após o acionamento do evento DOMContentLoaded, certifique-se de que o nó de montagem exista antes de executar a inicialização.

Por padrão, o iframe é montado no elemento body. Para especificar um ponto de montagem personalizado:

let instance = aliyun.config({
  mount: document.querySelector('#container'),
  url: 'The document collaboration URL' // The document collaboration URL tokenInfo.WebofficeURL from Step 2b.
})

Para personalizar o objeto iframe, acesse o objeto DOM por meio da instância do JS-SDK:

var instance = aliyun.config({
    mount: document.querySelector('#container')
   //...
})
console.log(instance.iframe)

Definir o token

Configure o token para acessar a URL de colaboração. Chame este método novamente sempre que o token for atualizado.

Importante

O valor de timeout deve ser superior a 20 minutos (20 x 60 x 1000 milissegundos). O período de validade padrão do token é de 30 minutos. O JS-SDK atualiza o token 5 minutos antes da expiração. Definir um timeout muito baixo causa atualizações frequentes de token e pode gerar cobranças adicionais.

// Obtain the token by using an asynchronous request or template output based on your business requirements.
var token = 'yourToken';
// Specify the token.
instance.setToken({
  token: token,
  timeout: 25 * 60 * 1000, // The token validity period. This parameter is required. Unit: milliseconds. In this example, the token validity period is set to 25 minutes. You can use the refreshToken function to refresh the token 5 minutes before it expires.
})

Configurar a atualização automática de token

O frontend obtém o objeto tokenInfo chamando a operação RefreshWebofficeToken em seu servidor. O exemplo a seguir pressupõe que o objeto tokenInfo corresponda à estrutura de resposta de RefreshWebofficeToken.

Forneça uma função que obtenha o token. Quando o período de validade do token expirar, o JS-SDK chamará essa função automaticamente. A função deve retornar uma promise ou um objeto simples contendo o novo token.

O exemplo abaixo usa o endpoint do servidor /refreshTokenInfo para representar o wrapper do lado do servidor para RefreshWebofficeToken.

Nota

A função refreshToken não suporta funções assíncronas. Apenas uma promise ou um objeto {token, timeout} pode ser retornado.

// Cache the last tokenInfo for token refreshing.
  let lastTokenInfo = tokenInfo

// Obtain the token function.
// Note: refreshToken does not support async functions. Only promise or {token,timeout} objects can be returned.
  const refreshToken = function() {
    return new Promise(function(resolve){
      // The business processing logic. Call the refreshToken operation that is encapsulated on the server.
      $.get('http://example.com/refreshTokenInfo',{
        RefreshToken: lastTokenInfo.RefreshToken,
        AccessToken: lastTokenInfo.AccessToken,
        //....
      }).then(function(tokenInfo){
        lastTokenInfo = tokenInfo
        resolve({
          token: tokenInfo.AccessToken, // This parameter is required.
          timeout: 25 * 60 * 1000, // The token validity period. This parameter is required. Unit: milliseconds. In this example, the token validity period is set to 25 minutes. You can use the refreshToken function to refresh the token 5 minutes before it expires.
        })
      })
    })
  }
// Configure the function that obtains the token.
aliyun.config({
  //...
  refreshToken
})

Exemplo completo

Veja a seguir um exemplo completo de JS-SDK para visualização de documentos:

<!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>WebOffice Preview Demo</title>
  <style>
    #container {
      width: 100%;
      height: 100vh;
    }
  </style>
</head>
<body>
  <div id="container"></div>
  <script src="https://g.alicdn.com/IMM/office-js/${x.y.z}/aliyun-web-office-sdk.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
  <script>
    (async function() {
      // Step 1: Obtain the collaboration URL and AccessToken from your server.
      var tokenInfo = await $.get('http://example.com/getTokenInfo')

      // Step 2: Cache the tokenInfo for token refreshing.
      let lastTokenInfo = tokenInfo

      // Step 3: Define the token refresh function.
      // Note: refreshToken does not support async functions. Only promise or {token,timeout} objects can be returned.
      const refreshToken = function() {
        return new Promise(function(resolve){
          $.get('http://example.com/refreshTokenInfo', {
            RefreshToken: lastTokenInfo.RefreshToken,
            AccessToken: lastTokenInfo.AccessToken,
          }).then(function(tokenInfo){
            lastTokenInfo = tokenInfo
            resolve({
              token: tokenInfo.AccessToken,
              timeout: 25 * 60 * 1000,
            })
          })
        })
      }

      // Step 4: Initialize the JS-SDK.
      let instance = aliyun.config({
        mount: document.querySelector('#container'),
        url: tokenInfo.WebofficeURL,
        refreshToken
      })

      // Step 5: Set the initial token.
      instance.setToken({
        token: tokenInfo.AccessToken,
        timeout: 25 * 60 * 1000,
      })
    })()
  </script>
</body>
</html>
Nota

Substitua ${x.y.z} pelo número real da versão do JS-SDK e substitua http://example.com/getTokenInfo e http://example.com/refreshTokenInfo pelos endpoints reais do seu servidor.