WebOffice在线编辑

您可以通过WebOffice在线编辑功能,直接编辑文字文档(Word)、演示文档(PPT)、表格文档(Excel)。

使用场景

  • 协同办公平台:多个用户需要实时协作编辑同一文档。

  • 内容管理系统:企业级内容管理系统需要在线编辑文档,直接在系统内进行增删改查。

  • 教育平台:在线教育平台让学生提交作业或教师编写课件,文档保存在云端,方便查阅和分享。

支持的文件类型

文件类型

文件后缀

Word

doc、dot、wps、wpt、docx、dotx、docm、dotm

PPT

ppt、pptx、pptm、ppsx、ppsm、pps、potx、potm、dpt、dps

Excel

xls、xlt、et、xlsx、xltx、xlsm、xltm

如何使用

前提条件

获取URL链接进行编辑

Java

要求使用3.17.4及以上版本的Java SDK,Java SDK的安装请参见安装

package com.aliyun.oss.demo;
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import java.net.URL;
import java.util.Date;

public class Demo {
    public static void main(String[] args) throws Throwable {
        // 请填写您的自定义域名。例如http://static.example.com。
        String endpoint = "http://static.example.com";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "examplebucket";
        // 填写Object完整路径。如果图片不在Bucket根目录,需携带图片完整路径,例如exampledir/exampleobject.jpg
        String objectName = "exampledir/exampleobject.png";
        // 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。
        String region = "cn-hangzhou";
        // 创建OSSClient实例。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // 请注意,设置true开启CNAME选项。
        clientBuilderConfiguration.setSupportCname(true);
        // 显式声明使用 V4 签名算法
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

        try {
            // 文档处理参数
            String style = "doc/edit,export_1,print_1/watermark,text_5YaF6YOo6LWE5paZ,size_30,t_60";
            // 指定签名URL过期时间为3600秒)
            Date expiration = new Date(new Date().getTime() + 3600 );
            GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
            req.setExpiration(expiration);
            req.setProcess(style);
            URL signedUrl = ossClient.generatePresignedUrl(req);
            System.out.println(signedUrl);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Python

要求使用Python SDK 2.18.4及以上版本,Python SDK的安装请参见安装

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# 填写Bucket名称
bucket = 'examplebucket'

# 请填写您的自定义域名。例如https://static.example.com。
endpoint = 'https://static.example.com'

# 填写阿里云通用Region ID
region = 'cn-hangzhou'
# 使用自定义域名初始化bucket,若您使用的是默认域名,则为bucket = oss2.Bucket(auth, endpoint, bucket, region=region)
bucket = oss2.Bucket(auth, endpoint, bucket, is_cname=True, region=region)

# 指定处理文件
key = 'example.docx'

# 指定过期时间,单位秒
expire_time = 3600

# 构建在线预览的处理指令。
image_process = 'doc/edit,export_1,print_1/watermark,text_5YaF6YOo6LWE5paZ,size_30,t_60'


# 生成签名URL,带上处理参数
url = bucket.sign_url('GET', key, expire_time, params={'x-oss-process': image_process}, slash_safe=True)

# 打印签名URL
print(url)

Go

要求使用Go SDK 3.0.2及以上版本,Go SDK的安装请参见安装OSS Go SDK

package main

import (
	"context"
	"flag"
	"log"
	"time"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// 定义全局变量
var (
	region     string // 存储区域
	bucketName string // 存储空间名称
	objectName string // 对象名称
)

// init函数用于初始化命令行参数
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
	flag.StringVar(&objectName, "object", "", "The name of the object.")
}

func main() {
	// 解析命令行参数
	flag.Parse()

	// 检查bucket名称是否为空
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// 检查region是否为空
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// 检查object名称是否为空
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, object name required")
	}

	// 加载默认配置并设置凭证提供者和区域
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region).
        // 请填写您的自定义域名。例如http://static.example.com。
		WithEndpoint("http://static.example.com").
		WithUseCName(true)

	// 创建OSS客户端
	client := oss.NewClient(cfg)

	// 生成GetObject的预签名URL
	result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
		Bucket:  oss.Ptr(bucketName),
		Key:     oss.Ptr(objectName),
        // 设置文档处理参数
		Process: oss.Ptr("doc/edit,export_1,print_1/watermark,text_5YaF6YOo6LWE5paZ,size_30,t_60"), 
	}, oss.PresignExpires(10*time.Minute))

	if err != nil {
		log.Fatalf("failed to get object presign %v", err)
	}

	log.Printf("request method:%v\n", result.Method)
	log.Printf("request expiration:%v\n", result.Expiration)
	log.Printf("request url:%v\n", result.URL)

	if len(result.SignedHeaders) > 0 {
		// 当返回结果包含签名头时,使用签名URL发送GET请求时也包含相应的请求头,以免出现不一致,导致请求失败和签名错误
		log.Printf("signed headers:\n")
		for k, v := range result.SignedHeaders {
			log.Printf("%v: %v\n", k, v)
		}
	}
}

