文档在线预览

文档在线预览功能允许您在浏览器中直接预览文档内容,无需下载文件。本文将介绍该功能的使用场景、前提条件、注意事项以及操作步骤,帮助您快速上手。

使用场景

  • 企业知识库或文档管理系统:员工可将文件上传并转化为网页格式,方便快速查看,提升信息访问效率和安全性。

  • 在线教育平台:教师和学生可以实时查看教材、讲义和作业,促进互动和学习体验。

  • 协同办公与项目管理工具:团队成员共享的工作计划、设计稿和报告文档可直接在浏览器中查看,提升团队协作效率。

前提条件

  • 已通过配额中心申请开启新版本IMM GetPost数据处理能力。

  • 已绑定IMM Project。您可以通过OSS控制台或API绑定IMM Project。

注意事项

  • 文档在线预览仅支持同步处理(x-oss-process处理方式)。

  • 不支持匿名访问

  • 必须拥有IMM处理所需的相关权限。更多信息,请参见权限

  • 如果使用OSS默认域名访问文件,将下载文档预览HTML页面。如果使用自定义域名文档在线预览操作需要您在OSS Bucket绑定自定义域名,通过自定义域名访问文件时才能打开预览。关于绑定自定义域名更多信息,请参见绑定自定义域名至Bucket默认域名

参数说明

操作名称:doc/preview

使用REST API预览文档时,可根据以下参数配置预览效果。

参数名称

类型

是否必须

描述

print

int

是否允许打印。取值:

  • 1:允许打印。

  • 0:不允许打印。

copy

int

是否允许复制。取值:

  • 1:允许复制。

  • 0:不允许复制。

export

int

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

  • 1:允许导出为PDF。

  • 0:不允许导出为PDF。

maxpage

int

最大渲染页数,取大于0的整数。

watermark

string

水印参数。

text

string

水印文字。需经过URL安全的Base64编码。具体操作,请参见水印编码

父节点:watermark

size

int

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

父节点:watermark

t

int

水印文字透明度。取值范围:0~100。

默认值:100,表示透明度100%(不透明)。

父节点:watermark

color

string

水印文字颜色,RGB颜色值,例如:#000000表示黑色,#FFFFFF表示白色。

默认值为#FFFFFF

父节点:watermark

rotate

int

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

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

父节点:watermark

type

string

指定文字水印的字体,需经过URL SafeBase64编码。具体操作,请参见水印编码

支持的字体如下:

  • 中文字体:

    • 宋体(默认值)

    • 楷体

  • 英文字体:

    • Arial

    • Georgia

    • Tahoma

    • Comic Sans MS

    • Times New Roman

    • Courier New、Verdana

父节点:watermark

使用REST API

预览信息

  • 预览文档名称:example.docx

  • 预览页面:文档前3

  • 预览页面水印信息:

    • 水印类型:文字水印

    • 水印文字:内部资料

    • 水印字号:30号字体

    • 水印透明度:60

  • 预览页面权限信息:

    • 允许用户复制

    • 允许用户导出

    • 允许用户打印

处理示例

GET /exmaple.docx?x-oss-process=doc/preview,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: OSS qn6q**************:77Dv****************

使用SDK

以下仅列举常见SDK通过处理参数的方式在线预览文档的代码示例。如需使用其他SDK在线预览文档的代码示例,请参见以下常见SDK自行调整。

Java

要求使用3.17.4及以上版本的Java SDK。

import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyuncs.exceptions.ClientException;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class Demo {
    public static void main(String[] args) throws ClientException, ClientException {
        // yourEndpoint填写Bucket所在地域对应的Endpoint。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 填写Endpoint对应的Region信息,例如cn-hangzhou。
        String region = "cn-hangzhou";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 指定Bucket名称。
        String bucketName = "examplebucket";
        // 如果文档位于Bucket根目录,则直接填写文档名称。如果文档不在Bucket根目录,需携带文档完整路径,例如exampledir/example.docx。
        String key = "example.docx";

        // 创建OSSClient实例。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

        try {
            // 构建在线预览文档的处理指令。
            GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
            getObjectRequest.setProcess("doc/preview,export_1,print_1/watermark,text_5YaF6YOo6LWE5paZ,size_30,t_60");

            // 使用getObject方法,并通过process参数传入处理指令。
            OSSObject ossObject = ossClient.getObject(getObjectRequest);

            // 读取文档信息。
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = ossObject.getObjectContent().read(buffer)) != -1) {
                baos.write(buffer, 0, bytesRead);
            }
            String docPreview = baos.toString("UTF-8");
            System.out.println("Doc Preview:");
            System.out.println(docPreview);
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
        } finally {
            // 关闭OSSClient。
            ossClient.shutdown();
        }
    }
}

