文档格式转换

本文档介绍如何使用阿里云Java SDK进行文档转换,主要展示了如何通过ConvertOfficeUtils工具类实现Office文档到PDF的同步和异步转换。代码示例中详细解释了同步转换、异步转换以及查询转换任务状态的方法,涉及关键参数设置和错误处理。此外,还提供了ConvertOffice配置实体类用于封装转换所需的配置信息。
摘要由CSDN通过智能技术生成

pom.xml 中引入依赖:

<!--文档转换依赖-->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>[4.4.9,5.0.0)</version>
</dependency>
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-imm</artifactId>
    <version>1.22.0</version>
</dependency>

文档转换工具类ConvertOfficeUtils.java

package com.ssish.saas.utils;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.imm.model.v20170906.*;
import com.aliyuncs.profile.DefaultProfile;
import com.google.gson.Gson;
import com.ssish.saas.utils.model.ConvertOffice;
import org.apache.commons.lang3.StringUtils;

public class ConvertOfficeUtils {

//同步转换 请求成功返回示例
    /*{
        "RequestId": "C28097A8-A63A-5D58-8454-E866873C7579",
            "PageCount": 4
    }*/

//同步转换 请求失败返回示例
    /*{
        "RequestId": "7DA1FCD1-004C-4EB4-B039-C6BBDCEB0701",
            "HostId": "imm.cn-hangzhou.aliyuncs.com",
            "Code": "DocumentConvertFailed.NeedPassword",
            "Message": "The conversion has been failed, need password to open file."
    }*/

    private static IAcsClient createClient(String regionId,String accessKeyId,String secret){
        DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, secret);
        return new DefaultAcsClient(profile);
    }

    /**
     * 同步转换
     * 采用同步请求方式进行文档(例如Office文档)格式的转换,执行完毕返回转换成功的页数。同步转换超时时间为5秒,如果转换时间大于5秒的文档转换需要使用异步接口
     * @param office
     * @return
     */
    public static String convertOfficeFormat(ConvertOffice office){
        IAcsClient client = createClient(office.getRegionId(),office.getAccessKeyId(),office.getAccessKeySecret());
        ConvertOfficeFormatRequest request = new ConvertOfficeFormatRequest();
        request.setSrcUri(office.getSrcUri());
        request.setTgtUri(office.getTgtUri());
        request.setProject(office.getProject());
        request.setTgtType(office.getTgtType()); //转换输出的目标文件类型
        request.setTgtFilePrefix(office.getTgtFilePrefix()); //转换后的文件名称前缀
        if(StringUtils.isNotBlank(office.getTgtFileSuffix())){
            request.setTgtFileSuffix(office.getTgtFileSuffix());
        }else{
            request.setTgtFileSuffix("def"); //转换后的文件名称后缀,其中def为保留字,表示采用默认的后缀名。
        }
        String result = "";
        try {
            ConvertOfficeFormatResponse response = client.getAcsResponse(request);
            result = new Gson().toJson(response);
            System.out.println(result);
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }
        return result;
    }

    /**
     * 异步转换
     * 接口采用异步请求方式进行文档(例如Office文档)格式的转换,执行完成后返回TaskId
     * @param office
     * @return
     */
    public static String createOfficeConversionTask(ConvertOffice office){
        IAcsClient client = createClient(office.getRegionId(),office.getAccessKeyId(),office.getAccessKeySecret());
        CreateOfficeConversionTaskRequest request = new CreateOfficeConversionTaskRequest();
        request.setSrcUri(office.getSrcUri());
        request.setTgtUri(office.getTgtUri());
        request.setProject(office.getProject());
        request.setTgtType(office.getTgtType()); //转换输出的目标文件类型
        request.setTgtFilePrefix(office.getTgtFilePrefix()); //转换后的文件名称前缀
        if(StringUtils.isNotBlank(office.getTgtFileSuffix())){
            request.setTgtFileSuffix(office.getTgtFileSuffix());
        }else{
            request.setTgtFileSuffix("def"); //转换后的文件名称后缀,其中def为保留字,表示采用默认的后缀名。
        }
        String result = "";
        try {
            CreateOfficeConversionTaskResponse response = client.getAcsResponse(request);
            result = new Gson().toJson(response);
            System.out.println(result);
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }
        return result;
    }

    /**
     * 获取异步转换任务状态
     * @param office
     * @return
     */
    public static String getOfficeConversionTask(ConvertOffice office){
        IAcsClient client = createClient(office.getRegionId(),office.getAccessKeyId(),office.getAccessKeySecret());
        GetOfficeConversionTaskRequest request = new GetOfficeConversionTaskRequest();
        request.setProject(office.getProject());
        request.setTaskId(office.getTaskId()); //任务ID。CreateOfficeConversionTask接口执行后返回的TaskId。
        String result = "";
        try {
            GetOfficeConversionTaskResponse response = client.getAcsResponse(request);
            System.out.println(new Gson().toJson(response));
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }
        return result;
    }

    public static void main(String[] args) {
        String regionId = "cn-hangzhou";
        String accessKeyId = "";
        String secret = "";
        DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, secret);
        IAcsClient client = new DefaultAcsClient(profile);

        //同步
        ConvertOfficeFormatRequest request = new ConvertOfficeFormatRequest();
        request.setRegionId("cn-hangzhou");
        request.setSrcUri("oss://test-ssish/ssish/sourceFile/1629871576476.xls");
        request.setTgtUri("oss://test-ssish/ssish/convertPDF");
        request.setProject("test-office");
        request.setTgtType("pdf"); //转换输出的目标文件类型
        request.setTgtFilePrefix("222"); //转换后的文件名称前缀
        request.setTgtFileSuffix("def"); //转换后的文件名称后缀,其中def为保留字,表示采用默认的后缀名。

        try {
            ConvertOfficeFormatResponse response = client.getAcsResponse(request);
            System.out.println(new Gson().toJson(response));
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());
        }

        //异步
