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) |
|
Não suportado |
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.

Pré-requisitos
Crie e obtenha um par de AccessKey. Para mais informações, consulte Obter um par de AccessKey.
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.
Ative o Intelligent Media Management (IMM). Para mais informações, consulte Ativar o IMM.
-
Crie um projeto no console do IMM. Para mais informações, consulte Criar um projeto.
NotaChame a operação CreateProject para criar um projeto. Para mais informações, consulte CreateProject - Criar um projeto.
Utilize a operação ListProjects - Listar todas as informações do projeto para listar todos os projetos criados na região especificada.
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 |
|
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 |
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.
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
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.
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.
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>
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.