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);
    }
}
相关推荐
开开心心_Every1 分钟前
强制打字练习工具:打够百字才可退出
java·游戏·微信·eclipse·pdf·excel·语音识别
xiaolyuh1232 分钟前
Redis 核心业务流程
java·redis·spring
BD_Marathon4 分钟前
MyBatis——封装SqlSessionUtils工具类并测试功能
java·windows·mybatis
浩瀚地学8 分钟前
【Java】集合-Collection
java·开发语言·经验分享·笔记·学习
开开心心_Every9 分钟前
多端免费远程控制工具:4K流畅同账号直连
游戏·macos·微信·pdf·excel·语音识别·phpstorm
wangkay8817 分钟前
【Java 转运营】Day03:抖音直播间自然流运营
java·开发语言·新媒体运营
计算机程序设计小李同学17 分钟前
平价药店销售与管理系统
java·mysql·spring·spring cloud·ssm
黎雁·泠崖17 分钟前
吃透Java操作符高阶:位操作符+赋值操作符 全解析(Java&C区别+实战技巧+面试考点)
java·c语言·面试
TEC_INO26 分钟前
STM32_11:DMA
java·前端·stm32
郑州光合科技余经理28 分钟前
私有化B2B订货系统实战:核心模块设计与代码实现
java·大数据·开发语言·后端·架构·前端框架·php