Selaa lähdekoodia

update preview paper.

deason 6 vuotta sitten
vanhempi
commit
81d70da651

+ 17 - 20
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/PaperController.java

@@ -2,8 +2,6 @@ package cn.com.qmth.examcloud.core.questions.api;
 
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
 import cn.com.qmth.examcloud.commons.exception.StatusException;
-import cn.com.qmth.examcloud.commons.util.JsonUtil;
-import cn.com.qmth.examcloud.core.questions.api.bean.ParsePaper;
 import cn.com.qmth.examcloud.core.questions.base.BeanCopierUtil;
 import cn.com.qmth.examcloud.core.questions.base.SpringContextUtils;
 import cn.com.qmth.examcloud.core.questions.base.StringSimilarityUtils;
@@ -20,6 +18,7 @@ import cn.com.qmth.examcloud.core.questions.service.QuesService;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailExp;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailUnitExp;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.bean.paper.PreviewPaperHandler;
 import cn.com.qmth.examcloud.core.questions.service.export.ExportPaperAbstractService;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import cn.com.qmth.examcloud.web.support.Naked;
@@ -600,18 +599,17 @@ public class PaperController extends ControllerSupport {
         if (manager == null) {
             manager = exportServiceManageRepo.findByOrgName("山东大学");
         }
-        ExportPaperAbstractService exportPaperAbstractService = SpringContextUtils.getBean(ExportPaperAbstractService.class, manager.getExportServiceName());
+        ExportPaperAbstractService exportPaperService = SpringContextUtils.getBean(ExportPaperAbstractService.class, manager.getExportServiceName());
 
-        PaperExp viewPaper = exportPaperAbstractService.previewPDF(paper);
-        model.addAttribute("htmlList", JsonUtil.toJson(ParsePaper.convertPaperHtml(viewPaper)));
+        PaperExp previewPaper = exportPaperService.previewPaperForPDF(paper);
+        model.addAttribute("htmlList", PreviewPaperHandler.convertPaperHtml(previewPaper));
         model.addAttribute("examName", examName);
-        model.addAttribute("courseName", viewPaper.getCourseName());
-        model.addAttribute("courseNo", viewPaper.getCourseNo());
-        model.addAttribute("courseLevel", viewPaper.getCourseLevel());
+        model.addAttribute("courseNo", previewPaper.getCourseNo());
+        model.addAttribute("courseName", previewPaper.getCourseName());
+        model.addAttribute("courseLevel", previewPaper.getCourseLevel());
 
-        //String html = manager.getExportServiceName() + "_paper";
-        String html = "sddxExportPaperService_paper";
-        return html;
+        //return manager.getExportServiceName() + "_paper";
+        return "sddxExportPaperService_paper";
     }
 
     @Naked
@@ -627,18 +625,17 @@ public class PaperController extends ControllerSupport {
         if (manager == null) {
             manager = exportServiceManageRepo.findByOrgName("山东大学");
         }
-        ExportPaperAbstractService exportPaperAbstractService = SpringContextUtils.getBean(ExportPaperAbstractService.class, manager.getExportServiceName());
+        ExportPaperAbstractService exportPaperService = SpringContextUtils.getBean(ExportPaperAbstractService.class, manager.getExportServiceName());
 
-        PaperExp viewPaper = exportPaperAbstractService.previewPDF(paper);
-        model.addAttribute("htmlList", JsonUtil.toJson(ParsePaper.convertAnswerHtml(viewPaper)));
-        model.addAttribute("courseNo", viewPaper.getCourseNo());
-        model.addAttribute("courseName", viewPaper.getCourseName());
-        model.addAttribute("courseLevel", viewPaper.getCourseLevel());
+        PaperExp previewPaper = exportPaperService.previewPaperForPDF(paper);
+        model.addAttribute("htmlList", PreviewPaperHandler.convertPaperAnswerHtml(previewPaper));
         model.addAttribute("examName", examName);
+        model.addAttribute("courseName", previewPaper.getCourseName());
+        model.addAttribute("courseNo", previewPaper.getCourseNo());
+        model.addAttribute("courseLevel", previewPaper.getCourseLevel());
 
-        //String html = manager.getExportServiceName() + "_answer";
-        String html = "sddxExportPaperService_answer";
-        return html;
+        //return manager.getExportServiceName() + "_answer";
+        return "sddxExportPaperService_answer";
     }
 
     @ApiOperation(value = "传送到印刷平台", notes = "传送到印刷平台")

