引言
在开发过程在需要使用使用格式转换去处理一些文件,在尝试过许多的格式转换方法后,发现一款比较好用的格式转换工具wps的格式转换工具
概述
转换服务提供将 【Word/Excel/PPT】文档转换成 【PDF/图片/txt】 格式文件的功能。
支持格式
详细支持功能如下:
- Word、Excel、PPT 转 PDF
- Word、Excel、PPT、PDF 转图片,支持 png/jpg/bmp/tif 等格式
- Word、Excel、PPT、PDF 转 txt,提取文本内容
工作原理
- 转换调用是没有阻塞的,会立即返回调用结果(转换任务的task_id),此时的返回结果仅仅是表明任务被正常接受,不表示转换完成。
- 通过轮询格式转换结果查询接口,来获取转换结果状态、下载链接。下载链接的有效时间是 30 分钟。
转换安全
- 格式转换过程中下载的文件都是打开后立即 删除源文件,不会留存
- 转换过程中产生的日志也都做了脱敏,确保不会有敏感数据 打印在日志文件
- 转换结果存储在 KS3,访问需要携带签名,且只有 30 分钟有效,失效后的文件无法再行访问
开发需知
可以参考weboffice开发平台提供的流程去申请开发者账号创建应用
代码示例
文档转pdf示例 java示例
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.http.HttpEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;
import javax.xml.bind.DatatypeConverter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import com.alibaba.fastjson.JSONObject;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class WpsAPIUtils {
public static void main(String[] args) throws IOException {
String appId = "xxxx";
String appKey = "xxxxxx";
// 文档名字
String fileName = "xxxx.docx";
//文档所在地址
String fileUrl = "https://xxx.com/xxxx.docx";
String taskId = getTaskId(appId,appKey,fileUrl, fileName);
String pdfUrl = queryPdf(appId, appKey, taskId);
}
/**
*
* @param appId 应用Id
* @param appKey 应用秘钥
* @param taskId
* @return wps转换后的地址 需注意文件名是wps提供的
* @throws JsonProcessingException
*/
public static String queryPdf(String appId,String appKey,String taskId) throws JsonProcessingException {
String reqUrl ="";
JSONObject jso = new JSONObject();
//md5换算 坑人的位置,uri也不说清楚是那段
String url = "/api/developer/v1/tasks/"+taskId;
System.out.println("jso.toJSONString() = " + jso.toJSONString());
String md5 = null;
try {
md5 = calculateMD5(url);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
String date = dateRFC1123();
String sha2 = appKey + md5 + "application/json" + date;
System.out.println("sha2 = " + sha2);
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Date", date);
headers.set("Content-Md5", md5);
headers.set("Authorization", "WPS-2:" + appId + ":" + sha1(appKey + md5 + "application/json" + date));
HttpEntity<String> requestEntity = new HttpEntity<>(null, headers);
ResponseEntity<String> response = restTemplate.exchange("https://solution.wps.cn/api/developer/v1/tasks/"+taskId, HttpMethod.GET, requestEntity, String.class);
JSONObject resMap = JSONObject.parseObject(response.getBody());
Object data = resMap.get("data");
System.out.println(data);
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(data.toString());
JsonNode resultNode = rootNode.get("result");
if (!StringUtils.isEmpty(resultNode)){
JsonNode pdfsNode = resultNode.get("pdfs");
JsonNode pdfNode = pdfsNode.get(0);
reqUrl = pdfNode.get("url").asText();
}else {
queryPdf(appId,appKey,taskId);
}
return reqUrl;
}
/**
*
* @param appId 应用Id
* @param appKey 应用秘钥
* @param fileUrl 文件地址
* @param fileName 文件名称
* @return
*/
public static String getTaskId(String appId,String appKey,String fileUrl,String fileName){
JSONObject jso = new JSONObject();
jso.put("url", fileUrl);
jso.put("filename", fileName);
System.out.println("jso.toJSONString() = " + jso.toJSONString());
String md5 = null;
try {
md5 = calculateMD5(jso.toJSONString());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
String date = dateRFC1123();
String sha2 = appKey + md5 + "application/json" + date;
//String sha3 = sha1(appKey + md5 + "application/json" + date);
System.out.println("sha2 = " + sha2);
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Date", date);
headers.set("Content-Md5", md5);
headers.set("Authorization", "WPS-2:" + appId + ":" + sha1(appKey + md5 + "application/json" + date));
HttpEntity<String> requestEntity = new HttpEntity<>(jso.toJSONString(), headers);
ResponseEntity<String> response = restTemplate.exchange("https://solution.wps.cn/api/developer/v1/office/convert/to/pdf", HttpMethod.POST, requestEntity, String.class);
JSONObject resMap = JSONObject.parseObject(response.getBody());
Object data = resMap.get("data");
JSONObject dateMmap = JSONObject.parseObject(data.toString());
Object taskId = dateMmap.get("task_id");
return taskId.toString();
}
private static String sha1(String data) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-1");
byte[] bytes = digest.digest(data.getBytes());
StringBuilder builder = new StringBuilder();
for (byte b : bytes) {
builder.append(String.format("%02x", b));
}
return builder.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
public static String dateRFC1123() {
LocalDateTime now = LocalDateTime.now(ZoneId.of("UTC"));
DateTimeFormatter rfc1123Formatter = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);
String formattedTime = now.format(rfc1123Formatter);
return formattedTime;
}
public static String calculateMD53(String rawBody) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(rawBody.getBytes());
byte[] digest = md.digest();
return DatatypeConverter.printHexBinary(digest).toLowerCase();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
public static String calculateMD5(String input) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hashInBytes = md.digest(input.getBytes(StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder();
for (byte b : hashInBytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
}