Kaynağa Gözat

项目启动初始化docx4j,加速文档生成

陈长荣 2 ay önce
ebeveyn
işleme
7d467276aa

+ 54 - 0
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/config/Docx4jHelper.java

@@ -0,0 +1,54 @@
+package com.github.jfcloud.gene.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.docx4j.Docx4jProperties;
+import org.docx4j.jaxb.BinderListenerUtils;
+import org.docx4j.jaxb.Context;
+import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+import javax.xml.bind.JAXBException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+@Slf4j
+@Component
+public class Docx4jHelper implements ApplicationRunner {
+
+    private static final WordprocessingMLPackage.FilterSettings settings = new WordprocessingMLPackage.FilterSettings();
+
+    @Override
+    public void run(ApplicationArguments args) {
+        //初始化Context和Docx4jProperties,加速文档转换
+        log.info("初始化Docx4j:{}", Context.jcXmlPackage.toString());
+        Docx4jProperties.getProperty("docx4j");
+
+        try {
+            //初始化binderListener
+            BinderListenerUtils.getBinderListener();
+        } catch (JAXBException ignore) {
+        }
+
+        //规范docx语法
+        settings.setTidyForDocx4all(true);
+        log.info("初始化Docx4j完成");
+    }
+
+    /**
+     * 转换docx
+     */
+    public static void convert(InputStream in, OutputStream out) throws Exception {
+        load(in).save(out);
+    }
+
+    /**
+     * 加载docx
+     */
+    public static WordprocessingMLPackage load(InputStream in) throws Exception {
+        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(in);
+        wordMLPackage.filter(settings);
+        return wordMLPackage;
+    }
+}

+ 2 - 2
jfcloud-gene-biz/src/main/java/com/github/jfcloud/gene/file/service/impl/FileInfoServiceImpl.java

@@ -15,6 +15,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.jfcloud.common.core.constant.enums.YesNoEnum;
 import com.github.jfcloud.common.file.core.FileProperties;
 import com.github.jfcloud.common.file.core.FileTemplate;
+import com.github.jfcloud.gene.config.Docx4jHelper;
 import com.github.jfcloud.gene.file.entity.FileInfo;
 import com.github.jfcloud.gene.file.mapper.FileInfoMapper;
 import com.github.jfcloud.gene.file.service.FileInfoService;
@@ -25,7 +26,6 @@ import com.github.jfcloud.gene.util.WordUtil;
 import com.github.jfcloud.web.controller.JfcloudRestController;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.docx4j.Docx4J;
 import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletRequest;
@@ -75,7 +75,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
         try (InputStream inputStream = WordUtil.exportWord(modelName, dataMap);
              ByteArrayOutputStream out = new ByteArrayOutputStream()) {
             //转化为docx文件
-            Docx4J.save(Docx4J.load(inputStream), out);
+            Docx4jHelper.convert(inputStream, out);
 
             //上传至文件服务器
             byte[] byteArray = out.toByteArray();