word模板填充导出-(支持word导出、pdf导出)

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可以根据实际情况设定

soffice.exe --headless --accept="socket,host=127.0.0.1,port=2002;urp;"

添加 JODConverter 依赖:如果你使用 Maven 项目,可在pom.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>

工具类示例:

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());
			}
		}
	}
}

工具类调用示例

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");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值