PHP

要求使用PHP SDK 2.7.0及以上版本。

<?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\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;

try {
    // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    $provider = new EnvironmentVariableCredentialsProvider(); 
    // 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
    $endpoint = 'https://oss-cn-hangzhou.aliyuncs.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,
        // 填写阿里云通用Region ID。
        "region" => "cn-hangzhou"
    );
    $ossClient = new OssClient($config);
  // 构建在线预览文档的处理指令。
  $options[$ossClient::OSS_PROCESS] = "doc/preview,export_1,print_1/watermark,text_5YaF6YOo6LWE5paZ,size_30,t_60";
  $result = $ossClient->getObject($bucket,$key,$options);
  var_dump($result);
} catch (OssException $e) {
  printf($e->getMessage() . "\n");
  return;
}

Python

要求使用Python SDK 2.18.4及以上版本。

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

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

# 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# 填写阿里云通用Region ID。
region = 'cn-hangzhou'
bucket = oss2.Bucket(auth, endpoint, 'examplebucket', region=region)

# 如果文档文件位于Bucket根目录,则直接填写视频名称。如果文档文件不在Bucket根目录,需携带文档文件完整路径,例如exampledir/example.docx。
key = 'example.docx'

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

try:
    # 使用get_object方法,并通过process参数传入处理指令来提取视频信息。
    result = bucket.get_object(key, process=process)
    # 读取文档信息。
    doc_preview= result.read().decode('utf-8')
    print("Doc Preview:")
    print(doc_preview)
except oss2.exceptions.OssError as e:
    print("Error:", e)

Go

要求使用Go SDK 3.0.2及以上版本。

package main

import (
	"fmt"
	"io"
	"os"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// 从环境变量中获取临时访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 创建OSSClient实例。
	// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其他Region请按实际情况填写。
	// yourRegion指定阿里云通用Region ID,例如cn-hangzhou。
	client, err := oss.New("https://oss-cn-hangzhou.aliyuncs.com", "", "", oss.SetCredentialsProvider(&provider), oss.AuthVersion(oss.AuthV4), oss.Region("cn-hangzhou"))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 指定Bucket名称,例如examplebucket。
	bucketName := "examplebucket"

	bucket, err := client.Bucket(bucketName)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
        // 如果文档位于Bucket根目录,则直接填写文档名称。如果文档不在Bucket根目录,需携带文档完整路径,例如exampledir/example.docx。
        // 通过oss.Process方法构建在线预览文档的处理指令。
	body, err := bucket.GetObject("example.docx", oss.Process("doc/preview,export_1,print_1/watermark,text_5YaF6YOo6LWE5paZ,size_30,t_60"))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	defer body.Close()

	data, err := io.ReadAll(body)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	fmt.Println("data:", string(data))
}

常见问题

是否支持预览动态PPT中的动画和视频?

支持。在线预览功能最大支持200 MB的文档,超过200 MB则无法访问。

是否支持预览图片文件?

不支持。

开启CDN后生成带签名的文档URL报错Either the Signature query string parameter or the Authorization header should be specified, not both.

如果您在私有 Bucket 开启回源功能后,通过 CDN 域名访问已绑定至 IMM 项目的 Bucket 中的文件,无需提供额外的签名信息。请按照以下要求进行配置:

  1. 授权默认角色 您需要为CDN的默认角色 AliyunCDNAccessingPrivateOSSRole授予 oss:ProcessImmimm:GetWebofficeURL权限。

  2. 访问资源时,应使用不包含签名信息的 URL。

    例如,您可以使用如下格式的URL:http://cdn.example.info/demo.ppt?x-oss-process=doc/preview,export_1,print_1使用文档在线预览功能。