From 9f40e901f53b08a74a4b640e135fb9715c79cd21 Mon Sep 17 00:00:00 2001
From: 13405411873 <1994398261@qq.com>
Date: Sat, 15 Feb 2025 11:47:58 +0800
Subject: [PATCH] =?UTF-8?q?bug=20=E5=A4=84=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pom.xml                                       |   2 +-
 ruoyi-admin/pom.xml                           |  17 +-
 .../controller/PatientScriptController.java   |   2 +-
 .../ruoyi/script/entity/PatientScript.java    |   3 +
 .../script/service/PatientScriptService.java  |   3 +
 .../impl/PatientScriptServiceImpl.java        | 148 ++++++++++++++++++
 .../script/util/ConvertToMultipartFile.java   |  64 ++++++++
 .../com/ruoyi/script/util/Word2PdfUtil.java   | 108 +++++++++++++
 .../ruoyi/script/util/WordToPdfConverter.java |  91 +++++++++++
 .../script/util/WordToPdfConverter2.java      |  39 +++++
 .../com/ruoyi/script/util/WorldToPdf.java     |  71 +++++++++
 .../controller/overdue/OverdueController.java |  25 +++
 .../javax.xml.transform.TransformerFactory    |   0
 .../src/main/resources/static/mriTemp.docx    | Bin 0 -> 22931 bytes
 ruoyi-common/pom.xml                          |  23 ++-
 .../com/ruoyi/common/annotation/Excel.java    |   7 +-
 .../com/ruoyi/common/utils/poi/ExcelUtil.java |  72 ++++-----
 .../ruoyi/framework/constants/Constants.java  |   4 +-
 18 files changed, 630 insertions(+), 49 deletions(-)
 create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/script/util/ConvertToMultipartFile.java
 create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/script/util/Word2PdfUtil.java
 create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/script/util/WordToPdfConverter.java
 create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/script/util/WordToPdfConverter2.java
 create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/script/util/WorldToPdf.java
 create mode 100644 ruoyi-admin/src/main/resources/META-INF/services/javax.xml.transform.TransformerFactory
 create mode 100644 ruoyi-admin/src/main/resources/static/mriTemp.docx

diff --git a/pom.xml b/pom.xml
index c4fc618..d7bf23c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,7 +28,7 @@
         <oshi.version>6.4.0</oshi.version>
         <commons.io.version>2.11.0</commons.io.version>
         <commons.collections.version>3.2.2</commons.collections.version>
-        <poi.version>4.1.2</poi.version>
+        <poi.version>5.2.0</poi.version>
         <velocity.version>2.3</velocity.version>
         <jwt.version>0.9.1</jwt.version>
         <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index e4cd4c5..f5db196 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -52,8 +52,23 @@
             <artifactId>jfreechart</artifactId>
             <version>1.5.3</version>
         </dependency>
+        <!-- https://mvnrepository.com/artifact/org.docx4j/docx4j-core -->
+        <dependency>
+            <groupId>aspose</groupId>
+            <artifactId>aspose-words</artifactId>
+            <version>15.8.0-jdk16</version>
+        </dependency>
+        <dependency>
+            <groupId>aspose</groupId>
+            <artifactId>aspose-slides</artifactId>
+            <version>19.3</version>
+        </dependency>
 
