package com.ruoyi.web.controller.tool; import freemarker.cache.ClassTemplateLoader; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import lombok.extern.slf4j.Slf4j; import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.Map; @Slf4j @Component public class WordUtil { /** * 基于模板生成 Word 文档 * * @param response response * @param basePackagePath resources 目录下模板所在包路径 * @param templateFileName 模板文件名 * @param templateParam 模板参数 * @param fileName 文件名 */ // public void generate(HttpServletResponse response, String basePackagePath, String templateFileName, Object templateParam, String fileName) { // try { // // 设置 HTTP 响应的内容类型为 Microsoft Word 文档 // response.setContentType("application/msword"); // // 设置响应字符编码为 UTF-8 // response.setCharacterEncoding("utf-8"); // // 使用 URLEncoder 对文件名进行编码,以防止中文文件名在不同浏览器和操作系统下出现乱码问题 // String filename = URLEncoder.encode(fileName + "_" + System.currentTimeMillis(), "utf-8"); // // 设置响应头,指定文档将以附件的形式下载,并定义文件名 // response.setHeader("Content-disposition", "attachment;filename=" + filename + ".doc"); // // 创建 Freemarker 的 Configuration 对象,设置默认的不兼容改进选项 // Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS); // configuration.setDefaultEncoding("utf-8"); // // 设置模板加载器,加载模板文件 // configuration.setTemplateLoader(new ClassTemplateLoader(getClass(), basePackagePath)); // Template t = configuration.getTemplate(templateFileName, "utf-8"); // // 创建 Writer 对象,用于将生成的文档写到输出流中,缓存区大小设为 10KB // Writer out = new BufferedWriter(new OutputStreamWriter(response.getOutputStream(), StandardCharsets.UTF_8), 10240); // // 将模型数据与模板结合生成 Word 文档,写入到 Writer 对象中 // t.process(templateParam, out); // out.close(); // } catch (Exception e) { // log.info("基于模板{}生成Word文档异常,异常原因:{}", templateFileName, e.getMessage(), e); // throw new RuntimeException("生成Word文档异常,异常原因:" + e.getMessage()); // } // } public String generate(String basePackagePath, String templateFileName, Object templateParam, String fileName, String saveDirectory) { try { // 创建 Freemarker 的 Configuration 对象,设置默认的不兼容改进选项 Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS); configuration.setDefaultEncoding("utf-8"); // 设置模板加载器,加载模板文件 configuration.setTemplateLoader(new ClassTemplateLoader(getClass(), basePackagePath)); Template t = configuration.getTemplate(templateFileName, "utf-8"); // 使用 URLEncoder 对文件名进行编码,以防止中文文件名在不同浏览器和操作系统下出现乱码问题 // String encodedFileName = URLEncoder.encode(fileName + "_" + System.currentTimeMillis(), "utf-8"); String encodedFileName =fileName ; // 定义保存文件的路径 File saveDir = new File(saveDirectory); if (!saveDir.exists()) { saveDir.mkdirs(); } // 定义文件名 String filePath = saveDir.getAbsolutePath() + File.separator + encodedFileName + ".doc"; // 创建 Writer 对象,用于将生成的文档写到文件中,缓存区大小设为 10KB Writer out = new BufferedWriter(new FileWriter(filePath), 10240); // 将模型数据与模板结合生成 Word 文档,写入到 Writer 对象中 t.process(templateParam, out); out.close(); File file = new File(filePath); // 检查文件是否存在 if (!file.exists()) { throw new FileNotFoundException("文件不存在: " + filePath); } // 读取文件内容 byte[] fileContent = new byte[(int) file.length()]; try (FileInputStream fis = new FileInputStream(file)) { fis.read(fileContent); } MultipartFile mockMultipartFile = new MockMultipartFile(encodedFileName+".doc", fileContent); String s = ObsUploadUtil.obsUpload(mockMultipartFile); return s; } catch (IOException | TemplateException e) { log.error("生成Word文档异常,异常原因:{}", e.getMessage(), e); throw new RuntimeException("生成Word文档异常,异常原因:" + e.getMessage()); } } public String generatePdf(String basePackagePath, String templateFileName, Object templateParam, String fileName, String saveDirectory) { try { // 创建 Freemarker 的 Configuration 对象,设置默认的不兼容改进选项 Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS); configuration.setDefaultEncoding("utf-8"); // 设置模板加载器,加载模板文件 configuration.setTemplateLoader(new ClassTemplateLoader(getClass(), basePackagePath)); Template t = configuration.getTemplate(templateFileName, "utf-8"); // 使用 URLEncoder 对文件名进行编码,以防止中文文件名在不同浏览器和操作系统下出现乱码问题 // String encodedFileName = URLEncoder.encode(fileName + "_" + System.currentTimeMillis(), "utf-8"); String encodedFileName =fileName ; // 定义保存文件的路径 File saveDir = new File(saveDirectory); if (!saveDir.exists()) { saveDir.mkdirs(); } // 定义文件名 String filePath = saveDir.getAbsolutePath() + File.separator + encodedFileName + ".doc"; // 创建 Writer 对象,用于将生成的文档写到文件中,缓存区大小设为 10KB Writer out = new BufferedWriter(new FileWriter(filePath), 10240); // 将模型数据与模板结合生成 Word 文档,写入到 Writer 对象中 t.process(templateParam, out); out.close(); File file = new File(filePath); // 检查文件是否存在 if (!file.exists()) { throw new FileNotFoundException("文件不存在: " + filePath); } // 读取文件内容 byte[] fileContent = new byte[(int) file.length()]; try (FileInputStream fis = new FileInputStream(file)) { fis.read(fileContent); } String test = PdfUtils.test(encodedFileName + ".doc"); // MultipartFile mockMultipartFile = new MockMultipartFile(encodedFileName+".doc", fileContent); // String s = ObsUploadUtil.obsUpload(mockMultipartFile); return test; } catch (IOException | TemplateException e) { log.error("生成Word文档异常,异常原因:{}", e.getMessage(), e); throw new RuntimeException("生成Word文档异常,异常原因:" + e.getMessage()); } } }