利用minio 进行word转PDF

利用minio 进行word转PDF

/**
* minioPath  word文件在minio中的地址
* from   转换pdf文件来源工程名称,用于在mybucket里面创建目录
**/
@Override
    public  CommonResult<String> wordToPdf(String minioPath, String from) {
        try {
            if(lock(minioPath)){
                S3FileClient fileClient = new S3FileClient(1L, s3FileClientConfig);
                fileClient.init();
                // 读取内容
                byte[] content = fileClient.getContent(minioPath);
                File tmpFile = File.createTempFile("pdf", ".pdf");
                //libreoffice转换文件必须先加锁,不然并行情况下会有问题
                documentConverter.convert(new ByteArrayInputStream(content)).as(DefaultDocumentFormatRegistry.DOCX).to(tmpFile).as(DefaultDocumentFormatRegistry.PDF).execute();

                InputStream in = new FileInputStream(tmpFile);
                content = in.readAllBytes();
                String originalFilename = tmpFile.getName();
                if (Objects.equals(originalFilename, "")) {
                    throw exception(FILE_NOT_EXISTS);
                }
                String path = FileUtils.generatePath(content, originalFilename);
                //将文件根据日期进行分类管理
                String currentDate = LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE);
                path = from + "/" + currentDate + "/" + path;
                // 文件类型 非后缀
                String type = FileTypeUtils.getMineType(content, originalFilename);
                in.close();
                //文件大小
                String url = fileClient.upload(content, path, type);
                tmpFile.delete();
                return CommonResult.success(url);
            }
        } catch (Exception e) {
            log.error(e.getMessage());
        }finally {
            unLock(minioPath);
        }
        return CommonResult.error();
    }
@Data
public class S3FileClientConfig implements FileClientConfig {

    public static final String ENDPOINT_QINIU = "qiniucs.com";
    public static final String ENDPOINT_ALIYUN = "aliyuncs.com";
    public static final String ENDPOINT_TENCENT = "myqcloud.com";
    
    @NotNull(message = "endpoint 不能为空")
    private String endpoint;

    @URL(message = "domain 必须是 URL 格式")
    private String domain;
    /**
     * 存储 Bucket
     */
    @NotNull(message = "bucket 不能为空")
    private String bucket;

    @NotNull(message = "accessKey 不能为空")
    private String accessKey;
    /**
     * 访问 Secret
     */
    @NotNull(message = "accessSecret 不能为空")
    private String accessSecret;

    @SuppressWarnings("RedundantIfStatement")
    @AssertTrue(message = "domain 不能为空")
    @JsonIgnore
    public boolean isDomainValid() {
        // 如果是七牛,必须带有 domain
        if (StrUtil.contains(endpoint, ENDPOINT_QINIU) && StrUtil.isEmpty(domain)) {
            return false;
        }
        return true;
    }

    /**
     * 外网访问域名
     */
    private String address;
}
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
// @JsonTypeInfo 注解的作用,Jackson 多态
// 1. 序列化到时数据库时,增加 @class 属性。
// 2. 反序列化到内存对象时,通过 @class 属性,可以创建出正确的类型
public interface FileClientConfig {
}
public class FileTypeUtils {

    private static final ThreadLocal<Tika> TIKA = TransmittableThreadLocal.withInitial(Tika::new);

    /**
     * 获得文件的 mineType,对于doc,jar等文件会有误差
     *
     * @param data 文件内容
     * @return mineType 无法识别时会返回“application/octet-stream”
     */
    @SneakyThrows
    public static String getMineType(byte[] data) {
        return TIKA.get().detect(data);
    }

    /**
     * 已知文件名,获取文件类型,在某些情况下比通过字节数组准确,例如使用jar文件时,通过名字更为准确
     *
     * @param name 文件名
     * @return mineType 无法识别时会返回“application/octet-stream”
     */
    public static String getMineType(String name) {
        return TIKA.get().detect(name);
    }

    /**
     * 在拥有文件和数据的情况下,最好使用此方法,最为准确
     *
     * @param data 文件内容
     * @param name 文件名
     * @return mineType 无法识别时会返回“application/octet-stream”
     */
    public static String getMineType(byte[] data, String name) {
        return TIKA.get().detect(data, name);
    }

}
/**
 * 文件工具类
 *
 */
public class FileUtils {

    /**
     * 创建临时文件
     * 该文件会在 JVM 退出时,进行删除
     *
     * @param data 文件内容
     * @return 文件
     */
    @SneakyThrows
    public static File createTempFile(String data) {
        File file = createTempFile();
        // 写入内容
        FileUtil.writeUtf8String(data, file);
        return file;
    }

    /**
     * 创建临时文件
     * 该文件会在 JVM 退出时,进行删除
     *
     * @param data 文件内容
     * @return 文件
     */
    @SneakyThrows
    public static File createTempFile(byte[] data) {
        File file = createTempFile();
        // 写入内容
        FileUtil.writeBytes(data, file);
        return file;
    }