+ 83 - 0
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/bean/paper/ExportPaperHandler.java

@@ -0,0 +1,83 @@
+/*
+ * *************************************************
+ * Copyright (c) 2019 QMTH. All Rights Reserved.
+ * Created by Deason on 2019-05-23 11:39:38.
+ * *************************************************
+ */
+
+package cn.com.qmth.examcloud.core.questions.service.bean.paper;
+
+import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
+import cn.com.qmth.examcloud.core.questions.dao.entity.Question;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailExp;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailUnitExp;
+import org.apache.commons.collections.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 试卷导出内容处理
+ *
+ * @author: fengdesheng
+ * @since: 2019/5/23
+ */
+public class ExportPaperHandler {
+
+    /**
+     * 对相同类型的大题分组,生成不同的集合放入小题,再对小题排序
+     */
+    public static void sortPaperDetailUnits(List<PaperDetailExp> details) {
+        int index = 0;
+        Map<Long, List<PaperDetailUnitExp>> map = new HashMap<>();
+
+        //循环所有大题,将同类型的小题放到同一个集合下面
+        for (PaperDetailExp detail : details) {
+            //单选,多选,判断放在同一集合下排序
+            List<PaperDetailUnitExp> units;
+            Long sortNumber = detail.getSortNumber();
+            if (sortNumber < 4L) {
+                units = map.get(sortNumber);
+                if (units == null) {
+                    units = new ArrayList<>();
+                }
+                units.addAll(detail.getPaperDetailUnits());
+                map.put(sortNumber, units);
+            } else {
+                units = new ArrayList<>();
+                units.addAll(detail.getPaperDetailUnits());
+                map.put(sortNumber + index, units);
+                index++;
+            }
+        }
+
+        //循环所有小题,给小题排序
+        for (Long sortNumber : map.keySet()) {
+            List<PaperDetailUnitExp> utils = map.get(sortNumber);
+            if (CollectionUtils.isEmpty(utils)) {
+                continue;
+            }
+
+            int number = 1;//小题号
+            int nestedNumber = 1;//套题号
+            for (int i = 0; i < utils.size(); i++) {
+                PaperDetailUnitExp unit = utils.get(i);
+                if (unit.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {
+                    unit.setNumber(nestedNumber);
+                    List<Question> subQuestions = unit.getQuestion().getSubQuestions();
+                    for (int j = 0; j < subQuestions.size(); j++) {
+                        subQuestions.get(j).setNumber(number + j);
+                    }
+                    number += subQuestions.size();
+                    nestedNumber++;
+                } else {
+                    unit.setNumber(number);
+                    number++;
+                }
+            }
+        }
+    }
+
+}

+ 58 - 40
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/bean/ParsePaper.java → examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/bean/paper/PreviewPaperHandler.java

@@ -1,20 +1,20 @@
 /*
  * *************************************************
  * Copyright (c) 2019 QMTH. All Rights Reserved.
- * Created by Deason on 2019-01-18 16:55:58.
+ * Created by Deason on 2019-05-23 11:39:26.
  * *************************************************
  */
 
-package cn.com.qmth.examcloud.core.questions.api.bean;
+package cn.com.qmth.examcloud.core.questions.service.bean.paper;
 
 import cn.com.qmth.examcloud.commons.exception.StatusException;
+import cn.com.qmth.examcloud.commons.util.JsonUtil;
 import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuesOption;
 import cn.com.qmth.examcloud.core.questions.dao.entity.Question;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailExp;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailUnitExp;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
-import com.google.common.collect.Lists;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -23,11 +23,21 @@ import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.List;
 
-public class ParsePaper {
-    private static final Logger log = LoggerFactory.getLogger(ParsePaper.class);
+/**
+ * 试卷预览内容处理
+ *
+ * @author: fengdesheng
+ * @since: 2019/5/23
+ */
+public class PreviewPaperHandler {
+    private static final Logger log = LoggerFactory.getLogger(PreviewPaperHandler.class);
+    private final static String SINGLE_TITLE = "<p><b>在每小题列出的备选项中只有一个符合题目要求的,请将其选出并将“答题卡”的相应代码涂黑,错涂、多涂或未涂均无分。</b></p>";//单选题提示语
+    private final static String MULTIPLE_TITLE = "<p><b>在每小题列出的备选项中有一个或多个符合题目要求的,请将符合项选出并将“答题卡”的相应代码涂黑。</b></p>";//多选题提示语
+    private final static String BOOL_TITLE = "<p><b>正确的填涂√、错误填涂×。错涂、多涂或未涂均无分正确的填涂√、错误填涂×。错涂、多涂或未涂均无分。</b></p>";//判断题提示语
     private final static String SECTION_STYLE = "class=\"e_detail\"";//试卷大题样式
     private final static String QUESTION_STYLE = "class=\"e_question\"";//试题标题样式
     private final static String OPTION_STYLE = "class=\"e_option\"";//试题答案项样式
+    private final static String OPTION_END_STYLE = "class=\"e_option e_option_end\"";//试题答案项样式
     private final static String FORMAT_SECTION = "<p %s><b>%s、%s</b></p>";//大题标题格式
     private final static String FORMAT_QUESTION = "<p %s>%s、%s</p>";//试题标题格式
     private final static String FORMAT_SUB_QUESTION = "<p %s>%s、%s</p>";//子试题标题格式
@@ -35,30 +45,32 @@ public class ParsePaper {
     private final static String[] REGEX_FILL_1 = {"[#][#]", "____"};//正则关键字
     private final static String[] REGEX_FILL_2 = {"[_][#]", "_"};//正则关键字
 
-    public static List<String> convertPaperHtml(PaperExp data) {
+    /**
+     * 转换试卷的HTML内容
+     */
+    public static String convertPaperHtml(PaperExp data) {
         if (data == null) {
-            log.warn("Paper is null.");
+            log.warn("Paper data is not exist.");
             throw new StatusException("500", "试卷信息不存在!");
         }
 
         List<PaperDetailExp> details = data.getPaperDetails();
         if (details == null || details.size() == 0) {
-            log.warn("Paper Detail is empty.");
-            return Lists.newArrayList();
+            log.warn("Paper detail is empty.");
+            return "[]";
         }
 
-        //封装试卷的HTML内容
-        List<String> htmlList = new ArrayList<>();
+        List<String> htmlTags = new ArrayList<>();
         for (int x = 0; x < details.size(); x++) {
             PaperDetailExp detail = details.get(x);
             if (StringUtils.isNotBlank(detail.getTitle())) {
-                htmlList.add(String.format(FORMAT_SECTION, SECTION_STYLE, detail.getCnNum(), replaceTagP(detail.getName() + detail.getTitle())));
+                htmlTags.add(String.format(FORMAT_SECTION, SECTION_STYLE, detail.getCnNum(), replaceTagP(detail.getName() + detail.getTitle())));
             } else {
-                htmlList.add(String.format(FORMAT_SECTION, SECTION_STYLE, detail.getCnNum(), replaceTagP(detail.getName())));
+                htmlTags.add(String.format(FORMAT_SECTION, SECTION_STYLE, detail.getCnNum(), replaceTagP(detail.getName())));
             }
 
             if (StringUtils.isNotBlank(detail.getTitleDetail())) {
-                htmlList.add(String.format("<p>%s</p>", replaceTagP(detail.getTitleDetail())));
+                htmlTags.add(String.format("<p>%s</p>", replaceTagP(detail.getTitleDetail())));
             }
 
             //封装大题的试题列表
@@ -79,18 +91,13 @@ public class ParsePaper {
                 //题干 替换特殊关键字
                 qBody = replaceFill(question, qBody);
                 if (question.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {
-                    htmlList.add(String.format("<p %s>%s</p>", QUESTION_STYLE, qBody));
+                    htmlTags.add(String.format("<p %s>%s</p>", QUESTION_STYLE, qBody));
                 } else {
-                    htmlList.add(String.format(FORMAT_QUESTION, QUESTION_STYLE, unit.getNumber(), qBody));
+                    htmlTags.add(String.format(FORMAT_QUESTION, QUESTION_STYLE, unit.getNumber(), qBody));
                 }
 
                 //客观题 选项列表
-                List<QuesOption> options = question.getQuesOptions();
-                if (options != null && options.size() > 0) {
-                    for (QuesOption option : options) {
-                        htmlList.add(String.format(FORMAT_OPTION, OPTION_STYLE, formatNum(option.getNumber()), replaceTagP(option.getOptionBody())));
-                    }
-                }
+                handleOptionStyle(htmlTags, question);
 
                 if (question.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {
                     //套题的子题
@@ -108,41 +115,52 @@ public class ParsePaper {
                             //题干 替换特殊关键字
                             subBody = replaceFill(subQues, subBody);
                             String subQuesNumber = subQues.getQuesParams().get("number");
-                            htmlList.add(String.format(FORMAT_SUB_QUESTION, QUESTION_STYLE, subQuesNumber, subBody));
+                            htmlTags.add(String.format(FORMAT_SUB_QUESTION, QUESTION_STYLE, subQuesNumber, subBody));
 
                             //客观题 选项列表
-                            List<QuesOption> subOptions = subQues.getQuesOptions();
-                            if (subOptions != null && subOptions.size() > 0) {
-                                for (int n = 0; n < subOptions.size(); n++) {
-                                    QuesOption subOpt = subOptions.get(n);
-                                    htmlList.add(String.format(FORMAT_OPTION, OPTION_STYLE, formatNum(subOpt.getNumber()), replaceTagP(subOpt.getOptionBody())));
-                                }
-                            }
+                            handleOptionStyle(htmlTags, subQues);
                         }
                     }
                 }
             }
         }
-        return htmlList;
+        return JsonUtil.toJson(htmlTags);
+    }
+
+    private static void handleOptionStyle(List<String> htmlTags, Question question) {
+        List<QuesOption> options = question.getQuesOptions();
+        if (options != null && options.size() > 0) {
+            for (int i = 0; i < options.size(); i++) {
+                QuesOption option = options.get(i);
+                if (i == (options.size() - 1)) {
+                    htmlTags.add(String.format(FORMAT_OPTION, OPTION_END_STYLE, formatNum(option.getNumber()), replaceTagP(option.getOptionBody())));
+                } else {
+                    htmlTags.add(String.format(FORMAT_OPTION, OPTION_STYLE, formatNum(option.getNumber()), replaceTagP(option.getOptionBody())));
+                }
+            }
+        }
     }
 
-    public static List<String> convertAnswerHtml(PaperExp data) {
+    /**
+     * 转换试卷答案HTML内容
+     */
+    public static String convertPaperAnswerHtml(PaperExp data) {
         if (data == null) {
             throw new StatusException("500", "试卷信息不存在!");
         }
 
         List<PaperDetailExp> details = data.getPaperDetails();
         if (details == null || details.size() == 0) {
-            return Lists.newArrayList();
+            return "[]";
         }
 
         //封装试卷答案的HTML内容
-        List<String> htmlList = new ArrayList<>();
+        List<String> htmlTags = new ArrayList<>();
         for (PaperDetailExp detail : details) {
             if (StringUtils.isNotBlank(detail.getTitle())) {
-                htmlList.add(String.format(FORMAT_SECTION, SECTION_STYLE, detail.getCnNum(), detail.getName() + detail.getTitle()));
+                htmlTags.add(String.format(FORMAT_SECTION, SECTION_STYLE, detail.getCnNum(), detail.getName() + detail.getTitle()));
             } else {
-                htmlList.add(String.format(FORMAT_SECTION, SECTION_STYLE, detail.getCnNum(), detail.getName()));
+                htmlTags.add(String.format(FORMAT_SECTION, SECTION_STYLE, detail.getCnNum(), detail.getName()));
             }
 
             List<PaperDetailUnitExp> units = detail.getPaperDetailUnits();
@@ -153,20 +171,20 @@ public class ParsePaper {
                 }
 
                 if (question.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {
-                    //htmlList.add(String.format(FORMAT_QUESTION, QUESTION_STYLE, unit.getNumber(), "题"));
+                    //htmlTags.add(String.format(FORMAT_QUESTION, QUESTION_STYLE, unit.getNumber(), "题"));
                     List<Question> subQuestions = question.getSubQuestions();
                     if (subQuestions != null && subQuestions.size() > 0) {
                         for (Question subQues : subQuestions) {
                             String subQuesNumber = subQues.getQuesParams().get("number");
-                            htmlList.add(String.format(FORMAT_SUB_QUESTION, QUESTION_STYLE, subQuesNumber, replaceFill(subQues, subQues.getQuesAnswer())));
+                            htmlTags.add(String.format(FORMAT_SUB_QUESTION, QUESTION_STYLE, subQuesNumber, replaceFill(subQues, subQues.getQuesAnswer())));
                         }
                     }
                 } else {
-                    htmlList.add(String.format(FORMAT_QUESTION, QUESTION_STYLE, unit.getNumber(), replaceFill(question, question.getQuesAnswer())));
+                    htmlTags.add(String.format(FORMAT_QUESTION, QUESTION_STYLE, unit.getNumber(), replaceFill(question, question.getQuesAnswer())));
                 }
             }
         }
-        return htmlList;
+        return JsonUtil.toJson(htmlTags);
     }
 
     public static String formatValue(Double score) {

+ 35 - 82
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/ExportPaperAbstractService.java

@@ -16,6 +16,7 @@ import cn.com.qmth.examcloud.core.questions.service.PaperDetailService;
 import cn.com.qmth.examcloud.core.questions.service.PaperService;
 import cn.com.qmth.examcloud.core.questions.service.QuestionAudioService;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.*;
+import cn.com.qmth.examcloud.core.questions.service.bean.paper.ExportPaperHandler;
 import com.google.gson.Gson;
 import freemarker.template.Configuration;
 import freemarker.template.Template;
@@ -333,32 +334,6 @@ public abstract class ExportPaperAbstractService {
      */
     public abstract void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure, User accessUser, ExamPaper examPaper) throws Exception;
 
-    public PaperExp initPaperExp(String paperId) throws Exception {
-        PaperExp paperExp = initPaperExpService.initPaperExp(paperId);
-        //给新的大题下所有小题排序
-        sortPaperDetailUnitExps(paperExp.getPaperDetails());
-        //如果每个小题分数不一样,题干后面添加分数
-        appendScoreToQuestionBody(paperExp.getPaperDetails());
-        //1.设置题号 2.给小题选项进行排序 3.设置选项号 4.替换题干中的##为____
-        setUnitExpNumber(paperExp.getPaperDetails());
-        //设置大题标题
-        setExpDtoTitle(paperExp.getPaperDetails());
-        return paperExp;
-    }
-
-    public PaperExp previewPDF(Paper paper) {
-        PaperExp paperExp = initPaperExpService.initPaperExp(paper);
-        //给新的大题下所有小题排序
-        sortPaperDetailUnitExps(paperExp.getPaperDetails());
-        //如果每个小题分数不一样,题干后面添加分数
-        appendScoreToQuestionBodyHtml(paperExp.getPaperDetails());
-        //1.设置题号 2.给小题选项进行排序 3.设置选项号 4.替换题干中的##为____
-        setUnitExpNumberHtml(paperExp.getPaperDetails());
-        //设置大题标题
-        setExpDtoTitle(paperExp.getPaperDetails());
-        return paperExp;
-    }
-
     /**
      * 设置选项号
      *
@@ -962,61 +937,6 @@ public abstract class ExportPaperAbstractService {
         }
     }
 
-    /**
-     * 小题排序
-     *
-     * @param paperDetailExps
-     * @describle 大题排序完成之后,放在一个集合里面。然后对相同类型的大题分组,生成不同的集合,在对小题进行
-     */
-    public void sortPaperDetailUnitExps(List<PaperDetailExp> paperDetailExps) {
-        Map<Long, List<PaperDetailUnitExp>> map = new HashMap<Long, List<PaperDetailUnitExp>>();
-        //循环所有大题,将同类型的小题放到同一个集合下面
-        int index = 0;
-        for (PaperDetailExp paperDetailExp : paperDetailExps) {
-            List<PaperDetailUnitExp> paperDetailUnitExps = null;
-            //单选,多选,判断放在同一集合下排序
-            if (paperDetailExp.getSortNumber() < 4L) {
-                //通过map的key去取value,如果没有,就添加
-                if (map.get(paperDetailExp.getSortNumber()) == null) {
-                    paperDetailUnitExps = new ArrayList<PaperDetailUnitExp>();
-                } else {
-                    paperDetailUnitExps = map.get(paperDetailExp.getSortNumber());
-                }
-                paperDetailUnitExps.addAll(paperDetailExp.getPaperDetailUnits());
-                map.put(paperDetailExp.getSortNumber(), paperDetailUnitExps);
-            } else {
-                paperDetailUnitExps = new ArrayList<PaperDetailUnitExp>();
-                paperDetailUnitExps.addAll(paperDetailExp.getPaperDetailUnits());
-                map.put(paperDetailExp.getSortNumber() + index, paperDetailUnitExps);
-                index++;
-            }
-        }
-        //循环所有小题,给小题排序
-        for (Long sortNumber : map.keySet()) {
-            List<PaperDetailUnitExp> paperDetailUnitExps = map.get(sortNumber);
-            int number = 1;
-            int order = 1;//套题序号
-            if (paperDetailUnitExps != null && paperDetailUnitExps.size() > 0) {
-                for (int i = 0; i < paperDetailUnitExps.size(); i++) {
-                    PaperDetailUnitExp paperDetailUnitExp = paperDetailUnitExps.get(i);
-                    if (paperDetailUnitExp.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {
-                        paperDetailUnitExp.setNumber(order);
-                        List<Question> subQuestions = paperDetailUnitExp.getQuestion().getSubQuestions();
-                        for (int j = 0; j < subQuestions.size(); j++) {
-                            subQuestions.get(j).setNumber(number + j);
-                        }
-                        number += subQuestions.size();
-                        order++;
-                    } else {
-                        paperDetailUnitExp.setNumber(number);
-                        number++;
-                    }
-                }
-            }
-        }
-    }
-
-
     /**
      * 设置大题标题
      *
@@ -1680,5 +1600,38 @@ public abstract class ExportPaperAbstractService {
         return audioFileName.toString();
     }
 
-}
+    /*
+     * 用于导出Word试卷和试卷答案
+     */
+    public PaperExp initPaperExp(String paperId) throws Exception {
+        PaperExp exportPaper = initPaperExpService.initPaperExp(paperId);
+        //给新的大题下所有小题排序
+        ExportPaperHandler.sortPaperDetailUnits(exportPaper.getPaperDetails());
+        //如果每个小题分数不一样,题干后面添加分数
+        appendScoreToQuestionBody(exportPaper.getPaperDetails());
+        //1.设置题号 2.给小题选项进行排序 3.设置选项号 4.替换题干中的##为____
+        setUnitExpNumber(exportPaper.getPaperDetails());
+        //设置大题标题
+        setExpDtoTitle(exportPaper.getPaperDetails());
+        return exportPaper;
+    }
+
+    /**
+     * 用于页面上预览PDF试卷
+     */
+    public PaperExp previewPaperForPDF(Paper paper) {
+        PaperExp previewPaper = initPaperExpService.initPaperExp(paper);
+
+        //给新的大题下所有小题排序
+        ExportPaperHandler.sortPaperDetailUnits(previewPaper.getPaperDetails());
+
+        //如果每个小题分数不一样,题干后面添加分数
+        appendScoreToQuestionBodyHtml(previewPaper.getPaperDetails());
+        //1.设置题号 2.给小题选项进行排序 3.设置选项号 4.替换题干中的##为____
+        setUnitExpNumberHtml(previewPaper.getPaperDetails());
+        //设置大题标题
+        setExpDtoTitle(previewPaper.getPaperDetails());
+        return previewPaper;
+    }
 
+}