Forráskód Böngészése

fix export examRemark img bug.

deason 7 éve
szülő
commit
cb9e5215c6

+ 36 - 1
examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/word/DocxProcessUtil.java

@@ -31,6 +31,7 @@ import org.docx4j.openpackaging.exceptions.Docx4JException;
 import org.docx4j.openpackaging.io3.stores.ZipPartStore;
 import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.docx4j.openpackaging.parts.Part;
+import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPart;
 import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage;
 import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
 import org.docx4j.openpackaging.parts.relationships.Namespaces;
@@ -691,6 +692,19 @@ public final class DocxProcessUtil {
         IOUtils.closeQuietly(out);
     }
 
+    public static boolean hasImage(String html) throws Exception {
+        if (html == null) {
+            return false;
+        }
+        String reg = "<\\s*img\\s+([^>]*)\\s*>";
+        Pattern pattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE);
+        Matcher matcher = pattern.matcher(html);
+        if (matcher.find()) {
+            return true;
+        }
+        return false;
+    }
+
     /**
      * 处理导出word中的图片
      *
@@ -726,7 +740,16 @@ public final class DocxProcessUtil {
                 String relId = p.getSourceRelationships().get(0).getId();
                 //如果不存在该relId,拷贝图片
                 if (!relationshipsPart.isRelIdOccupied(relId)) {
-                    copyImage(wordMLPackage, partStore, p, relId);
+                    byte[] bytes = null;
+                    if (partStore != null) {
+                        bytes = partStore.getByteArray(p.getPartName().getName().substring(1)).getBytes();
+                    } else {
+                        if (p instanceof BinaryPart) {
+                            BinaryPart imagePart = (BinaryPart) p;
+                            bytes = imagePart.getBytes();
+                        }
+                    }
+                    copyImage(wordMLPackage, bytes, relId);
                 }
             }
             // 添加资源文件存储
@@ -739,6 +762,18 @@ public final class DocxProcessUtil {
         logger.info("试卷:“" + fileName + "”导出处理图片结束");
     }
 
+    public static void copyImage(WordprocessingMLPackage wordMLPackage, byte[] bytes, String relId) throws Exception {
+        if (bytes == null || bytes.length == 0) {
+            return;
+        }
+        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+        BufferedImage bi1 = ImageIO.read(bais);
+        if (bi1 != null) {
+            BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes);
+            imagePart.getRelLast().setId(relId);
+        }
+    }
+
     /**
      * word合并时复制图片
      * 将partStore中的Relationship复制到wordMLPackage中

+ 8 - 2
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/TjdxExportPaperService.java

@@ -2,6 +2,7 @@ package cn.com.qmth.examcloud.core.questions.service.export;
 
 import cn.com.qmth.examcloud.commons.web.security.bean.User;
 import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
+import cn.com.qmth.examcloud.core.questions.base.ImageUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
 import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
@@ -31,18 +32,23 @@ public class TjdxExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_" + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
             File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+            List<WordprocessingMLPackage> wordPackages = getPkgList(paperId);
             if (examType.equals("offLine")) {
                 //生成考试说明的word片段
                 WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
                 if (StringUtils.isBlank(paperExp.getExamRemark())) {
                     paperExp.setExamRemark("<p></p>");
                 }
-                paperExp.setExamRemarkWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
+                String examRemark = ImageUtils.reSizeImg(paperExp.getExamRemark());
+                paperExp.setExamRemarkWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(examRemark)));
                 DocxProcessUtil.exportWordNew(paperExp, file, TJDX_OUTLINE_TEMPLATE_PAPER);
+                if (DocxProcessUtil.hasImage(examRemark)) {
+                    wordPackages.add(wordMLPackage);
+                }
             } else {
                 DocxProcessUtil.exportWordNew(paperExp, file, TJDX_TEMPLATE_PAPER);
             }
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, wordPackages);
             //下载音频
             super.downloadAudio(paperExp, zipFileName);
         }