    /**
     * 创建临时文件,无内容
     * 该文件会在 JVM 退出时,进行删除
     *
     * @return 文件
     */
    @SneakyThrows
    public static File createTempFile() {
        // 创建文件,通过 UUID 保证唯一
        File file = File.createTempFile(IdUtil.simpleUUID(), null);
        // 标记 JVM 退出时,自动删除
        file.deleteOnExit();
        return file;
    }

    /**
     * 生成文件路径
     *
     * @param content      文件内容
     * @param originalName 原始文件名
     * @return path,唯一不可重复
     */
    public static String generatePath(byte[] content, String originalName) {
        String sha256Hex = DigestUtil.sha256Hex(content);
        // 情况一:如果存在 name,则优先使用 name 的后缀
        if (StrUtil.isNotBlank(originalName)) {
            String extName = FileNameUtil.extName(originalName);
            return StrUtil.isBlank(extName) ? sha256Hex : sha256Hex + "." + extName;
        }
        // 情况二:基于 content 计算
        return sha256Hex + '.' + FileTypeUtil.getType(new ByteArrayInputStream(content));
    }

}
### 回答1: minio技术白皮书pdf是一份介绍minio对象存储系统的技术白皮书,该文档详细介绍了minio的架构、核心功能和技术特点。 minio是一个高性能、可扩展的开源对象存储系统,它可用于在分布式环境中存储和管理大规模的非结构化数据。minio采用了云原生架构理念和分布式存储技术,具有高可用性、强一致性和可扩展性等优点。 minio的核心组件包括对象存储服务器、分布式文件系统和管理界面。它支持多种数据访问协议,包括S3、NFS、WebDAV等,可以与各种应用程序和系统进行集成。minio还提供了数据加密、访问控制、故障恢复和监控等功能,以保障数据的安全性和可靠性。 minio的架构是基于容器化和微服务的,可以灵活部署和扩展。它使用分布式文件系统来管理对象数据的存储和访问,通过横向扩展节点数量和数据分片来提供高吞吐量和低延迟。minio还支持数据冗余和副本机制,以确保数据不丢失和高可用性。 minio的技术特点包括数据持久性、数据一致性、灵活的数据访问、无服务器和容器友好等。通过使用minio,用户可以构建私有云存储、大规模数据分析和备份恢复等应用场景。 总而言之,minio技术白皮书pdf提供了关于minio对象存储系统的详细介绍和技术细节。对于研究和使用minio的开发者和管理员来说,这份文档是理解minio架构和功能的重要参考。 ### 回答2: 《Minio技术白皮书PDF》是一份关于Minio技术的详细介绍和说明的PDF文件。Minio是一个开源的对象存储服务器,具有高性能、高可用性和可扩展性的特点。 这份白皮书向读者介绍了Minio的基本概念、架构和特性。首先,它详细解释了对象存储的概念和作用,并介绍了Minio是如何通过分布式存储和弹性伸缩来实现高可用性和可扩展性的。 其次,白皮书详细介绍了Minio的体系结构,包括Minio服务器、客户端和分布式储存层。它解释了服务器和客户端之间的通信协议和数据传输流程,并介绍了分布式储存层是如何实现数据的分片存储和冗余备份的。 白皮书还介绍了Minio的核心功能和特性。它强调了Minio的高性能和低延迟,以及其与AWS S3的兼容性。同时,白皮书还介绍了Minio的安全性和权限控制机制,包括访问控制列表和加密传输。 除此之外,白皮书还提供了关于Minio的部署和管理指南。它解释了如何在不同的操作系统和云平台上安装和配置Minio,并介绍了如何监控和故障排除Minio服务器。 总之,《Minio技术白皮书PDF》是一份详细介绍Minio的技术指南,通过阅读这份白皮书,读者可以了解Minio的核心概念、架构和特性,以及如何部署和管理Minio服务器。这份白皮书对于对象存储技术和分布式存储感兴趣的人来说是一份很有价值的资源。 ### 回答3: MinIO技术白皮书PDF是一份关于MinIO对象存储开源项目的技术文档,具体介绍了MinIO的架构、特性和使用方法。MinIO是一个高性能、分布式的对象存储系统,它与AWS S3兼容,并且被广泛应用于云计算、大数据分析、机器学习和人工智能等领域。 该白皮书通过详细解释MinIO的设计理念和原则,帮助读者了解该系统的优势和适用场景。它描述了MinIO的分布式部署方式,如何实现数据的冗余和可靠性。同时,它还介绍了如何通过设置存储策略来满足各种不同的性能和容量要求。 此外,MinIO技术白皮书还详细阐述了MinIO的安全机制,包括数据的加密、访问控制和身份验证等方面。它提供了对MinIO的监控和管理方法,以便管理员能够实时监控存储系统的性能和健康状态。 最后,MinIO技术白皮书还提供了使用MinIO开发应用程序的指导和示例代码,帮助开发者快速上手并有效利用该系统。通过了解这份文档,读者将能够更好地理解MinIO的工作原理,并能够根据自己的需求合理地配置和使用MinIO对象存储系统。 总而言之,MinIO技术白皮书PDF对于想要深入理解和应用MinIO的个人和组织来说是一份宝贵的资料,它提供了全面而详细的技术参考,帮助读者充分了解MinIO的优势和应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@hhr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值