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