wps格式转换

1 篇文章 0 订阅

引言

在开发过程在需要使用使用格式转换去处理一些文件,在尝试过许多的格式转换方法后,发现一款比较好用的格式转换工具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();
    }

}

最后

我的微信公众号

微信公众号连接地址
这是我的csdn博客地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值