文档预览

文档预览功能支持表格文件、文字文件、演示文件以及pdf文件的在线预览,便于您进行文档内容管理与访问。

重要

智能媒体管理(IMM)后续新增功能、优化均以新版为主,旧版将逐步下线。为了您有更好的使用体验,建议您使用新版的智能媒体管理(IMM)提供的文档在线预览功能。关于智能媒体管理新版与旧版的对比,请参见新旧版本使用指引

前提条件

  • 已开通智能媒体管理IMM,并在OSS中绑定IMM。具体操作,请参见快速入门

  • 如果您通过RAM用户使用IMM相关功能,需确保RAM用户拥有以下权限。

    • 系统权限:AliyunOSSReadOnlyAccessAliyunIMMFullAccess

      关于为RAM用户授权的具体操作,请参见RAM用户授权

    • 自定义权限:oss:ProcessImmram:GetRole

      RAM用户授予自定义权限时,您需要先创建对应的自定义权限,然后为RAM用户授权。具体操作,请参见RAM用户授予自定义的权限策略

注意事项

  • 支持在线预览的文件类型

    • 表格文件:et、xls、xlt、xlsx、xlsm、xltx、xltm、csv

    • 文字文件:doc、docx、txt、dot、wps、wpt、dotx、docm、dotm、rtf

    • 演示文件:ppt、pptx、pptm、ppsx、ppsm、pps、potx、potm、dpt、dps

    • pdf文件:pdf

  • 文件大小限制

    不支持在线预览大于200 MB的文件。

  • 预览的方式

    无论请求预览的文档读写权限为公共读或私有,都需要通过AccessKey ID、AccessKey Secret签名后得到的URL进行预览访问。

  • 费用说明

    本文的文档预览操作使用IMM文档预览V1接口,关于该接口的计费,请参见IMM旧版产品计费说明

参数

操作名称:imm/previewdoc

参数说明如下:

名称

描述

copy

指定预览文档时是否支持复制内容。取值如下:

1:支持复制文档内容。

0:不支持复制文档内容。

流程介绍

image

文档预览流程如下:

  1. 客户端App或者Web端向业务服务器发起预览请求,并提供要预览的文件名。

  2. 业务服务器根据请求文件进行URL签名,将签名完成的URL提供给客户端App或者Web端。

  3. 客户端App或者Web端通过签名URL直接预览访问OSS文件。

    重要

    不支持通过签名URL直接预览已加密的文件。您可以通过以下步骤预览加密的文件:

    1. 通过JavaScript API设置加密文件解密流程。具体步骤,请参见设置加密文件解密流程

    2. 调用智能媒体管理的CreateOfficeConversionTask接口,将原始文档转换为VECTOR向量格式输出到指定的OSS目录。

使用阿里云SDK

生成带签名的文档预览URL与生成带签名的图片处理URL方法类似,仅需将图片处理的操作改为文档预览操作即可。

下仅列举常见SDK的生成带签名的文档预览URL的代码示例。关于其他SDK的生成带签名的文档预览URL代码示例,请参见SDK简介

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
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 {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 强烈建议不要把访问凭证保存到工程代码里,否则可能导致访问凭证泄露,威胁您账号下所有资源的安全。本代码示例以从环境变量中获取访问凭证为例。运行本代码示例之前,请先配置环境变量。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "examplebucket";
        // 填写Object完整路径,完整路径中不能包含Bucket名称。
        String objectName = "exampledir/exampleobject.txt";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            // 设置样式,样式中包含文档预览参数。
            String style = "imm/previewdoc,copy_1";
            // 指定签名URL过期时间为10分钟。
            Date expiration = new Date(new Date().getTime() + 1000 * 60 * 10 );
            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();
            }
        }
    }
}
<?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;

// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "yourEndpoint";
// 填写Bucket名称,例如examplebucket。
$bucket= "examplebucket";
// 填写请求预览的文档完整路径,完整路径中不包含Bucket名称。
$object = "exampledir/exampleobject.txt";

$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);

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

$options = array(
    // 设置样式,样式中包含文档预览参数。
    OssClient::OSS_PROCESS => "imm/previewdoc,copy_1" );

$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET", $options);
print("rtmp url: \n" . $signedUrl);  
const OSS = require('ali-oss');

const client = new OSS({
  // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
  region: 'yourregion',
  // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // yourbucketname填写存储空间名称。
  bucket: 'yourbucketname'
});
// 设置样式,样式中包含文档预览参数。
// 生成带签名的URL,并指定过期时间为10分钟。
const signUrl = client.signatureUrl('exampledir/exampleobject.txt', {expires: 600, 'process' : 'imm/previewdoc,copy_1'});
console.log("signUrl="+signUrl);
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

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

# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称,例如examplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
# 填写请求预览的文档完整路径,完整路径中不包含Bucket名称。
key = 'example.txt'

# 如果文件不在指定Bucket内,需将该图片上传到目标Bucket。
# bucket.put_object_from_file(key, 'D:\\localpath\\example.txt')
# 设置样式,样式中包含文档预览参数。
style = 'imm/previewdoc,copy_1'
# 生成带签名的URL,并指定过期时间为10分钟。过期时间单位为秒。
url = bucket.sign_url('GET', key, 10 * 60, params={'x-oss-process': style})
print(url)
using Aliyun.OSS;
using Aliyun.OSS.Common;

// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 指定图片所在Bucket的名称,例如examplebucket。
var bucketName = "examplebucket";
// 填写请求预览的文档完整路径,完整路径中不包含Bucket名称。
var objectName = "exampledir/exampleobject.txt";
// 创建OSSClient实例。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
try
{
    // 设置样式,样式中包含文档预览参数。
    var process = "imm/previewdoc,copy_1";
    var req = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Get)
    {
        Expiration = DateTime.Now.AddHours(1),
        Process = process
    };
    // 生成带有签名的URI。
    var uri = client.GeneratePresignedUri(req);
    Console.WriteLine("Generate Presigned Uri:{0} with process:{1} succeeded ", uri, process);
}
catch (OssException ex)
{
    Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
        ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
    Console.WriteLine("Failed with error info: {0}", ex.Message);
}
// 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 填写不包含Bucket名称在内源Object的完整路径,例如exampleobject.txt。
String objectKey = "exampleobject.txt";
String url = null;
// 设置样式,样式中包含文档预览参数。
String style = "imm/previewdoc,copy_1";
try {
    // 生成用于上传文件的签名URL。
    GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectKey);
    // 设置签名URL的过期时间为30分钟。
    request.setExpiration(30*60);
    request.setProcess(style);
    url = oss.presignConstrainedObjectURL(request);
    Log.d("url", url);
} catch (ClientException e) {
    e.printStackTrace();
}
package main

    import (
        "fmt"
        "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请按实际情况填写。
    client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 指定图片所在Bucket的名称,例如examplebucket。
    bucketName := "examplebucket"
    bucket, err := client.Bucket(bucketName)
    if err != nil {
    HandleError(err)
    }
    // 填写请求预览的文档完整路径,完整路径中不包含Bucket名称。
    ossImageName := "exampledir/exampleobject.txt"
    // 设置样式,样式中包含文档预览参数。
    // 生成带签名的URL,并指定过期时间为600s。
    signedURL, err := bucket.SignURL(ossImageName, oss.HTTPGet, 600, oss.Process("imm/previewdoc,copy_1"))
    if err != nil {
    HandleError(err)
    } else {
    fmt.Println(signedURL)
    }
}
// 指定图片所在Bucket的名称,例如examplebucket。
NSString *bucketName = @"examplebucket";
// 填写请求预览的文档完整路径,完整路径中不包含Bucket名称。
NSString *objectKey = @"exampleobject.txt";
NSString *method = @"GET";
// 设置样式,样式中包含文档预览参数。
NSDictionary *params = @{@"x-oss-process": @"imm/previewdoc%2Ccopy_1"};
// 生成带签名的URL,并指定过期时间为30分钟。
OSSTask *ossTask = [client presignConstrainURLWithBucketName:bucketName
                                               withObjectKey:objectKey
                                                  httpMethod:method
                                      withExpirationInterval:30 * 60
                                              withParameters:params];

