全部產品
Search
文件中心

Object Storage Service:WebOffice線上編輯

更新時間:Sep 06, 2025

您可以通過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完整路徑。如果Object不在Bucket根目錄,需攜帶完整路徑
        String objectName = "exampledir/exampleobject.docx";
        // 填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為cn-hangzhou。
        String region = "cn-hangzhou";
        // 建立OSSClient執行個體。
        // 當OSSClient執行個體不再使用時,調用shutdown方法以釋放資源。
        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 * 1000L  );
            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的安裝請參見安裝(Python SDK V1)

# -*- 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, 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。
$object = '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("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 Safe的Base64編碼。具體操作,請參見浮水印編碼,推薦通過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 Safe的Base64編碼。具體操作,請參見浮水印編碼,推薦通過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介面時,會產生外網流出流量費用,根據資料容量大小計費。

低頻訪問資料取回容量

如果取回的資料是低頻訪問資料,會產生低頻訪問資料取回容量的費用,按資料取回量計費。

歸檔直讀資料取回容量

如果讀取的是歸檔的Object且Bucket開啟了歸檔直讀,會產生歸檔直讀資料取回容量費用,根據取回的資料容量大小計費。

傳輸加速

如果開啟了傳輸加速功能且使用傳輸加速網域名稱訪問您的Bucket會產生傳輸加速費用,根據資料容量大小計費。

API

計費項目

說明

GenerateWebofficeToken

DocumentWebofficeEdit

文檔編輯功能會產生文檔處理費用。

重要

截至2023年12月1日之前建立的線上編輯專案將根據文檔的開啟次數進行收費,而2023年12月1日及之後建立的專案則將按照API介面的調用次數計費。

RefreshWebofficeToken

注意事項

WebOffice線上編輯僅支援同步處理(x-oss-process處理方式)。