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);
    }
}
相关推荐
摇滚侠几秒前
IDEA Maven 项目打包标准使用指南
java·maven·intellij-idea
阿里-于怀1 分钟前
Kubernetes 官方再出公告,强调立即迁移 Ingress NGINX
java·大数据·数据库·ingress nginx
.ZGR.5 分钟前
从游戏到实战的线程进阶之旅:智能无人机防空平台
java·开发语言·无人机
JMchen1235 分钟前
Android TCP连接实战:详解一个高效可靠的TCP客户端实现
android·java·经验分享·网络协议·tcp/ip·移动开发·android-studio
NWU_白杨6 分钟前
智能无人机平台V4
java·开发语言·无人机
青云交15 分钟前
Java 大视界 -- Java 大数据在智能教育在线考试系统中的考试结果分析与教学反馈优化中的应用
java·在线考试·java大数据·智能教育
开开心心_Every17 分钟前
音频视频转文字工具,离线语音识别免费
人工智能·游戏·微信·pdf·excel·语音识别·memcache
小虾米vivian19 分钟前
达梦使用dmfldr和外部表导入txt数据(windows环境)
java·服务器·数据库
wsy_66619 分钟前
docker
java·spring cloud·docker
1104.北光c°21 分钟前
【黑马点评项目笔记 | 商户查询缓存篇】基于Redis解决缓存穿透、雪崩、击穿三剑客
java·开发语言·数据库·redis·笔记·spring·缓存