[ossTask continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) {
    if (!task.error) {
        NSString *url = task.result;
        NSLog(@"url: %@", url);
    } else {
        NSLog(@"error: %@", task.error);
    }
    return nil;
}];
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{
    /* 初始化OSS账号信息。*/
            
    /* 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
    std::string Endpoint = "yourEndpoint";
    /* 填写图片所在的Bucket名称,例如examplebucket。*/
    std::string BucketName = "examplebucket";
    /* 填写请求预览的文档完整路径,完整路径中不包含Bucket名称。
    std::string ObjectName = "exampledir/exampleobject.txt";

      /* 初始化网络等资源。*/
    InitializeSdk();

    ClientConfiguration conf;
    /* 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClient client(Endpoint, credentialsProvider, conf);


    /* 设置样式,样式中包含文档预览参数。*/
    std::string Process = "imm/previewdoc,copy_1";
    GeneratePresignedUrlRequest request(BucketName, ObjectName, Http::Get);
    request.setProcess(Process);
    auto outcome = client.GeneratePresignedUrl(request);

    /* 释放网络等资源。*/
    ShutdownSdk();
    return 0;
}
#include "oss_api.h"
#include "aos_http_io.h"
/* 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。*/
const char *endpoint = "yourEndpoint";
/* 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/  
const char *access_key_id = getenv("OSS_ACCESS_KEY_ID");
const char *access_key_secret = getenv("OSS_ACCESS_KEY_SECRET");
/* 填写图片所在的Bucket名称,例如examplebucket。*/
const char *bucket_name = "examplebucket";
/* 填写请求预览的文档完整路径,完整路径中不包含Bucket名称。
const char *object_name = "exampledir/exampleobject.txt";
void init_options(oss_request_options_t *options)
{
    options->config = oss_config_create(options->pool);
    /* 用char*类型的字符串初始化aos_string_t类型。*/
    aos_str_set(&options->config->endpoint, endpoint);
    aos_str_set(&options->config->access_key_id, access_key_id);
    aos_str_set(&options->config->access_key_secret, access_key_secret);
    /* 是否使用了CNAME。0表示不使用。*/
    options->config->is_cname = 0;
    /* 设置网络相关参数,比如超时时间等。*/
    options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
    /* 在程序入口调用aos_http_io_initialize方法来初始化网络、内存等全局资源。*/
    if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
        exit(1);
    }
    /* 用于内存管理的内存池(pool),等价于apr_pool_t。其实现代码在apr库中。*/
    aos_pool_t *pool;
    /* 重新创建一个内存池,第二个参数是NULL,表示没有继承其它内存池。*/
    aos_pool_create(&pool, NULL);
    /* 创建并初始化options,该参数包括endpoint、access_key_id、acces_key_secret、is_cname、 curl等全局配置信息。*/
    oss_request_options_t *oss_client_options;
    /* 在内存池中分配内存给options。*/
    oss_client_options = oss_request_options_create(pool);
    /* 初始化Client的选项oss_client_options。*/
    init_options(oss_client_options);
    /* 初始化参数。*/
    aos_string_t bucket;
    aos_string_t object;
    aos_table_t *params = NULL;
    aos_http_request_t *req;
    char *url_str;
    apr_time_t now;
    int64_t expire_time; 
    aos_str_set(&bucket, bucket_name);
    aos_str_set(&object, object_name);
    /* 设置样式,样式中包含文档预览参数。*/
    params = aos_table_make(pool, 1);
    apr_table_set(params, OSS_PROCESS, "imm/previewdoc,copy_1");
    req = aos_http_request_create(pool);
    req->method = HTTP_GET;
    req->query_params = params;
    /* 指定过期时间(expire_time),单位为秒。*/
    now = apr_time_now();
    expire_time = now / 1000000 + 10 * 60;
    /* 生成签名url。*/
    url_str = oss_gen_signed_url(oss_client_options, &bucket, &object, expire_time, req);
    printf("url: %s\n", url_str);
    /* 释放该内存池,相当于释放了请求过程中各资源分配的内存。*/
    aos_pool_destroy(pool);
    /* 释放之前分配的全局资源。*/
    aos_http_io_deinitialize();
    return 0;
}

常见问题

是否支持打印在线预览的文件?

您可以通过以下两种方式打印在线预览的文件:

  • 将在线预览文件下载到本地后打印。

  • 使用IMM的文档在线协作功能在线打印预览的文件。具体步骤,请参见打印

生命带签名的文档URL报错The resource Project cannot be found. bucket does not bind any project.

  • 问题原因:当前Bucket未绑定IMM Project。

  • 解决方法:将当前Bucket绑定IMM Project。具体步骤,请参见绑定IMM

PPT超过200页时不能预览怎么办?

通常情况下,IMM文档预览V1版本支持稳定预览的页数为200页,如果您需要预览超过200页的文档,建议使用IMM文档预览V2版本。更多信息,请参见快速入门

如何设置预览接口不允许复制?

Java SDK为例,您可以设置样式,样式中包含文档预览参数,例如:String style = "imm/previewdoc,copy_0"。copy0表示预览接口不允许复制。

文档预览时是否支持添加水印?

文档预览不支持添加水印。如果您需要预览添加水印的文档,您可以先使用智能媒体管理为文档添加水印,然后再预览文档。如何为文档添加水印,请参见添加水印

开启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:ProcessImm 权限。

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

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