//        CreateOfficeConversionTaskRequest request = new CreateOfficeConversionTaskRequest();
//        request.setRegionId("cn-hangzhou");
//        request.setSrcUri("oss://test-ssish/cps/sourceFile/保司代码.xls");
//        request.setTgtUri("oss://test-ssish/cps/converttasks/pdf");
//        request.setProject("test-office");
//        request.setTgtType("pdf");
//        request.setTgtFilePrefix("6666");
//        request.setTgtFileSuffix("def");
//
//        try {
//            CreateOfficeConversionTaskResponse response = client.getAcsResponse(request);
//            System.out.println(new Gson().toJson(response));
//        } catch (ServerException e) {
//            e.printStackTrace();
//        } catch (ClientException e) {
//            System.out.println("ErrCode:" + e.getErrCode());
//            System.out.println("ErrMsg:" + e.getErrMsg());
//            System.out.println("RequestId:" + e.getRequestId());
//        }

        //获取异步转换状态
//        GetOfficeConversionTaskRequest request2 = new GetOfficeConversionTaskRequest();
//        request2.setProject("test-office");
//        request2.setTaskId("formatconvert-5517f1f0-2592-4366-98a6-beff4ce16ee3");
//        try {
//            GetOfficeConversionTaskResponse response = client.getAcsResponse(request2);
//            System.out.println(new Gson().toJson(response));
//        } catch (ServerException e) {
//            e.printStackTrace();
//        } catch (ClientException e) {
//            System.out.println("ErrCode:" + e.getErrCode());
//            System.out.println("ErrMsg:" + e.getErrMsg());
//            System.out.println("RequestId:" + e.getRequestId());
//        }

    }
   
}

文档转换配置实体类ConvertOffice.java

package com.ssish.saas.utils.model;

import java.io.Serializable;

public class ConvertOffice implements Serializable {

    private static final long serialVersionUID = 1L;

    private String regionId; //项目所在地域的ID。地域Endpoint格式为imm.RegionId.aliyuncs.com,例如当RegionId为cn-hangzhou时,地域Endpoint为imm.cn-hangzhou.aliyuncs.com。

    private String accessKeyId;

    private String accessKeySecret;

    private String project; //项目名称

    private String tgtType; //转换输出的目标文件类型

    private String srcUri; // 源数据的存储位置。OSS地址规则为oss://bucket/object,其中bucket为和当前项目处于同一区域的OSS Bucket名称,object为文件路径。

    private String tgtUri; //转换后输出内容的目标位置,建议TgtUri和SrcUri在同一个OSS Bucket中,便于权限管理

    private String tgtFilePrefix; //转换后的文件名称前缀

    private String tgtFileSuffix; //转换后的文件名称后缀,其中def为保留字,表示采用默认的后缀名。

    private String taskId; //任务ID。CreateOfficeConversionTask接口执行后返回的TaskId。

    public String getTaskId() {
        return taskId;
    }

    public void setTaskId(String taskId) {
        this.taskId = taskId;
    }

    public String getRegionId() {
        return regionId;
    }

    public void setRegionId(String regionId) {
        this.regionId = regionId;
    }

