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.annotation.Resource;
|
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 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());
|
// }
|
// }
|
@Resource
|
private TencentCosUtil tencentCosUtil;
|
@Resource
|
private PdfUtils pdfUtils;
|
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 = tencentCosUtil.upLoadFile(mockMultipartFile,"/wordGenerate");
|
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("生成pdf异常,异常原因:{}", e.getMessage(), e);
|
throw new RuntimeException("生成pdf异常,异常原因:" + e.getMessage());
|
}
|
}
|
|
|
|
|
}
|