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"; +}