java把word转pdf使用jar包maven依赖

引入maven

java 复制代码
 <!--word转pdf-->
 <dependency>
     <groupId>com.documents4j</groupId>
     <artifactId>documents4j-local</artifactId>
     <version>1.0.3</version>
 </dependency>

 <dependency>
     <groupId>com.documents4j</groupId>
     <artifactId>documents4j-transformer-msoffice-word</artifactId>
     <version>1.0.3</version>
 </dependency>
java 复制代码
package org.springblade.modules.api.utils;

import com.documents4j.api.DocumentType;
import com.documents4j.api.IConverter;
import com.documents4j.job.LocalConverter;
import org.springblade.core.tool.utils.Func;


import java.io.*;

public class ExportWordToPdfUtil {

    /**
     * Word转PDF
     *
     * @param filePath    源docx文件目录及名称  示例:F:\\machine\\naReport\\20251022\\1761112860572运行情况简报.docx
     * @param outFilePath 输出文件目录及名称 示例:F:\\machine\\naReport\\20251022\\1761112860572运行情况简报.pdf
     */
    public static void wordToPdf(String filePath, String outFilePath) {
        //NaReport naReport = new NaReport();
        File inputWord = new File(filePath);
        File outputFile = new File(outFilePath);

        // 确保输出目录存在
        File parentDir = outputFile.getParentFile();
        if (parentDir != null && !parentDir.exists()) {
            parentDir.mkdirs();
        }

        // 如果输出文件已存在则删除(实现替换)
        if (outputFile.exists()) {
            if (!outputFile.delete()) {
                System.err.println("警告:无法删除已存在的文件,可能被占用或无权限: " + outFilePath);
            }
        }

        IConverter converter = null;
        try (InputStream doc = new FileInputStream(inputWord);
             OutputStream outputStream = new FileOutputStream(outputFile)) {

            converter = LocalConverter.builder().build();
            boolean flag = converter.convert(doc)
                    .as(DocumentType.DOCX)  // 修正为DOCX(原代码误用DOC)
                    .to(outputStream)
                    .as(DocumentType.PDF)
                    .execute();

            if (flag) {
                // 获取文件大小和绝对路径
                long fileSize = outputFile.length();
                //naReport.setSize(smartConvert(fileSize));
                //naReport.setUrl(outFilePath);
                System.out.println("文件大小:" + smartConvert(fileSize));
                System.out.println("文件名:" + outFilePath + " 转换成功!");
                // TODO返回格式:文件大小|绝对路径,我这里是为了自己处理,不需要的可以直接删除
                //return naReport;
            } else {
                System.err.println("转换失败,未知错误");
            }
        } catch (Exception e) {
            // 转换失败时删除可能生成的不完整文件
            if (outputFile.exists()) {
                outputFile.delete();
            }
            e.printStackTrace();
        } finally {
            // 确保无论成功与否都关闭转换器
            if (converter != null) {
                converter.shutDown();
            }
        }
    }

    /**
     * 将字节大小转换为易读的字符串(自动选择最佳单位)
     *
     * @param bytes 文件大小(字节)
     * @return 格式化后的字符串(如:1.23 MB)
     */
    public static String formatFileSize(long bytes) {
        if (bytes < 1024) {
            return bytes + " B";
        }

        double size = bytes;
        String[] units = {"KB", "MB", "GB", "TB"};
        int unitIndex = -1;

        while (size >= 1024 && unitIndex < units.length - 1) {
            size /= 1024;
            unitIndex++;
        }

        return String.format("%.2f %s", size, units[unitIndex]);
    }

    /**
     * 转换为KB(保留两位小数)
     *
     * @param bytes 文件大小(字节)
     * @return KB大小的字符串表示
     */
    public static String toKB(long bytes) {
        double kb = bytes / 1024.0;
        return String.format("%.2f KB", kb);
    }

    /**
     * 转换为MB(保留两位小数)
     *
     * @param bytes 文件大小(字节)
     * @return MB大小的字符串表示
     */
    public static String toMB(long bytes) {
        double mb = bytes / (1024.0 * 1024.0);
        return String.format("%.2f MB", mb);
    }

    /**
     * 智能转换(自动选择KB或MB)
     *
     * @param bytes 文件大小(字节)
     * @return 最合适的单位表示
     */
    public static String smartConvert(long bytes) {
        if (bytes < 1024 * 1024) { // 小于1MB
            return toKB(bytes);
        } else {
            return toMB(bytes);
        }
    }

    public static void main(String[] args) {
        String filePath = "F:\\machine\\naReport\\20251022\\1761112860572运行情况简报.docx";
        String outFilePath = "F:/machine/naReport/20251022/1761112860572运行情况简报.pdf";
        wordToPdf(filePath, outFilePath);
    }
}
相关推荐
wang09075 小时前
自己动手写一个spring之IOC_2
java·后端·spring
来杯@Java6 小时前
学生选课管理系统(基于springboot+vue前后端分离的项目)计算机毕业设计java
java·spring boot·spring·vue·毕业设计·maven·mybatis
不知名的老吴7 小时前
线程的生命周期之线程“插队“
java·开发语言·python
ANnianStriver7 小时前
PetLumina-02-后端开发与前后端联调
java·ai·sa-token
杨了个杨89827 小时前
Keepalived + Nginx + HAProxy 高可用架构部署实战案例
java·nginx·架构
马士兵教育9 小时前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习
snow@li10 小时前
Java:理解 Gradle / 后端项目的管家 / 打包SpringBoot 应用 / 完成编译、下载依赖、运行测试、打包 JAR/WAR / 速查表
java
云烟成雨TD10 小时前
Spring AI 1.x 系列【57】动态工具发现:Tool Search Tool
java·人工智能·spring
zfoo-framework10 小时前
[修改代码使用]codex官方app中使用中转(不需要cc-switch) 1.config.toml 2.sk方式登录
java