Java使用Aspose进行文件转换

文档类的转换参考https://www.cnblogs.com/Tom-shushu/p/17367203.html

一、引入jar包

阿里云没有Aspose的坐标,需要从Aspose仓库中把jar包下载到本地仓库引入

下载地址:Aspose Repository Browser /java/repo/

        <dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose-3d</artifactId>
            <version>23.8.0</version>
        </dependency>

注意:jar包类编译版本是9,jdk8运行会报错,需要使用高版本,我这里用的是jdk17

二、枚举

package cn.piesat.space.aspose.enums;

import com.aspose.threed.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NonNull;

/**
 * @author Marclew
 * @date 2023/8/28 17:17
 * @describe
 */
@Getter
@AllArgsConstructor
@SuppressWarnings("AlibabaEnumConstantsMustHaveComment")
public enum SolidSaveEnum {
    Discreet_3DS_OUTPUT(1, FileFormat.DISCREET3DS, ".3ds"),
    AMF_OUTPUT(2, FileFormat.AMF, ".amf"),
    RVM_OUTPUT(3, FileFormat.RVM_BINARY, ".rvm"),
    DAE_OUTPUT(4, FileFormat.COLLADA, ".dae"),
    DRC_OUTPUT(5, FileFormat.DRACO, ".drc"),
    FBX_OUTPUT(6, FileFormat.FBX7500ASCII, ".fbx"),
    GLB_OUTPUT(7, FileFormat.GLTF2_BINARY, ".glb"),
    OBJ_OUTPUT(8, FileFormat.WAVEFRONTOBJ, ".obj"),
    PLY_OUTPUT(9, FileFormat.PLY, ".ply"),
    STL_OUTPUT(10, FileFormat.STL_BINARY, ".stl"),
    U3D_OUTPUT(11, FileFormat.UNIVERSAL3D, ".u3d"),
    USD_OUTPUT(12, FileFormat.USD, ".usd"),
    USDZ_OUTPUT(13, FileFormat.USDZ, ".usdz"),
    GLTF_OUTPUT(14, FileFormat.GLTF2_BINARY, ".gltf"),

    PDF_OUTPUT(15, FileFormat.PDF, ".pdf"),
    HTML_OUTPUT(16, FileFormat.HTML5, ".html"),
;
    private final int type;
    private final FileFormat fileFormat;
    private final String suffix;

    public static SolidSaveEnum getTypeName(Integer type){
        for(SolidSaveEnum asposeSaveOptionsEnum : values()){
            if (asposeSaveOptionsEnum.getType() == type) {
                //获取指定的枚举
                return asposeSaveOptionsEnum;
            }
        }
        return null;
    }
}

三、controller

    /**
     * @description: 3D文件转换
     */
    @ApiOperation(value = "3D文件转换")
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "file", value = "输入文件支持后缀: (3ds、amf、rvm、dae、drc、fbx、glb、obj、ply、stl、u3d、usd、usdz、gltf)", dataType = "__file", required = true),
            @ApiImplicitParam(name = "type", value = "输出文件类型: (1:3ds 2:amf 3:rvm 4:dae 5:drc 6:fbx 7:glb 8:obj 9:ply 10:stl 11:u3d 12:usd 13:usdz 14:gltf)", dataType = "int", required = true)
    })
    @PostMapping("/solidConvert")
    @SneakyThrows(Exception.class)
    public String solidConvert(@RequestParam("file") MultipartFile file, Integer type) {
        return solidService.solidConvert(file, type);
    }

四、转换方法

    @Override
    public String solidConvert(MultipartFile file, Integer type) {
        // 1.跳过aspose的验证签名
        TrialException.setSuppressTrialException(true);

        // 2.输入文件格式是否符合要求
        String suffix = FilenameUtils.getExtension(file.getOriginalFilename());
        if (ObjectUtil.isEmpty(suffix)){
            throw new BusinessException(ResultCodeEnum.SOLID_SUFFIX_NOT_ALLOWED);
        }
        suffix = suffix.toLowerCase();
        if (!"3ds".equals(suffix) && !"amf".equals(suffix) && !"rvm".equals(suffix)
                && !"dae".equals(suffix) && !"drc".equals(suffix) && !"fbx".equals(suffix)
                && !"glb".equals(suffix) && !"obj".equals(suffix) && !"ply".equals(suffix)
                && !"stl".equals(suffix) && !"u3d".equals(suffix) && !"usd".equals(suffix)
                && !"usdz".equals(suffix) && !"gltf".equals(suffix)) {
            throw new BusinessException(ResultCodeEnum.SOLID_SUFFIX_NOT_ALLOWED);
        }

        // 3.输出文件格式是否符合要求
        SolidSaveEnum solidSaveEnum = SolidSaveEnum.getTypeName(type);
        if (ObjectUtil.isEmpty(solidSaveEnum)){
            throw new BusinessException(ResultCodeEnum.SOLID_SUFFIX_NOT_ALLOWED);
        }

        //  4.文件缓存到本地
        String fileName = UUID.randomUUID() + "." + suffix;
        String localOldFilePath = AsposeConstant.LOCAL_TEMP_ASPOSE_FILE_DIR + fileName;
        File localOldFile = null;
        try {
            localOldFile = new File(localOldFilePath);
            file.transferTo(localOldFile);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //  5.开始转换
        Scene scene = null;
        try {
            scene = Scene.fromFile(localOldFilePath);
        } catch (IOException e) {
            throw new BusinessException(ResultCodeEnum.FILE_FORMAT_ERROR);
        }

        String newFileName = UUID.randomUUID() + solidSaveEnum.getSuffix();
        String newFilePath = AsposeConstant.LOCAL_TEMP_ASPOSE_FILE_DIR + newFileName;
        try {
            scene.save(newFilePath, solidSaveEnum.getFileFormat());
        } catch (IOException e) {
            throw new BusinessException(ResultCodeEnum.FILE_FORMAT_ERROR);
        }

        //  6.上传obs
        File outputfile  = new File(newFilePath);
        String url = "";
        try {
            url = obsUtil.putObject(AsposeConstant.ASPOSE_SOLID_DIR + newFileName, outputfile);
        } catch (Exception e) {
            throw new BusinessException(ResultCodeEnum.FILE_FORMAT_ERROR);
        }
        localOldFile.delete();
        outputfile.delete();
        return url;
    }

五、docker部署

制作一个jdk17镜像包作为基础镜像

下载一个jdk-17_linux-x64_bin.tar.gz上传到服务器

FROM centos:7
WORKDIR /usr/local/jdk
ADD jdk-17_linux-x64_bin.tar.gz /usr/local/jdk
ENV JAVA_HOME=/usr/local/jdk/jdk-17.0.9
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/timezone
ENV LC_ALL=zh_CN.utf8
ENV LANG=zh_CN.UTF8
ENV LANGUAGE=zh_CN.utf8
RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
RUN yum -y install fontconfig \
        && yum -y install mkfontscale \
        && mkfontscale && mkfontdir \
        && fc-cache -fv
#容器启动时需要执行的命令
#CMD ["java","-version"]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值