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

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");
相关推荐
小矮强5 小时前
Word总页码减去首页
word
南风微微吹6 小时前
全国事业单位联考A、B、C、D、E类历年真题及答案解析PDF电子版(2015-2025年下)
pdf·考公
优化控制仿真模型6 小时前
【2026年最新】毕业论文答辩、开题汇报PPT模版电子版下载
经验分享·pdf
daanpdf7 小时前
大一《中国近代史纲要》题库及答案PDF知识点整理笔记
笔记·pdf
采坑先锋8 小时前
复杂图标的word转pdf
pdf·word
诸葛大钢铁9 小时前
如何将SVG格式文件转为PDF? 方便打印输出、正式汇报、跨平台展示
pdf·svg·svg转换为pdf
玄月三初1 天前
使用pandoc把word转换成markdown格式
vscode·word·markdown
试剂界的爱马仕1 天前
Pdf 压缩和转图片 工具,简单易用
pdf
再写一行代码就下班1 天前
word模版导出(占位符方式)
java·开发语言·word
w2018001 天前
2025年12月CET4大学英语四级真题试卷、听力音频及答案PDF(三套全)
pdf