Node.js

要求使用Node.js SDK 8.0及以上版本,Node.js SDK的安装请参见安装

const OSS = require("ali-oss");

// 定义一个生成签名 URL 的函数
async function generateSignatureUrl(fileName) {
  // 获取签名URL
  const client = await new OSS({
    // 请填写您的自定义域名。例如http://static.example.com。
    endpoint: 'http://static.example.com',
    // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    accessKeyId: process.env.OSS_ACCESS_KEY_ID,
    accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
    bucket: 'examplebucket',
    // 填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
    region: 'oss-cn-hangzhou',
    authorizationV4: true,
    cname: true
  });

  // 生成签名URL,并包含文档处理参数
  return await client.signatureUrlV4('GET', 3600, {
    headers: {}, // 请根据实际发送的请求头设置此处的请求头
    queries: {
      "x-oss-process": "doc/edit,export_1,print_1/watermark,text_5YaF6YOo6LWE5paZ,size_30,t_60" // 添加文档处理参数
    }
  }, fileName);
}

// 调用函数并传入文件名
generateSignatureUrl('yourFileName').then(url => {
  console.log('Generated Signature URL:', url);
}).catch(err => {
  console.error('Error generating signature URL:', err);
});

PHP

要求使用PHP SDK 2.7.0及以上版本,PHP SDK的安装请参见安装

<?php
if (is_file(__DIR__ . '/../autoload.php')) 
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\OssClient;
use OSS\Core\OssException;
use OSS\Http\RequestCore;
use OSS\Http\ResponseCore;
use OSS\Credentials\EnvironmentVariableCredentialsProvider;

// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
//请填写您的自定义域名。例如http://static.example.com。
$endpoint = "http://static.example.com";
// 填写Bucket名称,例如examplebucket。
$bucket= "examplebucket";
// 如果文档位于Bucket根目录,则直接填写文档名称。如果文档不在Bucket根目录,需携带文档完整路径,例如exampledir/example.docx。
$key = 'example.docx'; 

$config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,
        "signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
        "cname"	=> true,
        "region"=> "cn-hangzhou"
    );
    $ossClient = new OssClient($config);

// 生成一个带图片处理参数的签名的URL,有效期是3600秒,可以直接使用浏览器访问。
$timeout = 3600;

$options = array(
    // 构建在线预览的处理指令。
    OssClient::OSS_PROCESS => "doc/edit,export_1,print_1/watermark,text_5YaF6YOo6LWE5paZ,size_30,t_60");
$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET", $options);
print("rtmp url: \n" . $signedUrl);

生成的签名URL示例如下:

http://static.example.com/example.docx?x-oss-process=doc%2Fedit%2Cexport_1%2Cprint_1%2Fwatermark%2Ctext_5YaF6YOo6LWE5paZ%2Csize_30%2Ct_60&x-oss-date=20250220T095032Z&x-oss-expires=3600&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI********************%2F20250122%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&x-oss-signature=514ed93accdb80921c4b2897c6147fdb1599308c6457f68ee0ac2f771c7d0312

复制生成的URL并粘贴到浏览器地址栏,按回车键即可编辑WebOffice文档。

参数说明

操作名称:doc/edit

具体参数如下表所示。

参数名称

类型

是否必须

描述

print

int

是否允许打印。取值:

  • 1:允许打印。

  • 不传参:不允许打印。

export

int