    public String getAccessKeyId() {
        return accessKeyId;
    }

    public void setAccessKeyId(String accessKeyId) {
        this.accessKeyId = accessKeyId;
    }

    public String getAccessKeySecret() {
        return accessKeySecret;
    }

    public void setAccessKeySecret(String accessKeySecret) {
        this.accessKeySecret = accessKeySecret;
    }

    public String getProject() {
        return project;
    }

    public void setProject(String project) {
        this.project = project;
    }

    public String getTgtType() {
        return tgtType;
    }

    public void setTgtType(String tgtType) {
        this.tgtType = tgtType;
    }

    public String getSrcUri() {
        return srcUri;
    }

    public void setSrcUri(String srcUri) {
        this.srcUri = srcUri;
    }

    public String getTgtUri() {
        return tgtUri;
    }

    public void setTgtUri(String tgtUri) {
        this.tgtUri = tgtUri;
    }

    public String getTgtFilePrefix() {
        return tgtFilePrefix;
    }

    public void setTgtFilePrefix(String tgtFilePrefix) {
        this.tgtFilePrefix = tgtFilePrefix;
    }

    public String getTgtFileSuffix() {
        return tgtFileSuffix;
    }

    public void setTgtFileSuffix(String tgtFileSuffix) {
        this.tgtFileSuffix = tgtFileSuffix;
    }

}

调用

private ConvertOffice createConvertOffice(String uploadName,long millis){
        ConvertOffice office = new ConvertOffice();
        office.setAccessKeyId(officeAccessKeyId); //bucketName
        office.setAccessKeySecret(officeAccessKeySecret);
        office.setRegionId(regionId);
        office.setProject(officeProject);
        office.setSrcUri("oss://"+bucketName+"/"+objectName+uploadName); //"oss://test-ssish/cps/sourceFile/保司代码.xls"
        office.setTgtUri("oss://"+bucketName+"/"+objectName+"convertPDF"); //"oss://test-ssish/imm-format-convert-tgt/pdf"
        office.setTgtFilePrefix(String.valueOf(millis));
        office.setTgtFileSuffix("def"); //转换后的文件名称后缀,其中def为保留字,表示采用默认的后缀名。
        office.setTgtType("pdf");
        return office;
    }

    @ApiOperation("上传文件,同步返回oss访问地址和pdf页数")
    @PostMapping("/uploadAndConvertPDF")
    @ResponseBody
    public PDFFileDto uploadOssFileForForce(@RequestParam("file") MultipartFile file) {
        PDFFileDto fileDto = new PDFFileDto();
        if(file ==null ){
            fileDto.setReturnCode(ErrorEnum.PARAM_EXCEPTION.getCode());
            fileDto.setReturnMsg("上传文件为空");
            return fileDto;
        }
        String fileName = file.getOriginalFilename();
        logger.info("上传的文件名称为:{}",fileName);
        String prefix = fileName.substring(fileName.lastIndexOf("."));
        long millis = System.currentTimeMillis();
        String uploadName = "sourceFile/" + millis + prefix;
        try {
            ossService.upload(file.getInputStream(),uploadName);
            fileDto.setFileName(fileName);
            fileDto.setReturnCode(ErrorEnum.REQUEST_SUCCESS.getCode());
            if(".pdf".equals(prefix.toLowerCase())){
                fileDto.setFilePath(ossPreviewUrl+objectName+uploadName);
                fileDto.setFilePages(PdfUtils.getPdfPages(file));
                return fileDto;
            }else{
                ConvertOffice office = createConvertOffice(uploadName,millis);
                String result = ConvertOfficeUtils.convertOfficeFormat(office);
                if(StringUtils.isNotBlank(result)){
                    JSONObject jsStrr = JSONObject.parseObject(result);
                    fileDto.setFilePages((Integer) jsStrr.get("pageCount"));
                    fileDto.setFilePath(ossPreviewUrl+objectName+"convertPDF/"+millis + ".pdf");
                    return fileDto;
                }else{
                    fileDto.setReturnCode(ErrorEnum.REQUEST_FAIL.getCode());
                    fileDto.setReturnMsg("文档转换失败");
                    ossService.delete(ossPreviewUrl+objectName+uploadName);
                    return fileDto;
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
            fileDto.setReturnCode(ErrorEnum.REQUEST_FAIL.getCode());
            fileDto.setReturnMsg("文件上传失败 "+e.getStackTrace());
            return fileDto;
        }

    }

阿里云文档转换接口:https://help.aliyun.com/document_detail/74879.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值