word模板填充转pdf导出处理
关于word模板填充示例 java根据word模板填充数据并导出-五官一体即忢
相关依赖插件【LibreOffice】
安装 LibreOffice :从LibreOffice 官方网站下载并安装适合 Windows 系统或者Linux系统的版本
启动 LibreOffice 服务:打开命令提示符,执行以下命令启动 LibreOffice 服务:
注意:
1、默认安装路径:C:\Program Files\LibreOffice\program
2、配置环境变量,将C:\Program Files\LibreOffice\program放到环境变量中Path中
3、端口port=2002可以根据实际情况设定
plaintext
soffice.exe --headless --accept="socket,host=127.0.0.1,port=2002;urp;"
添加 JODConverter 依赖 :如果你使用 Maven 项目,可在pom.xml
文件中添加以下依赖:
xml
<!-- word 转pdf 相关依赖 -->
<dependency>
<groupId>org.jodconverter</groupId>
<artifactId>jodconverter-core</artifactId>
<version>4.4.2</version>
</dependency>
<dependency>
<groupId>org.jodconverter</groupId>
<artifactId>jodconverter-local</artifactId>
<version>4.4.2</version>
</dependency>
工具类示例:
java
package org.test.manage.utils;
import com.deepoove.poi.XWPFTemplate;
import org.apache.commons.io.FileUtils;
import org.jodconverter.core.DocumentConverter;
import org.jodconverter.core.office.OfficeException;
import org.jodconverter.core.office.OfficeManager;
import org.jodconverter.local.office.LocalOfficeManager;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Map;
public class WordFileUtil {
// 端口根据自己启动配置端口调整
private static final int OFFICE_PORT = 20020;
private static LocalOfficeManager officeManager;
static {
officeManager = LocalOfficeManager.builder()
.install()
.portNumbers(OFFICE_PORT)
.taskExecutionTimeout(10000L)
.taskQueueTimeout(5000L)
.build();
try {
officeManager.start();
} catch (OfficeException e) {
throw new RuntimeException(e);
}
}
/**
* 处理word
* 数据填充Word模板
* @param path
* @param taskForm 填充内容
* @return
*/
public static byte[] getWord(String path, Map<String, Object> taskForm) {
byte[] data = null;
File tempFile = null;
try {
// 获取文件流
InputStream stream = WordFileUtil.class.getClassLoader().getResourceAsStream(path);
// 创建临时文件
tempFile = File.createTempFile("template", ".docx");
// 将读取到的内容存储到临时文件中,后面就可以用这个临时文件访问了
FileUtils.copyInputStreamToFile(stream, tempFile);
// 渲染表格
XWPFTemplate template = XWPFTemplate.compile(tempFile.getAbsolutePath()).render(taskForm);
ByteArrayOutputStream out = new ByteArrayOutputStream();
template.write(out);
out.close();
template.close();
data = out.toByteArray();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 删除临时文件
if (tempFile != null && tempFile.exists()) {
tempFile.delete();
}
}
return data;
}
/**
* 下载Word文件
* @param path
* @param taskForm 填充内容
* @param response HttpServletResponse对象
*/
public static void downloadWord(String path, Map<String, Object> taskForm, HttpServletResponse response,String fileName) {
byte[] data = getWord(path, taskForm);
if (data != null) {
try {
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
// URL 编码文件名
String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
// 设置 Content-Disposition 头
response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedFileName + "\"; filename*=UTF-8''" + encodedFileName);
response.getOutputStream().write(data);
response.getOutputStream().flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 将Word文件转换为PDF
* @param wordBytes Word文件的字节数组
* @return PDF文件的字节数组
*/
public static byte[] convertWordToPdf(byte[] wordBytes) {
byte[] pdfBytes = null;
File tempWordFile = null;
File tempPdfFile = null;
try {
// 创建临时文件来存储Word字节数组
tempWordFile = File.createTempFile("temp", ".docx");
try (FileOutputStream fos = new FileOutputStream(tempWordFile)) {
fos.write(wordBytes);
}
// 创建临时文件来存储PDF字节数组
tempPdfFile = File.createTempFile("temp", ".pdf");
// 使用jodconverter进行转换
DocumentConverter converter = org.jodconverter.local.LocalConverter.make(officeManager);
converter.convert(tempWordFile)
.to(tempPdfFile)
.execute();
// 读取PDF文件到字节数组
pdfBytes = FileUtils.readFileToByteArray(tempPdfFile);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 删除临时文件
if (tempWordFile != null && tempWordFile.exists()) {
tempWordFile.delete();
}
if (tempPdfFile != null && tempPdfFile.exists()) {
tempPdfFile.delete();
}
}
return pdfBytes;
}
/**
* 下载PDF文件
* @param path
* @param taskForm 填充内容
* @param response HttpServletResponse对象
* @param fileName 文件名
*/
public static void downloadPdf(String path, Map<String, Object> taskForm, HttpServletResponse response, String fileName) {
byte[] wordBytes = getWord(path, taskForm);
if (wordBytes != null) {
byte[] pdfBytes = convertWordToPdf(wordBytes);
if (pdfBytes != null) {
try {
response.setContentType("application/pdf");
// URL 编码文件名
String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
// 设置 Content-Disposition 头
response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedFileName + "\"; filename*=UTF-8''" + encodedFileName);
response.getOutputStream().write(pdfBytes);
response.getOutputStream().flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 调试插件是否运行正常
public static void main(String[] args) {
// 输入的Word文件路径
File inputFile = new File("C:\\Users\\PHJ\\OneDrive\\Desktop\\开发部门_2025年第13周_周报 (2).docx");
// 输出的PDF文件路径
File outputFile = new File("C:\\Users\\PHJ\\OneDrive\\Desktop\\开发部门_2025年第13周_周报11 (2).pdf");
// 创建一个本地Office管理器实例
OfficeManager officeManager = LocalOfficeManager.builder()
.portNumbers(2002)
.build();
try {
// 启动Office管理器
officeManager.start();
// 创建一个文档转换器实例
DocumentConverter converter = org.jodconverter.local.LocalConverter.make(officeManager);
// 执行转换操作
converter.convert(inputFile).to(outputFile).execute();
System.out.println("文档转换成功!");
} catch (OfficeException e) {
System.err.println("文档转换失败: " + e.getMessage());
} finally {
try {
// 停止Office管理器
officeManager.stop();
} catch (OfficeException e) {
System.err.println("停止Office管理器失败: " + e.getMessage());
}
}
}
}
工具类调用示例
java
Map<String, Object> taskForm = new HashMap<>();
String signPicture = "https://uy.wzznft.com/i/2025/04/29/h9ttbw.png";
PictureRenderData picture = Pictures.ofUrl(signPicture, PictureType.PNG).size(50, 25).create();//网络图片地址
//PictureRenderData picture = Pictures.ofLocal(signPicture).size(10, 20).create();//本地图片地址
taskForm.put("测试", "测试");
taskForm.put("signPicture", picture);
WordFileUtil.downloadPdf("template/word模板.docx", taskForm, response,ObjectUtil.isNotEmpty(dept) ? dept.getFullName() + "_" + deptReport.getReportDate() +"_周报.pdf" : "周报.pdf");
// WordFileUtil.downloadWord("template/word模板.docx", taskForm, response,ObjectUtil.isNotEmpty(dept) ? dept.getFullName() + "_" + deptReport.getReportDate() +"_周报.docx" : "周报.docx");