是否允许导出为PDF。取值:

  • 1:允许导出为PDF。

  • 不传参:不允许导出为PDF。

watermark

string

水印参数。

text

string

水印文字。需经过URL SafeBase64编码。具体操作,请参见水印编码,推荐通过base64url encoder进行编码。

父节点:watermark

size

int

水印文字字号,取大于0的整数。

父节点:watermark

t

int

水印文字透明度。取值范围:0~100。默认值:100,表示透明度100%(不透明)。

父节点:watermark

color

string

水印文字颜色,RGB颜色值。默认值为#FFFFFF

例如:#000000表示黑色,#FFFFFF表示白色。

父节点:watermark

rotate

int

指定文字顺时针旋转角度。取值范围:0~360。

默认值为0,表示不旋转。

父节点:watermark

type

string

指定文字水印的字体,需经过URL SafeBase64编码。具体操作,请参见水印编码,推荐通过base64url encoder进行编码。

支持的字体如下:

  • 中文字体:

    • 宋体(默认值)

    • 楷体

  • 英文字体:

    • Arial

    • Georgia

    • Tahoma

    • Comic Sans MS

    • Times New Roman

    • Courier New、Verdana

父节点:watermark

相关API

以上操作方式底层基于API实现,如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。关于公共请求头Authorization的计算方法,请参见签名版本4(推荐)

编辑信息

  • 编辑文档名称:example.docx

  • 编辑页面水印信息:

    • 水印类型:文字水印

    • 水印文字:内部资料

    • 水印字号:30号字体

    • 水印透明度:60

  • 编辑页面权限信息:允许用户导出和打印

处理示例

GET /example.docx?x-oss-process=doc/edit,export_1,print_1/watermark,text_5YaF6YOo6LWE5paZ,size_30,t_60 HTTP/1.1
Host: doc-demo.oss-cn-hangzhou.aliyuncs.com
Date: Fri, 28 Oct 2022 06:40:10 GMT
Authorization: SignatureValue

权限说明

阿里云账号默认拥有全部权限。阿里云账号下的RAM用户或RAM角色默认没有任何权限,需要阿里云账号或账号管理员通过RAM PolicyBucket Policy授予操作权限。

API

Action

说明

GetObject

oss:GetObject

下载Object。

oss:GetObjectVersion

下载Object时,如果通过versionId指定了Object的版本,则需要授予此操作的权限。

kms:Decrypt

下载Object时,如果Object的元数据包含X-Oss-Server-Side-Encryption: KMS,则需要此操作的权限。

API

Action

说明

oss:ProcessImm

通过OSS使用IMM进行数据处理的权限。

API

Action

说明

GenerateWebofficeToken

imm: GenerateWebofficeToken

用于获取Weboffice凭证。

RefreshWebofficeToken

imm:RefreshWebofficeToken

用于刷新Weboffice凭证。

计费说明

WebOffice在线编辑会产生以下计费项。有关计费项的定价详情,请参见OSS产品定价计费项

API

计费项

说明

GetObject

GET 类型请求

根据成功的请求次数计算请求费用。

外网流出流量费用

如果是通过外网Endpoint(示例值oss-cn-hangzhou.aliyuncs.com)或者传输加速Endpoint(示例值oss-accelerate.aliyuncs.com)调用GetObject接口时,会产生外网流出流量费用,根据数据容量大小计费。

低频访问数据取回容量

如果取回的数据是低频访问数据,会产生低频访问数据取回容量的费用,按数据取回量计费。

归档直读数据取回容量

如果读取的是归档的ObjectBucket开启了归档直读,会产生归档直读数据取回容量费用,根据取回的数据容量大小计费。

传输加速

如果开启了传输加速功能且使用传输加速域名访问您的Bucket会产生传输加速费用,根据数据容量大小计费。

API

计费项

说明

GenerateWebofficeToken

DocumentWebofficeEdit

文档编辑功能会产生文档处理费用。

重要

截至2023121日之前创建的在线编辑项目将根据文档的打开次数进行收费,而2023121日及之后创建的项目则将按照API接口的调用次数计费。

RefreshWebofficeToken

注意事项

  • WebOffice在线编辑仅支持同步处理(x-oss-process处理方式)。