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);
    }
}
相关推荐
Java小王子呀5 小时前
Java实现Excel转PDF
java·pdf·excel
得物技术5 小时前
从一次启动失败深入剖析:Spring循环依赖的真相|得物技术
java·后端
程序猿DD5 小时前
Jackson 序列化的隐性成本
java·后端
凤山老林5 小时前
SpringBoot 如何实现零拷贝:深度解析零拷贝技术
java·linux·开发语言·arm开发·spring boot·后端
程序员小假5 小时前
我们来讲一讲阻塞队列及其应用
java·后端
带刺的坐椅5 小时前
snack4-jsonpath v4.0.2 发布
java·jsonpath
W.Buffer6 小时前
Java并发工具类详解:Semaphore、CyclicBarrier与CountDownLatch
java·开发语言
鼠鼠我捏,要死了捏6 小时前
深度解析JVM GC调优实践指南
java·jvm·gc