|
@@ -19,6 +19,7 @@ import java.util.Map;
|
|
import java.util.Set;
|
|
import java.util.Set;
|
|
import java.util.UUID;
|
|
import java.util.UUID;
|
|
|
|
|
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
import javax.xml.bind.JAXBElement;
|
|
import javax.xml.bind.JAXBElement;
|
|
import javax.xml.parsers.DocumentBuilder;
|
|
import javax.xml.parsers.DocumentBuilder;
|
|
import javax.xml.parsers.DocumentBuilderFactory;
|
|
import javax.xml.parsers.DocumentBuilderFactory;
|
|
@@ -82,8 +83,7 @@ import net.sourceforge.jeuclid.converter.Converter;
|
|
public final class DocxProcessUtil {
|
|
public final class DocxProcessUtil {
|
|
|
|
|
|
public static final LayoutContext IMG_LAYOUT = new StyleAttributeLayoutContext(
|
|
public static final LayoutContext IMG_LAYOUT = new StyleAttributeLayoutContext(
|
|
- LayoutContextImpl.getDefaultLayoutContext(), "3em", java.awt.Color.BLACK);
|
|
|
|
-
|
|
|
|
|
|
+ LayoutContextImpl.getDefaultLayoutContext(), "2em", java.awt.Color.BLACK);
|
|
public static final String IMG_OUT_TYPE = "image/png";
|
|
public static final String IMG_OUT_TYPE = "image/png";
|
|
|
|
|
|
public static final String ENCODING = "utf-8";
|
|
public static final String ENCODING = "utf-8";
|
|
@@ -129,7 +129,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 获取段落的所有文本
|
|
* 获取段落的所有文本
|
|
- *
|
|
|
|
* @param p
|
|
* @param p
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
@@ -145,7 +144,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 校验段落中是否含有公式或图片
|
|
* 校验段落中是否含有公式或图片
|
|
- *
|
|
|
|
* @param p
|
|
* @param p
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
@@ -161,7 +159,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 获取文档包副本(去除段落)
|
|
* 获取文档包副本(去除段落)
|
|
- *
|
|
|
|
* @param wordMLPackage
|
|
* @param wordMLPackage
|
|
* @return
|
|
* @return
|
|
* @throws Exception
|
|
* @throws Exception
|
|
@@ -181,7 +178,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 初始化文档包(去除所有段落)
|
|
* 初始化文档包(去除所有段落)
|
|
- *
|
|
|
|
* @param wordMLPackage
|
|
* @param wordMLPackage
|
|
* @return
|
|
* @return
|
|
* @throws Exception
|
|
* @throws Exception
|
|
@@ -194,7 +190,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 获得段落wordml
|
|
* 获得段落wordml
|
|
- *
|
|
|
|
* @param p
|
|
* @param p
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
@@ -204,7 +199,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 转换wordMl为html
|
|
* 转换wordMl为html
|
|
- *
|
|
|
|
* @param wordMl
|
|
* @param wordMl
|
|
* @return
|
|
* @return
|
|
* @throws Exception
|
|
* @throws Exception
|
|
@@ -244,7 +238,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 替换所有公式为图片
|
|
* 替换所有公式为图片
|
|
- *
|
|
|
|
* @param wordMLPackage
|
|
* @param wordMLPackage
|
|
* @throws Exception
|
|
* @throws Exception
|
|
*/
|
|
*/
|
|
@@ -274,7 +267,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 替换公式为图片
|
|
* 替换公式为图片
|
|
- *
|
|
|
|
* @param p
|
|
* @param p
|
|
* @throws Exception
|
|
* @throws Exception
|
|
*/
|
|
*/
|
|
@@ -300,7 +292,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 创建新图片
|
|
* 创建新图片
|
|
- *
|
|
|
|
* @param wordMLPackage
|
|
* @param wordMLPackage
|
|
* @param bytes
|
|
* @param bytes
|
|
* @param filenameHint
|
|
* @param filenameHint
|
|
@@ -330,7 +321,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 获取wordMl固定节点下所有子节点
|
|
* 获取wordMl固定节点下所有子节点
|
|
- *
|
|
|
|
* @param obj
|
|
* @param obj
|
|
* @param toSearch
|
|
* @param toSearch
|
|
* @return
|
|
* @return
|
|
@@ -353,7 +343,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* omml转换成mml
|
|
* omml转换成mml
|
|
- *
|
|
|
|
* @param omml
|
|
* @param omml
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
@@ -388,7 +377,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 格式化转换后的html(html字符串)
|
|
* 格式化转换后的html(html字符串)
|
|
- *
|
|
|
|
* @param htmlStr
|
|
* @param htmlStr
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
@@ -417,7 +405,7 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 获取html(html字符串)里面文本
|
|
* 获取html(html字符串)里面文本
|
|
- *
|
|
|
|
|
|
+ *
|
|
* @param htmlStr
|
|
* @param htmlStr
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
@@ -438,7 +426,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 格式化转换后的html(html临时文件)
|
|
* 格式化转换后的html(html临时文件)
|
|
- *
|
|
|
|
* @param htmlPath
|
|
* @param htmlPath
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
@@ -478,7 +465,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 转换mathml为png图片
|
|
* 转换mathml为png图片
|
|
- *
|
|
|
|
* @param mathMlStr
|
|
* @param mathMlStr
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
@@ -507,7 +493,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 通过图片路径获取base64码
|
|
* 通过图片路径获取base64码
|
|
- *
|
|
|
|
* @param imgFilePath
|
|
* @param imgFilePath
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
@@ -531,7 +516,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 通过图片文件获取base64码
|
|
* 通过图片文件获取base64码
|
|
- *
|
|
|
|
* @param imgFile
|
|
* @param imgFile
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
@@ -553,7 +537,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 格式化段落wordml
|
|
* 格式化段落wordml
|
|
- *
|
|
|
|
* @param pWordMl
|
|
* @param pWordMl
|
|
* @return
|
|
* @return
|
|
* @throws Exception
|
|
* @throws Exception
|
|
@@ -573,7 +556,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 过滤试题单元标题
|
|
* 过滤试题单元标题
|
|
- *
|
|
|
|
* @param p
|
|
* @param p
|
|
* @param quesUnit
|
|
* @param quesUnit
|
|
* @return
|
|
* @return
|
|
@@ -598,7 +580,7 @@ public final class DocxProcessUtil {
|
|
String tmpText = text.getValue();
|
|
String tmpText = text.getValue();
|
|
if (quesUnit == QuesUnit.QUES_BODY) {
|
|
if (quesUnit == QuesUnit.QUES_BODY) {
|
|
// 过滤题干标题
|
|
// 过滤题干标题
|
|
- if (tmpText.matches("^\\d{1,}\\.[\\s\\S]*")) {
|
|
|
|
|
|
+ if (tmpText.matches("^\\d{1,}\\.")) {
|
|
tmpText = tmpText.replaceFirst("\\d{1,}\\.", "");
|
|
tmpText = tmpText.replaceFirst("\\d{1,}\\.", "");
|
|
text.setValue(tmpText);
|
|
text.setValue(tmpText);
|
|
} else {
|
|
} else {
|
|
@@ -610,11 +592,11 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
} else if (quesUnit == QuesUnit.QUES_OPTION) {
|
|
} else if (quesUnit == QuesUnit.QUES_OPTION) {
|
|
// 过滤选项标题
|
|
// 过滤选项标题
|
|
- if (tmpText.matches("^[a-zA-Z]\\.[\\s\\S]*")) {
|
|
|
|
- tmpText = tmpText.replaceFirst("[a-zA-Z]\\.", "");
|
|
|
|
|
|
+ if (tmpText.matches("^[A-Z]\\.")) {
|
|
|
|
+ tmpText = tmpText.replaceFirst("[A-Z]\\.", "");
|
|
text.setValue(tmpText);
|
|
text.setValue(tmpText);
|
|
} else {
|
|
} else {
|
|
- tmpText = tmpText.replaceFirst("[a-zA-Z]", "").replaceFirst("\\.", "");
|
|
|
|
|
|
+ tmpText = tmpText.replaceFirst("[A-Z]", "").replaceFirst("\\.", "");
|
|
text.setValue(tmpText);
|
|
text.setValue(tmpText);
|
|
if (index == 2)
|
|
if (index == 2)
|
|
break;
|
|
break;
|
|
@@ -641,7 +623,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 导出word
|
|
* 导出word
|
|
- *
|
|
|
|
* @param dataMap
|
|
* @param dataMap
|
|
* @param fileName
|
|
* @param fileName
|
|
*/
|
|
*/
|
|
@@ -675,7 +656,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 导出试卷
|
|
* 导出试卷
|
|
- *
|
|
|
|
* @param dataMap
|
|
* @param dataMap
|
|
* @param fileName
|
|
* @param fileName
|
|
*/
|
|
*/
|
|
@@ -685,7 +665,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 导出答案
|
|
* 导出答案
|
|
- *
|
|
|
|
* @param dataMap
|
|
* @param dataMap
|
|
* @param fileName
|
|
* @param fileName
|
|
*/
|
|
*/
|
|
@@ -695,7 +674,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 处理导出word中的图片
|
|
* 处理导出word中的图片
|
|
- *
|
|
|
|
* @param fileName
|
|
* @param fileName
|
|
* @param wordMLPackages
|
|
* @param wordMLPackages
|
|
* @throws Exception
|
|
* @throws Exception
|
|
@@ -735,7 +713,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 获取word二进制数据(空文档,只有样式和资源)
|
|
* 获取word二进制数据(空文档,只有样式和资源)
|
|
- *
|
|
|
|
* @param wordMLPackage
|
|
* @param wordMLPackage
|
|
* @return
|
|
* @return
|
|
* @throws Exception
|
|
* @throws Exception
|
|
@@ -755,7 +732,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 通过二进制流获取word文档包
|
|
* 通过二进制流获取word文档包
|
|
- *
|
|
|
|
* @param bytes
|
|
* @param bytes
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
@@ -774,7 +750,6 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 初始化word文档图片资源路径,防止导出试卷时资源ID冲突
|
|
* 初始化word文档图片资源路径,防止导出试卷时资源ID冲突
|
|
- *
|
|
|
|
* @param wordMLPackage
|
|
* @param wordMLPackage
|
|
*/
|
|
*/
|
|
public static void initPkgImage(WordprocessingMLPackage wordMLPackage) {
|
|
public static void initPkgImage(WordprocessingMLPackage wordMLPackage) {
|
|
@@ -806,11 +781,21 @@ public final class DocxProcessUtil {
|
|
|
|
|
|
/**
|
|
/**
|
|
* 获取RldNum
|
|
* 获取RldNum
|
|
- *
|
|
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
public static String getRldNum() {
|
|
public static String getRldNum() {
|
|
return REL_ID_HEADER + CommonUtils.getCurNum();
|
|
return REL_ID_HEADER + CommonUtils.getCurNum();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ public static void processDownload(String fileName,HttpServletResponse response) throws Exception {
|
|
|
|
+ String filePath = TEMP_FILE_EXP + fileName + DOCX_SUFFIX;
|
|
|
|
+ InputStream inputStream = new FileInputStream(filePath);
|
|
|
|
+ OutputStream outputStream = response.getOutputStream();
|
|
|
|
+ // 设置强制下载不打开
|
|
|
|
+ response.setContentType("application/octet-stream;charset=utf-8");
|
|
|
|
+ // 设置文件名
|
|
|
|
+ response.addHeader("Content-Disposition", "attachment;fileName=" + new String(fileName.getBytes("UTF-8"),"iso-8859-1") + DOCX_SUFFIX);
|
|
|
|
+ IOUtils.copyLarge(inputStream,outputStream);
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|