引入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);
}
}
