From ef30e3f2eebad385c8b26bd0ff931c028d46f3ce Mon Sep 17 00:00:00 2001
From: luofl <1442745593@qq.com>
Date: 星期一, 21 四月 2025 10:39:00 +0800
Subject: [PATCH] 修改bug

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/WordUtil.java |  298 +++++++++++++++++++++++++++++++----------------------------
 1 files changed, 158 insertions(+), 140 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/WordUtil.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/WordUtil.java
index 267a564..b57b54b 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/WordUtil.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/WordUtil.java
@@ -1,11 +1,13 @@
 package com.ruoyi.web.controller.tool;
 
+import cn.hutool.core.io.FileUtil;
+import com.ruoyi.common.utils.StringUtils;
 import freemarker.cache.ClassTemplateLoader;
 import freemarker.template.Configuration;
 import freemarker.template.Template;
 import freemarker.template.TemplateException;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import net.coobird.thumbnailator.Thumbnails;
 import org.apache.poi.util.Units;
 import org.apache.poi.xwpf.usermodel.*;
 import org.springframework.mock.web.MockMultipartFile;
@@ -13,7 +15,10 @@
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
 import java.io.*;
+import java.nio.file.Files;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -60,112 +65,6 @@
     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, Map<String,Object> templateParam, String fileName, String saveDirectory,String url) {
-        try {
-
-            fillTemplate(basePackagePath+templateFileName, saveDirectory+fileName+".docx", templateParam,url);
-
-            // 创建 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();
-            String filePath = saveDirectory + File.separator + fileName + ".docx";
-            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(fileName + ".docx");
-//            MultipartFile mockMultipartFile = new MockMultipartFile(encodedFileName+".doc", fileContent);
-//            String s = ObsUploadUtil.obsUpload(mockMultipartFile);
-            return test;
-        } catch (IOException e) {
-            log.error("生成pdf异常,异常原因:{}", e.getMessage(), e);
-            throw new RuntimeException("生成pdf异常,异常原因:" + e.getMessage());
-        }
-    }
-
     public static void fillTemplate(String templatePath, String outputPath,Map<String, Object> dataMap,String url) {
         try (FileInputStream fis = new FileInputStream(templatePath)) {
             // 设置默认编码为UTF-8
@@ -173,28 +72,42 @@
 
             XWPFDocument document = new XWPFDocument(fis);
             XWPFParagraph pic = document.createParagraph();
-            XWPFRun picRun = pic.createRun();
             Base64.Decoder decoder = Base64.getDecoder();
-            byte[] imageByte = decoder.decode(url);
-            InputStream stream = new ByteArrayInputStream(imageByte);
-            File tempFile = File.createTempFile("/usr/local/project/file/temp", ".jpg");
-            tempFile.deleteOnExit(); // 程序结束时删除文件
+            if(StringUtils.isNotEmpty(url)){
+                byte[] imageByte = decoder.decode(url);
+                InputStream stream = new ByteArrayInputStream(imageByte);
+//            File tempFile = FileUtil.createTempFile("/usr/local/project/file/temp", ".jpg", true);
+                File tempFile = File.createTempFile("/usr/local/project/file/temp", ".jpg");
+                tempFile.deleteOnExit(); // 程序结束时删除文件
 
-            try (OutputStream out = new FileOutputStream(tempFile);
-                 InputStream in = stream) {
-                byte[] buffer = new byte[1024];
-                int length;
-                // 从原始流读取数据并写入临时文件
-                while ((length = in.read(buffer)) > 0) {
-                    out.write(buffer, 0, length);
+                try (OutputStream out = Files.newOutputStream(tempFile.toPath());
+                     InputStream in = stream) {
+                    Thumbnails.of(in).scale(0.8).rotate(270).outputFormat("jpg").toOutputStream(out);
+                    byte[] buffer = new byte[1024];
+                    int length;
+                    // 从原始流读取数据并写入临时文件
+                    while ((length = in.read(buffer)) > 0) {
+                        out.write(buffer, 0, length);
+                    }
+                }
+
+                //处理图片
+                for (XWPFParagraph paragraph : document.getParagraphs()) {
+                    List<XWPFRun> runs = paragraph.getRuns();
+                    for (XWPFRun run : runs) {
+                        String text = run.getText(0);
+                        if (text != null && text.contains("picture")) {
+                            run.setText("", 0); // 清除占位符文本
+                            run.addPicture(
+                                    new FileInputStream(tempFile), XWPFDocument.PICTURE_TYPE_JPEG,
+                                    tempFile.getName(),
+                                    Units.toEMU(60),
+                                    Units.toEMU(30)); // 插入图片
+                        }
+                    }
                 }
             }
-            dataMap.put("${picture}", picRun.addPicture(
-                    new FileInputStream(tempFile), XWPFDocument.PICTURE_TYPE_JPEG,
-                    "/usr/local/project/file/sign.jpg",
-                    Units.toEMU(60),
-                    Units.toEMU(30)
-            ));
+
             // 处理段落
             for (XWPFParagraph paragraph : document.getParagraphs()) {
                 replaceParagraph(paragraph, dataMap);
@@ -210,7 +123,7 @@
                     }
                 }
             }
-
+            
             // 使用UTF-8编码保存文件
             try (FileOutputStream fos = new FileOutputStream(outputPath)) {
                 document.write(fos);
@@ -312,20 +225,6 @@
         return result.toString();
     }
 
-    private static class ReplacementInfo {
-        int startRun;
-        int endRun;
-        String originalText;
-        String replacementText;
-
-        ReplacementInfo(int startRun, int endRun, String originalText, String replacementText) {
-            this.startRun = startRun;
-            this.endRun = endRun;
-            this.originalText = originalText;
-            this.replacementText = replacementText;
-        }
-    }
-
     private static void replaceRunRange(XWPFParagraph paragraph, ReplacementInfo info) {
         List<XWPFRun> runs = paragraph.getRuns();
 
@@ -346,6 +245,125 @@
         style.applyStyle(newRun);
     }
 
+    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, Map<String,Object> templateParam, String fileName, String saveDirectory,String url) {
+        try {
+
+            fillTemplate(basePackagePath+templateFileName, saveDirectory+fileName+".docx", templateParam,url);
+
+            // 创建 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();
+            String filePath = saveDirectory + File.separator + fileName + ".docx";
+            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(fileName + ".docx");
+//            MultipartFile mockMultipartFile = new MockMultipartFile(encodedFileName+".doc", fileContent);
+//            String s = ObsUploadUtil.obsUpload(mockMultipartFile);
+            return test;
+        } catch (IOException e) {
+            log.error("生成pdf异常,异常原因:{}", e.getMessage(), e);
+            throw new RuntimeException("生成pdf异常,异常原因:" + e.getMessage());
+        }
+    }
+
+    private static class ReplacementInfo {
+        int startRun;
+        int endRun;
+        String originalText;
+        String replacementText;
+
+        ReplacementInfo(int startRun, int endRun, String originalText, String replacementText) {
+            this.startRun = startRun;
+            this.endRun = endRun;
+            this.originalText = originalText;
+            this.replacementText = replacementText;
+        }
+    }
+
     // 用于保存和恢复运行样式的辅助类
     private static class RunStyle {
         String fontFamily;

--
Gitblit v1.7.1