From 9e42d8ba45c7b31d43ca95e3d4b4672a735efc9c Mon Sep 17 00:00:00 2001 From: zhc077 <565291854@qq.com> Date: Fri, 22 Nov 2024 15:35:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3=E7=94=9F=E6=88=90=E5=90=88?= =?UTF-8?q?=E5=B9=B6=2011.22?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jeecg-boot/jeecg-module-demo/pom.xml | 12 ++ .../service/impl/Project4WordServiceImpl.java | 58 ++++-- .../jeecg/modules/demo/utils/FileUtils.java | 189 ++++++++++++++++++ .../jeecg-system-start/pom.xml | 7 +- .../modules/word/WordExportUtil_test.java | 56 +++++- 5 files changed, 303 insertions(+), 19 deletions(-) create mode 100644 jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/utils/FileUtils.java diff --git a/jeecg-boot/jeecg-module-demo/pom.xml b/jeecg-boot/jeecg-module-demo/pom.xml index 424cb05..77b64c5 100644 --- a/jeecg-boot/jeecg-module-demo/pom.xml +++ b/jeecg-boot/jeecg-module-demo/pom.xml @@ -37,6 +37,18 @@ easypoi-annotation 4.3.0 + + org.docx4j + docx4j-export-fo + 6.1.0 + + + + org.slf4j + slf4j-log4j12 + + + diff --git a/jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/project/service/impl/Project4WordServiceImpl.java b/jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/project/service/impl/Project4WordServiceImpl.java index ba2d756..ccc0d20 100644 --- a/jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/project/service/impl/Project4WordServiceImpl.java +++ b/jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/project/service/impl/Project4WordServiceImpl.java @@ -24,6 +24,7 @@ import org.jeecg.modules.demo.projectType.entity.ProjectType; import org.jeecg.modules.demo.projectType.service.IProjectTypeService; import org.jeecg.modules.demo.userext.entity.UserExt; import org.jeecg.modules.demo.userext.service.IUserExtService; +import org.jeecg.modules.demo.utils.FileUtils; import org.jeecg.modules.system.entity.SysDepart; import org.jeecg.modules.system.entity.SysUser; import org.jeecg.modules.system.service.ISysDepartService; @@ -34,6 +35,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.ResourceLoader; import org.springframework.stereotype.Service; +import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; import java.io.File; @@ -251,31 +253,61 @@ public class Project4WordServiceImpl extends ServiceImpl ProjectDto dto = getData4Xiangmushu(obj); Map map = BeanUtil.beanToMap(dto); System.out.println("map = " + JSON.toJSONString(map)); + File file = new File(model4wordPath + File.separator); + String basePath = file.getPath() + File.separator; +// String modelFilePath = basePath + "baseInfoModel.docx"; +// String modelFilePath = basePath + "model2v.doc"; + String modelFilePath = "C:\\Users\\YX\\Documents\\model3v.docx"; + log.info("the baseInfoModel path:{}", modelFilePath); + String mergeWordFileName = dto.getProjectName() + ".docx"; + File outDir = new File(basePath + "out"); + if (!outDir.exists()) { + outDir.mkdirs(); + } try { - File file = new File(model4wordPath + File.separator); - String basePath = file.getPath() + File.separator; - String modelFilePath = basePath + "baseInfoModel.doc"; - log.info("the baseInfoModel path:{}", modelFilePath); //1 生成文件 XWPFDocument doc = WordExportUtil.exportWord07(modelFilePath, map); List wordList = new ArrayList<>(); wordList.add(doc); - FileInputStream fis = new FileInputStream("C:\\Users\\YX\\Desktop\\testword\\xiangmushu\\正文V15.docx"); + FileInputStream fis = new FileInputStream(basePath + "正文.docx"); wordList.add(new XWPFDocument(fis)); - // 2.把集合里面的word文档全部合并在一个文档 - XWPFDocument mergeWord = WordUtils.mergeWord(wordList); - File outDir = new File(basePath+"out"); - if (!outDir.exists()) { - outDir.mkdirs(); - } - FileOutputStream fos = new FileOutputStream(new File(outDir, "mergework1122.docx")); + XWPFDocument mergeWordObj = WordUtils.mergeWord(wordList); +// String mergeWordFileName = "mergework1122v3.docx"; + FileOutputStream fos = new FileOutputStream(new File(outDir, mergeWordFileName)); // FileOutputStream fos2 = new FileOutputStream("C:\\Users\\YX\\Desktop\\testword\\xiangmushu\\test1121v7.docx"); - mergeWord.write(fos); + mergeWordObj.write(fos); fos.close(); } catch (Exception e) { e.printStackTrace(); } + + try { + String pdfName = dto.getProjectName()+".pdf"; +// createPdf(outDir + File.separator + mergeWordFileName, outDir, pdfName); +// createPdf(outDir + File.separator + "2025黄淮学院工程技术研究中心1121.docx", outDir, pdfName); + } catch (Exception e2) { + e2.printStackTrace(); + } return dto; } + + public Object createPdf(String wordPath, File file, String padFileName){ + String pdfFileName = "convertDocx2Pdf.pdf"; + String downloadFile = "pdf导出.pdf"; +// HttpServletResponse response = getResponse(); + if (wordPath.equals("")) { + log.info("word文件路径不能为空!"); + Assert.notNull(wordPath, "word路径不能为空"); + } else { + +// FileUtils.convertDocx2Pdf(wordPath, file + File.separator + padFileName); + try { + FileUtils.convertDocxToPdf(wordPath, file + File.separator + padFileName); + } catch (Exception e) { + e.printStackTrace(); + } + } + return null; + } } diff --git a/jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/utils/FileUtils.java b/jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/utils/FileUtils.java new file mode 100644 index 0000000..ac55a85 --- /dev/null +++ b/jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/utils/FileUtils.java @@ -0,0 +1,189 @@ +package org.jeecg.modules.demo.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import com.aliyuncs.utils.IOUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.docx4j.Docx4J; +import org.docx4j.convert.out.FOSettings; +import org.docx4j.fonts.IdentityPlusMapper; +import org.docx4j.fonts.Mapper; +import org.docx4j.fonts.PhysicalFonts; +import org.docx4j.openpackaging.packages.WordprocessingMLPackage; +import org.springframework.util.Assert; + +import java.io.*; +import java.util.Map; + +/** + * @description: + * @param: + * @return: + * @author: z.h.c + * @date: 24/11/22 10:17 + */ +public class FileUtils { + /** + * + * @param templatePath + * @param saveDir + * @param fileName + * @param params + * @return + */ + public static String exportWord(String templatePath, String saveDir, String fileName, Map params) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(saveDir, "临时文件路径不能为空"); + Assert.notNull(fileName, "导出文件名不能为空"); + Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!saveDir.endsWith("/")) { + saveDir = saveDir + File.separator; + } + + File dir = new File(saveDir); + if (!dir.exists()) { + dir.mkdirs(); + } + String savePath = saveDir + fileName; + + try { + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + FileOutputStream fos = new FileOutputStream(savePath); + doc.write(fos); + fos.flush(); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return savePath; + } + + + + /** + * @param wordPath word文件路径 + * @param pdfPath pdf输出路径 + * @return + */ + public static String convertDocx2Pdf(String wordPath, String pdfPath) { + OutputStream os = null; + InputStream is = null; + if (pdfPath.endsWith("/")) { + pdfPath = pdfPath + File.separator; + } + try { + is = new FileInputStream(new File(wordPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(is); + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + mlPackage.setFontMapper(fontMapper); + + os = new FileOutputStream(pdfPath); + + //docx4j docx转pdf + FOSettings foSettings = Docx4J.createFOSettings(); + foSettings.setWmlPackage(mlPackage); + Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL); + + is.close();//关闭输入流 + os.close();//关闭输出流 + + return ""; + } catch (Exception e) { + e.printStackTrace(); + try { + if (is != null) { + is.close(); + } + if (os != null) { + os.close(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } finally { + File file = new File(wordPath); + if (file != null && file.isFile() && file.exists()) { + file.delete(); + } + } + return ""; + } + + /** + * docx文档转换为PDF + * + * @param pdfPath PDF文档存储路径 + * @throws Exception 可能为Docx4JException, FileNotFoundException, IOException等 + */ + public static void convertDocxToPdf(String docxPath, String pdfPath) throws Exception { + + FileOutputStream fileOutputStream = null; + try { + File file = new File(docxPath); + fileOutputStream = new FileOutputStream(new File(pdfPath)); + WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(file); + setFontMapper(mlPackage); + Docx4J.toPDF(mlPackage, new FileOutputStream(new File(pdfPath))); + }catch (Exception e){ + e.printStackTrace(); +// log.error("docx文档转换为PDF失败"); + }finally { + IOUtils.closeQuietly(fileOutputStream); + } + } + + private static void setFontMapper(WordprocessingMLPackage mlPackage) throws Exception { + Mapper fontMapper = new IdentityPlusMapper(); + fontMapper.put("隶书", PhysicalFonts.get("LiSu")); + fontMapper.put("宋体", PhysicalFonts.get("SimSun")); + fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei")); + fontMapper.put("黑体", PhysicalFonts.get("SimHei")); + fontMapper.put("楷体", PhysicalFonts.get("KaiTi")); + fontMapper.put("新宋体", PhysicalFonts.get("NSimSun")); + fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai")); + fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong")); + fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB")); + fontMapper.put("仿宋", PhysicalFonts.get("FangSong")); + fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312")); + fontMapper.put("幼圆", PhysicalFonts.get("YouYuan")); + fontMapper.put("华文宋体", PhysicalFonts.get("STSong")); + fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong")); + + mlPackage.setFontMapper(fontMapper); + } + + + /** + * @param path 图片路径 + * @return + * @throws IOException + */ + public static byte[] getImageBase64(String path) throws IOException { + InputStream input = new FileInputStream(path); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while ((numBytesRead = input.read(buf)) != -1) { + output.write(buf, 0, numBytesRead); + } + byte[] data = output.toByteArray(); + output.close(); + input.close(); + return data; + } + +} + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/pom.xml b/jeecg-boot/jeecg-module-system/jeecg-system-start/pom.xml index 9ec4f87..229efb2 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/pom.xml +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/pom.xml @@ -26,7 +26,7 @@ - + diff --git a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/word/WordExportUtil_test.java b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/word/WordExportUtil_test.java index 34b88aa..4b40998 100644 --- a/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/word/WordExportUtil_test.java +++ b/jeecg-boot/jeecg-module-system/jeecg-system-start/src/test/java/org/jeecg/modules/word/WordExportUtil_test.java @@ -1,5 +1,7 @@ package org.jeecg.modules.word; +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.word.WordExportUtil; import cn.hutool.core.bean.BeanUtil; import com.alibaba.fastjson.JSON; import org.apache.poi.openxml4j.opc.OPCPackage; @@ -9,22 +11,25 @@ import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFPictureData; import org.apache.xmlbeans.XmlOptions; import org.jeecg.JeecgSystemApplication; +import org.jeecg.common.util.WordUtils; import org.jeecg.modules.demo.project.service.IProject4WordService; import org.jeecg.modules.demo.project.service.IProjectService; -//import org.jeecgframework.poi.word.WordExportUtil; +import org.jeecg.modules.demo.utils.FileUtils; import org.junit.Test; import org.junit.runner.RunWith; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import cn.afterturn.easypoi.word.WordExportUtil; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.OutputStream; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * @Description: TODO @@ -72,7 +77,7 @@ public class WordExportUtil_test { try { // XWPFDocument doc = WordExportUtil.exportWord07("C:\\Users\\YX\\Desktop\\testword\\model2.doc", map); XWPFDocument doc = WordExportUtil.exportWord07("C:\\Users\\YX\\Desktop\\testword\\xiangmushu\\page1Model.doc", map); - FileOutputStream fos = new FileOutputStream( "C:\\Users\\YX\\Desktop\\testword\\xiangmushu\\test1121v1.docx"); + FileOutputStream fos = new FileOutputStream("C:\\Users\\YX\\Desktop\\testword\\xiangmushu\\test1121v1.docx"); doc.write(fos); fos.close(); } catch (Exception e) { @@ -80,9 +85,50 @@ public class WordExportUtil_test { } } + @Test + public void test3() { + String wordPath = "C:\\Users\\YX\\Documents\\00.docx"; + String padPath = "C:\\Users\\YX\\Documents\\00.pdf"; + +// FileUtils.convertDocx2Pdf(wordPath, file + File.separator + padFileName); + try { + FileUtils.convertDocxToPdf(wordPath, padPath); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Test + public void test4() { + File newFile = new File("C:\\Users\\YX\\Desktop\\testword\\xiangmushu\\合并1122v4.docx"); + List srcfile = new ArrayList<>(); + + File file1 = new File("C:\\Users\\YX\\Desktop\\testword\\xiangmushu\\正文V14.docx"); + File file2 = new File("C:\\Users\\YX\\Desktop\\testword\\xiangmushu\\正文V15.docx"); +// File file3 = new File("C:\\Users\\YX\\Desktop\\testword\\xiangmushu\\yiJianModel.doc"); + srcfile.add(file1); + srcfile.add(file2); + + List wordList = new ArrayList<>(); + try { + FileInputStream fis = new FileInputStream("C:\\Users\\YX\\Desktop\\testword\\xiangmushu\\正文V14.docx"); + wordList.add(new XWPFDocument(fis)); + FileInputStream fis2 = new FileInputStream("C:\\Users\\YX\\Desktop\\testword\\xiangmushu\\正文V15.docx"); + wordList.add(new XWPFDocument(fis2)); + XWPFDocument mergeWordObj = WordUtils.mergeWord(wordList); + FileOutputStream fos = new FileOutputStream("C:\\Users\\YX\\Desktop\\testword\\xiangmushu\\合并1122v4.docx"); + mergeWordObj.write(fos); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + System.out.println("*****合成成功222********"); + } + @Test public void test2() { - File newFile = new File("C:\\Users\\YX\\Desktop\\testword\\xiangmushu\\合并1122v2.docx"); + File newFile = new File("C:\\Users\\YX\\Desktop\\testword\\xiangmushu\\合并1122v3.docx"); List srcfile = new ArrayList<>(); File file1 = new File("C:\\Users\\YX\\Desktop\\testword\\xiangmushu\\正文V14.docx");