-
+        <dependency>
+            <groupId>com.deepoove</groupId>
+            <artifactId>poi-tl</artifactId>
+            <version>1.12.2</version>
+        </dependency>
         <dependency>
             <groupId>com.itextpdf</groupId>
             <artifactId>itextpdf</artifactId>
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/script/controller/PatientScriptController.java b/ruoyi-admin/src/main/java/com/ruoyi/script/controller/PatientScriptController.java
index 101969e..ca4366b 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/script/controller/PatientScriptController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/script/controller/PatientScriptController.java
@@ -83,7 +83,7 @@ public class PatientScriptController  extends BaseController {
      */
     @PostMapping("/exportReport")
     public void exportReport(HttpServletResponse response, @RequestParam("id") Long reportId) throws Exception {
-        this.patientScriptService.exportReport(response,reportId);
+        this.patientScriptService.exportReportTest(response,reportId);
     }
 
     @PostMapping("/test")
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/script/entity/PatientScript.java b/ruoyi-admin/src/main/java/com/ruoyi/script/entity/PatientScript.java
index 2005570..527ac44 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/script/entity/PatientScript.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/script/entity/PatientScript.java
@@ -72,6 +72,9 @@ public class PatientScript extends BaseEntity {
     private String shDoctor;
     //0否1是
     private String isAll;
+    private String kydw;
+    private String fzr;
+    private String phone;
 
     }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/script/service/PatientScriptService.java b/ruoyi-admin/src/main/java/com/ruoyi/script/service/PatientScriptService.java
index 9bf9856..923ba53 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/script/service/PatientScriptService.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/script/service/PatientScriptService.java
@@ -20,6 +20,9 @@ public interface PatientScriptService {
 
     Boolean removeByIds(List<Long> idList);
     void exportReport(HttpServletResponse response, Long reportId) throws Exception;
+    void exportReportTest(HttpServletResponse response, Long reportId) throws Exception;
+
+
     void exportReport2(HttpServletResponse response, Long reportId) throws Exception;
 
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/script/service/impl/PatientScriptServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/script/service/impl/PatientScriptServiceImpl.java
index 189eb31..c112534 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/script/service/impl/PatientScriptServiceImpl.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/script/service/impl/PatientScriptServiceImpl.java
@@ -1,6 +1,8 @@
 package com.ruoyi.script.service.impl;
 
 import cn.hutool.core.date.DateUtil;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.data.Pictures;
 import com.itextpdf.text.*;
 import com.itextpdf.text.pdf.BaseFont;
 import com.itextpdf.text.pdf.PdfChunk;
@@ -11,6 +13,9 @@ import com.ruoyi.script.entity.PatientScript;
 import com.ruoyi.script.mapper.PatientScriptMapper;
 import com.ruoyi.script.service.PatientScriptService;
 import com.ruoyi.script.util.ShellUtil;
+import com.ruoyi.script.util.Word2PdfUtil;
+import com.ruoyi.script.util.WordToPdfConverter;
+import com.ruoyi.script.util.WorldToPdf;
 import lombok.SneakyThrows;
 import org.apache.commons.compress.archivers.ArchiveEntry;
 import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
@@ -20,12 +25,17 @@ import org.apache.commons.compress.utils.IOUtils;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.RandomUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.apache.poi.xwpf.usermodel.XWPFParagraph;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
+import java.nio.channels.FileChannel;
+import java.nio.channels.FileLock;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.nio.file.StandardCopyOption;
@@ -34,6 +44,8 @@ import java.util.List;
 import java.util.concurrent.Executor;
 
 import static com.ruoyi.script.util.ShellUtil.shUtil;
+import static com.ruoyi.script.util.WordToPdfConverter.convertToPdf;
+import static com.ruoyi.script.util.WordToPdfConverter.replacePlaceholders;
 import static com.ruoyi.script.util.YmlUtil.createFile;
 import static com.ruoyi.system.util.pdfUtil.PdfUtil.chineseFont;
 import static com.ruoyi.system.util.pdfUtil.PdfUtil.getImageFromInputStream;
@@ -927,6 +939,142 @@ public class PatientScriptServiceImpl implements PatientScriptService {
 
     }
 
+    @Override
+    public void exportReportTest(HttpServletResponse response, Long reportId) throws Exception {
+        PatientScript patientScript = scriptMapper.getById(reportId);
+        if (null==patientScript.getStatus()||patientScript.getStatus().equals("生成中")){
+            return;
+        }
+
+        String resInfo = patientScript.getResInfo();
+        String[] brainList ={};
+        //分类信息
+        Map<String,Integer>  classMap = new HashMap<>();
+        String[] correlationList ={};
+        List<String> msgList = new ArrayList<>();
+        if (resInfo.contains("brain_regions:")){
+            String[] split = resInfo.split("', '");
+            String replace = split[0].replace("('brain_regions:", "");
+            brainList = replace.split(",");
+        }
+        if (resInfo.contains("correlation:")){
+            String[] split = resInfo.split("', '");
+            String replace = split[1].replace("correlation:", "").replace("')","");
+            correlationList = replace.split(",");
+
+        }
+        for (String key : brainList) {
+            key = key.replaceAll(" ","");
+            try {
+                MriInfo mriInfo = scriptMapper.getMriInfo(key.trim());
+                if(StringUtils.isNotEmpty(mriInfo.getBrainInfo())){
+                    if (classMap.containsKey(mriInfo.getBrainStr())){
+                        classMap.put(mriInfo.getBrainStr(),classMap.get(mriInfo.getBrainInfo())+1);
+
+                    }else {
+                        classMap.put(mriInfo.getBrainStr(),1);
+                        msgList.add(mriInfo.getValue());
+                    }
+                }
+
+            }catch (Exception e){
+
+            }
+
+        }
+
+        // Word 模板路径
+        String wordTemplatePath = "/opt/mriTemp.docx";
+        //随机十个生成的文件名称数组
+        String[] fileNames =
+                {"output1.docx", "output2.docx", "output3.docx", "output4.docx", "output5.docx", "output6.docx", "output7.docx", "output8.docx", "output9.docx", "output10.docx"};
+        //随机一个名字
+        String fileName = fileNames[new Random().nextInt(fileNames.length)];
+        String outPath = "/opt/"+fileName;
+
+
+        // 占位符和实际值的映射
+        Map<String, Object> placeholders = new HashMap<>();
+        placeholders.put("patientName", patientScript.getPatientName());
+        placeholders.put("patientSex", patientScript.getPatientSex());
+        placeholders.put("patientAge", patientScript.getPatientSex());
+
+        placeholders.put("patientCard", patientScript.getPatientCard());
+        placeholders.put("blOrder", patientScript.getBlOrder());
+        placeholders.put("scanPosition", patientScript.getScanPosition());
+
+        placeholders.put("scanDoctor", patientScript.getScanDoctor());
+        placeholders.put("scanTime", DateUtil.format(patientScript.getScanTime(),"yyyy年MM月dd日"));
+        // 图片文件
+        placeholders.put("image1", Pictures.ofLocal(patientScript.getResImage()).size(260, 260).create());
+        // 图片文件
+        placeholders.put("image2", Pictures.ofLocal(patientScript.getResImage().replace("Net","Net2")).size(260, 260).create());
+        // 图片文件
+        placeholders.put("image3", Pictures.ofLocal(patientScript.getResImage().replace("Net","Net3")).size(260, 260).create());
+        // 图片文件
+        placeholders.put("image4", Pictures.ofLocal(patientScript.getResImage().replace("Net","Net4")).size(260, 260).create());
+
+        placeholders.put("kydw", Optional.ofNullable(patientScript.getKydw()).orElse("          "));
+        placeholders.put("fzr", Optional.ofNullable(patientScript.getFzr()).orElse("          "));
+        placeholders.put("phone", Optional.ofNullable(patientScript.getPhone()).orElse("          "));
+        String brainInfo = "";
+        for (int i = 0; i < brainList.length; i++) {
+            if (i==brainList.length-1){
+                brainInfo= brainInfo+brainList[i];
+            }else {
+                brainInfo= brainInfo+brainList[i]+"\n";
+            }
+        }
+
+        placeholders.put("brainInfo",brainInfo);
+
+        String joinInfo = "";
+        for (int i = 0; i < correlationList.length; i++) {
+            if (i==correlationList.length-1){
+                joinInfo= joinInfo+correlationList[i];
+            }else {
+                joinInfo= joinInfo+correlationList[i]+"\n";
+            }
+        }
+        placeholders.put("joinInfo",joinInfo);
+        final String[] diagInfo = {""};
+        classMap.forEach((item, index)->{
+            diagInfo[0] =    diagInfo[0] +index+"个属于"+item+",";
+        });
+        int idx = diagInfo[0].lastIndexOf(",");
+        diagInfo[0] = diagInfo[0].substring(0,idx);
+        diagInfo[0]=diagInfo[0]+"。"+"\n";
+        for (int i = 0; i < msgList.size(); i++) {
+            if (i==msgList.size()-1){
+                diagInfo[0]= diagInfo[0]+"    "+msgList.get(i);
+            }else {
+                diagInfo[0]= diagInfo[0]+"    "+msgList.get(i)+"\n";
+            }
+        }
+        placeholders.put("diagInfo", "    异常脑区中,"+diagInfo[0]);
+        placeholders.put("resInfo", patientScript.getResInfo().equals("异常")?"孤独症谱系障碍":"正常发育个体");
+
+        placeholders.put("zdDoctor", patientScript.getZdDoctor());
+        placeholders.put("shDoctor", patientScript.getShDoctor());
+        try {
+
+                // 文件操作
+                XWPFTemplate template = XWPFTemplate.compile(new File(wordTemplatePath)).render(
+                        placeholders);
+                template.writeAndClose(Files.newOutputStream(Paths.get(outPath)));
+            try {
+                Word2PdfUtil.wordConvertPdfFile(outPath,response.getOutputStream());
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+        } catch (IOException e ) {
+            e.printStackTrace();
+        }
+    }
+
+
+
     /**
      * 生成六位随机数字
      */
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/script/util/ConvertToMultipartFile.java b/ruoyi-admin/src/main/java/com/ruoyi/script/util/ConvertToMultipartFile.java
new file mode 100644
index 0000000..b54c432
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/script/util/ConvertToMultipartFile.java
@@ -0,0 +1,64 @@
+package com.ruoyi.script.util;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+
+public class ConvertToMultipartFile implements MultipartFile {
+    private byte[] fileBytes;
+    String name;
+    String originalFilename;
+    String contentType;
+    boolean isEmpty;
+    long size;
+
+    public ConvertToMultipartFile(byte[] fileBytes, String name, String originalFilename, String contentType,
+                                  long size) {
+        this.fileBytes = fileBytes;
+        this.name = name;
+        this.originalFilename = originalFilename;
+        this.contentType = contentType;
+        this.size = size;
+        this.isEmpty = false;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public String getOriginalFilename() {
+        return originalFilename;
+    }
+
+    @Override
+    public String getContentType() {
+        return contentType;
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return isEmpty;
+    }
+
+    @Override
+    public long getSize() {
+        return size;
+    }
+
+    @Override
+    public byte[] getBytes() throws IOException {
+        return fileBytes;
+    }
+
+    @Override
+    public InputStream getInputStream() throws IOException {
+        return new ByteArrayInputStream(fileBytes);
+    }
+
+    @Override
+    public void transferTo(File dest) throws IOException, IllegalStateException {
+        new FileOutputStream(dest).write(fileBytes);
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/script/util/Word2PdfUtil.java b/ruoyi-admin/src/main/java/com/ruoyi/script/util/Word2PdfUtil.java
new file mode 100644
index 0000000..66af859
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/script/util/Word2PdfUtil.java
@@ -0,0 +1,108 @@
+package com.ruoyi.script.util;
+
+import com.aspose.words.Document;
+import com.aspose.words.License;
+import com.aspose.words.SaveFormat;
+
+import java.io.*;
+
+/**
+ * word转pdf工具类
+ *
+ * @author shmily
+ */
+public class Word2PdfUtil {
+
+    /**
+     * 许可证字符串(可以放到resource下的xml文件中也可)
+     */
+    private static final String LICENSE = "<License>" +
+            "<Data>" +
+            "<Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products>" +
+            "<EditionType>Enterprise</EditionType>" +
+            "<SubscriptionExpiry>20991231</SubscriptionExpiry>" +
+            "<LicenseExpiry>20991231</LicenseExpiry>" +
+            "<SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>" +
+            "</Data>" +
+            "<Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>" +
+            "</License>";
+
+
+    /**
+     * 设置 license 去除水印
+     */
+    private static void setLicense() {
+        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(LICENSE.getBytes());
+        License license = new License();
+        try {
+            license.setLicense(byteArrayInputStream);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * word 转 pdf 生成至指定路径,pdf为空则上传至word同级目录
+     *
+     * @param wordPath word文件路径
+     * @param pdfPath  pdf文件路径
+     */
+    public static void wordConvertPdfFile(String wordPath, OutputStream outputStream) {
+        try {
+            setLicense();
+            Document doc = new Document(wordPath);
+            doc.save(outputStream, SaveFormat.PDF);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    /**
+     * word 转 pdf 生成byte字节流
+     *
+     * @param wordPath word所在的目录地址
+     * @return
+     */
+    public static byte[] wordConvertPdfByte(String wordPath) {
+        ByteArrayOutputStream fileOutputStream = null;
+        try {
+            setLicense();
+            fileOutputStream = new ByteArrayOutputStream();
+            Document doc = new Document(wordPath);
+            doc.save(fileOutputStream, SaveFormat.PDF);
+            return fileOutputStream.toByteArray();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                assert fileOutputStream != null;
+                fileOutputStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+
+        }
+        return null;
+    }
+
+
+
+    /**
+     * 获取 生成的 pdf 文件路径,默认与源文件同一目录
+     *
+     * @param wordPath word文件
+     * @return 生成的 pdf 文件
+     */
+    private static String getPdfFilePath(String wordPath) {
+        int lastIndexOfPoint = wordPath.lastIndexOf(".");
+        String pdfFilePath = "";
+        if (lastIndexOfPoint > -1) {
+            pdfFilePath = wordPath.substring(0, lastIndexOfPoint);
+        }
+        return pdfFilePath + ".pdf";
+    }
+
+}
+
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/script/util/WordToPdfConverter.java b/ruoyi-admin/src/main/java/com/ruoyi/script/util/WordToPdfConverter.java
new file mode 100644
index 0000000..1c81249
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/script/util/WordToPdfConverter.java
@@ -0,0 +1,91 @@
+package com.ruoyi.script.util;
+
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.apache.poi.xwpf.usermodel.XWPFParagraph;
+import org.apache.poi.xwpf.usermodel.XWPFRun;
+
+import com.itextpdf.text.Document;
+import com.itextpdf.text.DocumentException;
+import com.itextpdf.text.Paragraph;
+import com.itextpdf.text.pdf.PdfWriter;
+
+import javax.servlet.ServletOutputStream;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class WordToPdfConverter {
+
+    public static void main(String[] args) {
+//        // Word 模板路径
+//        String wordTemplatePath = "template.docx";
+//        // 输出 PDF 路径
+//        String pdfOutputPath = "output.pdf";
+//
+//        // 占位符和实际值的映射
+//        Map<String, String> placeholders = new HashMap<>();
+//        placeholders.put("${name}", "John Doe");
+//        placeholders.put("${date}", "2023-10-15");
+//        placeholders.put("${description}", "This is a sample description.");
+//
+//        try {
+//            // 读取 Word 模板
+//            XWPFDocument document = new XWPFDocument(new FileInputStream(wordTemplatePath));
+//
+//            // 替换占位符
+//            replacePlaceholders(document, placeholders);
+//
+//            // 将内容写入 PDF
+////            convertToPdf(document, pdfOutputPath);
+//
+//            System.out.println("PDF generated successfully!");
+//
+//        } catch (IOException | DocumentException e) {
+//            e.printStackTrace();
+//        }
+    }
+
+    /**
+     * 替换 Word 文档中的占位符
+     */
+    public static void replacePlaceholders(XWPFDocument document, Map<String, String> placeholders) {
+        for (XWPFParagraph paragraph : document.getParagraphs()) {
+            List<XWPFRun> runs = paragraph.getRuns();
+            if (runs != null) {
+                for (XWPFRun run : runs) {
+                    String text = run.getText(0);
+                    if (text != null) {
+                        for (Map.Entry<String, String> entry : placeholders.entrySet()) {
+                            if (text.contains(entry.getKey())) {
+                                text = text.replace(entry.getKey(), entry.getValue());
+                                run.setText(text, 0);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 将 Word 文档内容写入 PDF
+     */
+    public static void convertToPdf(XWPFDocument document, ServletOutputStream servletOutputStream) throws DocumentException, IOException {
+        Document pdfDocument = new Document();
+        PdfWriter.getInstance(pdfDocument, servletOutputStream);
+        pdfDocument.open();
+
+        // 将 Word 文档的每一段内容写入 PDF
+        for (XWPFParagraph paragraph : document.getParagraphs()) {
+            String text = paragraph.getText();
+            if (text != null && !text.isEmpty()) {
+                pdfDocument.add(new Paragraph(text));
+            }
+        }
+
+        pdfDocument.close();
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/script/util/WordToPdfConverter2.java b/ruoyi-admin/src/main/java/com/ruoyi/script/util/WordToPdfConverter2.java
new file mode 100644
index 0000000..d86d9c7
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/script/util/WordToPdfConverter2.java
@@ -0,0 +1,39 @@
+package com.ruoyi.script.util;
+
+import lombok.var;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException;
+
+import java.io.InputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+public class WordToPdfConverter2 {
+
+    public static void main(String[] args) {
+        // 模板文件路径(相对于 resources 目录)
+        String templatePath = "static/mriTemp.docx";
+
+        try (InputStream inputStream = WordToPdfConverter.class.getClassLoader().getResourceAsStream(templatePath)) {
+            if (inputStream == null) {
+                System.err.println("模板文件未找到: " + templatePath);
+                return;
+            }
+
+            // 读取 Word 模板
+            XWPFDocument document = new XWPFDocument(inputStream);
+
+            // 打印文档内容(测试用)
+            for (var paragraph : document.getParagraphs()) {
+                System.out.println(paragraph.getText());
+            }
+
+            System.out.println("模板读取成功!");
+
+        } catch (NotOfficeXmlFileException e) {
+            System.err.println("文件格式不正确,请确保是 .docx 文件: " + e.getMessage());
+        } catch (IOException e) {
+            System.err.println("读取文件时发生错误: " + e.getMessage());
+        }
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/script/util/WorldToPdf.java b/ruoyi-admin/src/main/java/com/ruoyi/script/util/WorldToPdf.java
new file mode 100644
index 0000000..93a3435
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/script/util/WorldToPdf.java
@@ -0,0 +1,71 @@
+package com.ruoyi.script.util;
+
+import com.deepoove.poi.XWPFTemplate;
+import com.documents4j.api.DocumentType;
+import com.documents4j.api.IConverter;
+import com.documents4j.job.LocalConverter;
+
+
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Map;
+
+public class WorldToPdf {
+
+    /**
+     * 在Word模版中写入指定内容
+     * @param filePath      模版文件地址
+     * @param targetPath    生成文件的目标地址
+     * @param map           填充内容
+     * @throws IOException
+     */
+    public static void writForTemplate(String filePath, String targetPath, Map<String,Object> map) throws IOException {
+
+        XWPFTemplate template = XWPFTemplate.compile(filePath).render(map);
+
+        template.writeAndClose(Files.newOutputStream(Paths.get(targetPath)));
+    }
+
+    /**
+     *
+     * @param wordPath          word 文件路径
+     * @param pdfPath           pdf 输出路径
+     * @throws IOException
+     */
+    public static void wordConvertPdf(String wordPath, OutputStream outputStream) throws IOException {
+        try {
+//            // Load the Word document
+//            WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File(wordPath));
+//
+//
+//            Docx4J.toPDF(wordMLPackage, outputStream);
+//
+//            System.out.println("Word document converted to PDF successfully.");
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     *
+     * @param wordPath          word 文件路径
+     * @param pdfPath           pdf 输出路径
+     * @throws IOException
+     */
+    public static void wordConvertPdfs(String wordPath, String pdfPath) throws IOException {
+        InputStream wordInputStream = Files.newInputStream(Paths.get(wordPath));
+        // 转成 pdf
+        OutputStream outputStream = Files.newOutputStream(Paths.get(pdfPath));
+        IConverter converter = LocalConverter.builder().build();
+        converter.convert(wordInputStream).as(DocumentType.DOCX).to(outputStream).as(DocumentType.PDF).execute();
+        converter.shutDown();
+    }
+
+    // 文件转换
+
+    // 文件转换
+
+
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/overdue/OverdueController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/overdue/OverdueController.java
index e2c9b48..c32353d 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/overdue/OverdueController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/overdue/OverdueController.java
@@ -13,8 +13,11 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
 import java.io.FileWriter;
 import java.text.SimpleDateFormat;
+import java.util.Base64;
 import java.util.Date;
 
 /**
@@ -61,4 +64,26 @@ public class OverdueController {
         }
         return R.ok("激活成功");
     }
+
+
+
+    // 加密算法
+    private static final String ALGORITHM = "AES";
+    // 常量密钥
+    private static final String SECRET_KEY = "jinanshandongdianliangxinxijishu";
+
+    public static void main(String[] args) throws Exception {
+        String data = "山东点亮20250311175500信息技术";
+        SecretKeySpec keySpec = generateKey();
+        Cipher cipher = Cipher.getInstance(ALGORITHM);
+        cipher.init(Cipher.ENCRYPT_MODE, keySpec);
+        byte[] encryptedBytes = cipher.doFinal(data.getBytes());
+        System.err.println(Base64.getEncoder().encodeToString(encryptedBytes));
+    }
+
+    // 生成密钥
+    private static SecretKeySpec generateKey() throws Exception {
+        byte[] keyBytes = SECRET_KEY.getBytes();
+        return new SecretKeySpec(keyBytes, ALGORITHM);
+    }
 }
diff --git a/ruoyi-admin/src/main/resources/META-INF/services/javax.xml.transform.TransformerFactory b/ruoyi-admin/src/main/resources/META-INF/services/javax.xml.transform.TransformerFactory
new file mode 100644
index 0000000..e69de29
diff --git a/ruoyi-admin/src/main/resources/static/mriTemp.docx b/ruoyi-admin/src/main/resources/static/mriTemp.docx
new file mode 100644
index 0000000000000000000000000000000000000000..a7d4a668a8817ae1fb50e5c6598518c99592c08b
GIT binary patch
literal 22931
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

literal 0
HcmV?d00001

diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index da86223..0e66c10 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -52,13 +52,13 @@
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
         </dependency>
-  
+
         <!-- JSON工具类 -->
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>
         </dependency>
-        
+
         <!-- 动态数据源 -->
 		<dependency>
 			<groupId>com.baomidou</groupId>
@@ -83,7 +83,17 @@
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-ooxml</artifactId>
         </dependency>
-
+        <!-- word 转 pdf -->
+        <dependency>
+            <groupId>com.documents4j</groupId>
+            <artifactId>documents4j-local</artifactId>
+            <version>1.0.3</version>
+        </dependency>
+        <dependency>
+            <groupId>com.documents4j</groupId>
+            <artifactId>documents4j-transformer-msoffice-word</artifactId>
+            <version>1.0.3</version>
+        </dependency>
         <!-- yml解析器 -->
         <dependency>
             <groupId>org.yaml</groupId>
@@ -133,5 +143,8 @@
         </dependency>
 
     </dependencies>
-
-</project>
\ No newline at end of file
+    <properties>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+    </properties>
+</project>
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java
index f7aaca5..7cd8d4f 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java
@@ -5,13 +5,14 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 import java.math.BigDecimal;
+
+import com.ruoyi.common.utils.poi.ExcelHandlerAdapter;
 import org.apache.poi.ss.usermodel.HorizontalAlignment;
 import org.apache.poi.ss.usermodel.IndexedColors;
-import com.ruoyi.common.utils.poi.ExcelHandlerAdapter;
 
 /**
  * 自定义导出Excel数据注解
- * 
+ *
  * @author ruoyi
  */
 @Retention(RetentionPolicy.RUNTIME)
@@ -184,4 +185,4 @@ public @interface Excel
             return this.value;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
index c6489e2..3937e06 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
@@ -87,7 +87,7 @@ import com.ruoyi.common.utils.reflect.ReflectUtils;
 
 /**
  * Excel相关处理
- * 
+ *
  * @author ruoyi
  */
 public class ExcelUtil<T>
@@ -279,7 +279,7 @@ public class ExcelUtil<T>
 
     /**
      * 对excel表单默认第一个索引名转换成list
-     * 
+     *
      * @param is 输入流
      * @return 转换后集合
      */
@@ -290,7 +290,7 @@ public class ExcelUtil<T>
 
     /**
      * 对excel表单默认第一个索引名转换成list
-     * 
+     *
      * @param is 输入流
      * @param titleNum 标题占用行数
      * @return 转换后集合
@@ -302,7 +302,7 @@ public class ExcelUtil<T>
 
     /**
      * 对excel表单指定表格索引名转换成list
-     * 
+     *
      * @param sheetName 表格索引名
      * @param titleNum 标题占用行数
      * @param is 输入流
@@ -482,7 +482,7 @@ public class ExcelUtil<T>
 
     /**
      * 对list数据源将其里面的数据导入到excel表单
-     * 
+     *
      * @param list 导出数据集合
      * @param sheetName 工作表的名称
      * @return 结果
@@ -494,7 +494,7 @@ public class ExcelUtil<T>
 
     /**
      * 对list数据源将其里面的数据导入到excel表单
-     * 
+     *
      * @param list 导出数据集合
      * @param sheetName 工作表的名称
      * @param title 标题
@@ -508,7 +508,7 @@ public class ExcelUtil<T>
 
     /**
      * 对list数据源将其里面的数据导入到excel表单
-     * 
+     *
      * @param response 返回数据
      * @param list 导出数据集合
      * @param sheetName 工作表的名称
@@ -521,7 +521,7 @@ public class ExcelUtil<T>
 
     /**
      * 对list数据源将其里面的数据导入到excel表单
-     * 
+     *
      * @param response 返回数据
      * @param list 导出数据集合
      * @param sheetName 工作表的名称
@@ -538,7 +538,7 @@ public class ExcelUtil<T>
 
     /**
      * 对list数据源将其里面的数据导入到excel表单
-     * 
+     *
      * @param sheetName 工作表的名称
      * @return 结果
      */
@@ -549,7 +549,7 @@ public class ExcelUtil<T>
 
     /**
      * 对list数据源将其里面的数据导入到excel表单
-     * 
+     *
      * @param sheetName 工作表的名称
      * @param title 标题
      * @return 结果
@@ -562,7 +562,7 @@ public class ExcelUtil<T>
 
     /**
      * 对list数据源将其里面的数据导入到excel表单
-     * 
+     *
      * @param sheetName 工作表的名称
      * @return 结果
      */
@@ -573,7 +573,7 @@ public class ExcelUtil<T>
 
     /**
      * 对list数据源将其里面的数据导入到excel表单
-     * 
+     *
      * @param sheetName 工作表的名称
      * @param title 标题
      * @return 结果
@@ -588,7 +588,7 @@ public class ExcelUtil<T>
 
     /**
      * 对list数据源将其里面的数据导入到excel表单
-     * 
+     *
      * @return 结果
      */
     public void exportExcel(HttpServletResponse response)
@@ -610,7 +610,7 @@ public class ExcelUtil<T>
 
     /**
      * 对list数据源将其里面的数据导入到excel表单
-     * 
+     *
      * @return 结果
      */
     public AjaxResult exportExcel()
@@ -678,7 +678,7 @@ public class ExcelUtil<T>
 
     /**
      * 填充excel数据
-     * 
+     *
      * @param index 序号
      * @param row 单元格行
      */
@@ -749,7 +749,7 @@ public class ExcelUtil<T>
 
     /**
      * 创建表格样式
-     * 
+     *
      * @param wb 工作薄对象
      * @return 样式列表
      */
@@ -802,7 +802,7 @@ public class ExcelUtil<T>
 
     /**
      * 根据Excel注解创建表格头样式
-     * 
+     *
      * @param wb 工作薄对象
      * @return 自定义样式列表
      */
@@ -835,7 +835,7 @@ public class ExcelUtil<T>
 
     /**
      * 根据Excel注解创建表格列样式
-     * 
+     *
      * @param wb 工作薄对象
      * @return 自定义样式列表
      */
@@ -897,7 +897,7 @@ public class ExcelUtil<T>
 
     /**
      * 设置单元格信息
-     * 
+     *
      * @param value 单元格值
      * @param attr 注解相关
      * @param cell 单元格信息
@@ -1061,7 +1061,7 @@ public class ExcelUtil<T>
 
     /**
      * 设置 POI XSSFSheet 单元格提示或选择框
-     * 
+     *
      * @param sheet 表单
      * @param textlist 下拉框显示的内容
      * @param promptContent 提示内容
@@ -1098,7 +1098,7 @@ public class ExcelUtil<T>
 
     /**
      * 设置某些列的值只能输入预制的数据,显示下拉框(兼容超出一定数量的下拉框).
-     * 
+     *
      * @param sheet 要设置的sheet.
      * @param textlist 下拉框显示的内容
      * @param promptContent 提示内容
@@ -1150,7 +1150,7 @@ public class ExcelUtil<T>
 
     /**
      * 解析导出值 0=男,1=女,2=未知
-     * 
+     *
      * @param propertyValue 参数值
      * @param converterExp 翻译注解
      * @param separator 分隔符
@@ -1187,7 +1187,7 @@ public class ExcelUtil<T>
 
     /**
      * 反向解析值 男=0,女=1,未知=2
-     * 
+     *
      * @param propertyValue 参数值
      * @param converterExp 翻译注解
      * @param separator 分隔符
@@ -1224,7 +1224,7 @@ public class ExcelUtil<T>
 
     /**
      * 解析字典值
-     * 
+     *
      * @param dictValue 字典值
      * @param dictType 字典类型
      * @param separator 分隔符
@@ -1237,7 +1237,7 @@ public class ExcelUtil<T>
 
     /**
      * 反向解析值字典值
-     * 
+     *
      * @param dictLabel 字典标签
      * @param dictType 字典类型
      * @param separator 分隔符
@@ -1250,7 +1250,7 @@ public class ExcelUtil<T>
 
     /**
      * 数据处理器
-     * 
+     *
      * @param value 数据值
      * @param excel 数据注解
      * @return
@@ -1327,7 +1327,7 @@ public class ExcelUtil<T>
 
     /**
      * 获取下载路径
-     * 
+     *
      * @param filename 文件名称
      */
     public String getAbsoluteFile(String filename)
@@ -1343,7 +1343,7 @@ public class ExcelUtil<T>
 
     /**
      * 获取bean中的属性值
-     * 
+     *
      * @param vo 实体对象
      * @param field 字段
      * @param excel 注解
@@ -1374,7 +1374,7 @@ public class ExcelUtil<T>
 
     /**
      * 以类的属性的get方法方法形式获取值
-     * 
+     *
      * @param o
      * @param name
      * @return value
@@ -1480,7 +1480,7 @@ public class ExcelUtil<T>
 
     /**
      * 创建工作表
-     * 
+     *
      * @param sheetNo sheet数量
      * @param index 序号
      */
@@ -1497,7 +1497,7 @@ public class ExcelUtil<T>
 
     /**
      * 获取单元格值
-     * 
+     *
      * @param row 获取的行
      * @param column 获取单元格列号
      * @return 单元格值
@@ -1557,7 +1557,7 @@ public class ExcelUtil<T>
 
     /**
      * 判断是否是空行
-     * 
+     *
      * @param row 判断的行
      * @return
      */
@@ -1634,8 +1634,8 @@ public class ExcelUtil<T>
                         XSSFPicture pic = (XSSFPicture) shape;
                         XSSFClientAnchor anchor = pic.getPreferredSize();
                         CTMarker ctMarker = anchor.getFrom();
-                        String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol();
-                        sheetIndexPicMap.put(picIndex, pic.getPictureData());
+//                        String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol();
+//                        sheetIndexPicMap.put(picIndex, pic.getPictureData());
                     }
                 }
             }
@@ -1645,7 +1645,7 @@ public class ExcelUtil<T>
 
     /**
      * 格式化不同类型的日期对象
-     * 
+     *
      * @param dateFormat 日期格式
      * @param val 被格式化的日期对象
      * @return 格式化后的日期字符
@@ -1711,7 +1711,7 @@ public class ExcelUtil<T>
 
     /**
      * 获取对象的子列表方法
-     * 
+     *
      * @param name 名称
      * @param pojoClass 类对象
      * @return 子列表方法
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/constants/Constants.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/constants/Constants.java
index fe4bbc7..f6e05ed 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/constants/Constants.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/constants/Constants.java
@@ -6,5 +6,5 @@ public interface Constants {
     // 常量密钥
     String SECRET_KEY = "jinanshandongdianliangxinxijishu";
     //密钥存储文件地址
-    String KEY_FILE_PATH = "E:/overdue.txt";
-}
\ No newline at end of file
+    String KEY_FILE_PATH = "D:/overdue.txt";
+}