题库网站核心——java

这个网站本来是已经做好了的 但是客户不满意需要对他进行从新架构 

首先来说说用到技术 docx4j 做的核心 

服务器是用的 libreoffice

  前台是通过背景的方式嵌套进去的

首先来说说步骤 

用户上传文档(docx)-----》后台解析成题目--------》返回给用户-------》用户选择---------》试题入库

老师前台选题 ---------》后台根据选择的题目进行解析--------》生成题号-----------》生成新的word文档返回给用户

通过docx4j 可以根据关键字分割word文档 但是分割后的文档没有图片,这个时候就需要把图片也添加上去

最后是组合word 这个部分我还是用的我docx4j来做的 

以下是代码 

package cn.ym.util;

import cn.ym.pojo.Aproblem;

import cn.ym.pojo.Filedoc;

import org.apache.commons.io.IOUtils;

import org.docx4j.Docx4J;

import org.docx4j.Docx4jProperties;

import org.docx4j.XmlUtils;

import org.docx4j.convert.out.FOSettings;

import org.docx4j.convert.out.HTMLSettings;

import org.docx4j.fonts.IdentityPlusMapper;

import org.docx4j.fonts.Mapper;

import org.docx4j.fonts.PhysicalFonts;

import org.docx4j.jaxb.Context;

import org.docx4j.openpackaging.contenttype.ContentType;

import org.docx4j.openpackaging.exceptions.Docx4JException;

import org.docx4j.openpackaging.exceptions.InvalidFormatException;

import org.docx4j.openpackaging.packages.WordprocessingMLPackage;

import org.docx4j.openpackaging.parts.Part;

import org.docx4j.openpackaging.parts.PartName;

import org.docx4j.openpackaging.parts.WordprocessingML.*;

import org.docx4j.openpackaging.parts.relationships.RelationshipsPart;

import org.docx4j.relationships.Relationship;

import org.docx4j.relationships.Relationships;

import org.docx4j.wml.CTAltChunk;

import org.docx4j.wml.Document;

import org.junit.jupiter.api.Test;

import javax.xml.bind.JAXBException;

import java.io.*;

import java.util.*;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class Docx {

/**

    * 分解docx

    * @param file docx的路径 file.getFilepath

    * @param path 分解后的存放路径

    * @return

    * @throws Docx4JException

*/

    public static List DivisionDocx(Filedoc file, String path)throws Docx4JException {

File file1 =new File(path);

if (!file1.exists()) file1.mkdirs();

WordprocessingMLPackage load = WordprocessingMLPackage.load(new File(file.getFilepath()));

List content = load.getMainDocumentPart().getContent();

WordprocessingMLPackage word = WordprocessingMLPackage.createPackage();

List list =new ArrayList<>();

int x = -1;

int y = -1;

for (int i =0; i < content.size(); i++) {

if (content.get(i).toString().trim().startsWith("${题目}")) {

if (x == -1) {

word.getMainDocumentPart().addObject(content.get(i));

x++;

}else {

File f =new File(path, x +"——题目.docx");

String s = f.getAbsolutePath().replaceFirst("docx","jpg");

Aproblem aproblem =new Aproblem();

aproblem.setBody(s);

aproblem.setAnswer(f.getAbsolutePath());

aproblem.setDate(new Date());

aproblem.setFiledocId(file.getId());

list.add(x, aproblem);

addimg(load, word);

word.save(f);

convertJPG(f.getAbsolutePath(),f.getParent());

word = WordprocessingMLPackage.createPackage();

word.getMainDocumentPart().addObject(content.get(i));

x++;

}

}else if (content.get(i).toString().trim().startsWith("${答案}")) {

if (y == -1) {

File f =new File(path, x +"——题目.docx");

String s = f.getAbsolutePath().replaceFirst("docx","jpg");

Aproblem aproblem =new Aproblem();

aproblem.setBody(s);

aproblem.setDate(new Date());

aproblem.setFiledocId(file.getId());

list.add(x, aproblem);

addimg(load, word);

word.save(f);

convertJPG(f.getAbsolutePath(),f.getParent());

word = WordprocessingMLPackage.createPackage();

word.getMainDocumentPart().addObject(content.get(i));

y++;

}else {

try {

File f =new File(path, y +"——答案.docx");

String s = f.getAbsolutePath().replaceFirst("docx","jpg");

list.get(y).setAnalysis(s);

addimg(load, word);

word.save(f);

word = WordprocessingMLPackage.createPackage();

word.getMainDocumentPart().addObject(content.get(i));

convertJPG(f.getAbsolutePath(),f.getParent());

y++;

}catch (Exception e){

System.out.println(e.getLocalizedMessage());

}

}

}else {

word.getMainDocumentPart().addObject(content.get(i));

}

}

try {

File f =new File(path, y +"——答案.docx");

String s = f.getAbsolutePath().replaceFirst("docx","jpg");

list.get(y).setAnalysis(s);

addimg(load, word);

word.save(f);

convertJPG(f.getAbsolutePath(),f.getParent());

}catch (Exception e){

System.out.println(e.getLocalizedMessage());

}

return list;

}

/**

*

    * @param load 有资源带图片

    * @param word 无资源不带图片

    * @throws Docx4JException

*/

    public static void addimg(WordprocessingMLPackage load, WordprocessingMLPackage word)throws Docx4JException {

RelationshipsPart part = load.getMainDocumentPart().getRelationshipsPart();

System.out.println(part);

String xml = word.getMainDocumentPart().getXML();

for (Map.Entry entry : load.getParts().getParts().entrySet()) {

if (entry.getValue()instanceof BinaryPartAbstractImage) {

BinaryPartAbstractImage binImg = (BinaryPartAbstractImage) entry.getValue();

Relationship re = binImg.getSourceRelationships().get(0);

if (xml.contains(re.getId())) {

//Relationship re = load.getMainDocumentPart().getRelationshipsPart().getRelationshipByID(id);

                    System.out.println(re);

PartName partName =new PartName("/word/" + re.getTarget());

System.out.println(partName.getURI());

BinaryPart oPart = (BinaryPart) load.getParts().getParts().get(new PartName("/word/" + re.getTarget()));

BinaryPart bPart =new BinaryPart(partName);

bPart.setBinaryData(oPart.getBytes());

bPart.setContentType(new ContentType(oPart.getContentType()));

bPart.setRelationshipType(re.getType());

Relationship newRe = word.getMainDocumentPart().addTargetPart(bPart);

newRe.setId(re.getId());

newRe.setType(re.getType());

}

}

}

}

/***

    * 和并docx

    * @param main 和并后的docx

    * @param bytes 需要合并的docx的字节数组

    * @param chunkId 需要合并的docx的id(最好唯一)

    */

    public static void insertDocx(MainDocumentPart main,byte[] bytes,int chunkId) {

try {

AlternativeFormatInputPart afiPart =new AlternativeFormatInputPart(new PartName("/part" + chunkId +".docx"));

afiPart.setBinaryData(bytes);

Relationship altChunkRel = main.addTargetPart(afiPart);

CTAltChunk chunk = Context.getWmlObjectFactory().createCTAltChunk();

chunk.setId(altChunkRel.getId());

main.addObject(chunk);

}catch (Exception e) {

e.printStackTrace();

}

}

/**

*

    * @param word 更新题目

    * @param file

    * @return

    */

    public static File gx(WordprocessingMLPackage word,File file,int x) {

String xml = word.getMainDocumentPart().getXML();

Pattern tm = Pattern.compile("\\$\\{题目\\}");

Matcher tm_m = tm.matcher(xml);

while (tm_m.find()) {

xml = xml.replaceFirst("\\$\\{题目\\}", x +".");

xml = xml.replaceFirst("\\$\\{答案\\}", x +".");

}

try {

if (file==null)file=File.createTempFile("tmp",".docx");

Object o = XmlUtils.unmarshalString(xml);

WordprocessingMLPackage aPackage = WordprocessingMLPackage.createPackage();

MainDocumentPart mainDocumentPart = aPackage.getMainDocumentPart();

mainDocumentPart.setJaxbElement((Document)o);

word.addTargetPart(mainDocumentPart);

//if (!file.exists())file.createNewFile()

            word.save(file);

WordprocessingMLPackage load = WordprocessingMLPackage.load(file);

addimg(word,load);

load.save(file);

}catch (Exception e) {

e.printStackTrace();

}

return file;

}

@Test

    public void main()throws Exception {

String path="/usr/local/data/";

String s ="/usr/local/data/54e978e7-8ae1-4b30-aff2-40edb5e661a0/2——题目.docx".replaceAll("\\\\","/").replaceFirst(path,"/file/");

System.out.println(s);

/*      File file = new File("C:\\Users\\user\\Desktop\\新建 DOCX 文档.docx");

    File f = new File("E:\\6——答案.docx");

WordprocessingMLPackage load = WordprocessingMLPackage.load(file);

Relationship rId1 = load.getRelationshipsPart().getRelationshipByID("rId5");

System.out.println(rId1);

WordprocessingMLPackage word = WordprocessingMLPackage.load(f);

addimg(load,word);*/

      // convertDocxToHtml("D:\\2019年03月28日xx学校高中数学试卷(1).docx","C:\\Users\\user\\Desktop\\线性回归分析—非线性问题2.html");

/*        Filedoc filedoc = new Filedoc();

        filedoc.setFilepath("C:\\Users\\user\\Desktop\\线性回归分析—非线性问题2.docx");

        File file = new File("D:\\2019年03月27日xx学校高中数学试卷.docx");

WordprocessingMLPackage load = WordprocessingMLPackage.load(file);

List content = load.getMainDocumentPart().getContent();

        File f = new File("C:\\Users\\user\\Desktop\\数学.docx");*/

//gx(load,f);

/*        String str="";

        Pattern compile = Pattern.compile("\\$.*?\\{.*?答.*?案.*?\\}");

Matcher matcher = compile.matcher(str);

System.out.println(matcher.find());*/

/*String path="E:/Files/a853ce73ab70a35195b8f624976f8bf4/a853ce73ab70a35195b8f624976f8bf4线性回归分析—非线性问题2.docx";

System.out.println(path.replaceFirst("E:/Files/","/file/"));*/

/*        filedoc.setId(1);

DivisionDocx(filedoc,"E:\\");*/

    }

/***

    *  linux 上面的一个offer转换工具

    * @param path

    * @param dir

    */

    public static void convertJPG(String path,String dir){

String s="/usr/bin/soffice --headless --convert-to jpg "+path+" --outdir " + dir;

for (int i =0; i <4; i++) {

try {

System.out.println(s);

Process exec = Runtime.getRuntime().exec(s);

BufferedReader br =new BufferedReader(new InputStreamReader(exec.getErrorStream()));

String line;

while ((line = br.readLine()) !=null) {

//执行结果加上回车

                    System.out.println("info________________________line:" + line);

}

int status = exec.waitFor();

System.out.println("info------------------------status" + status);

exec.destroy();

exec =null;

if (status ==0)break;

}catch (Exception e) {

e.printStackTrace();

}

try {

Thread.sleep(1000);

}catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}


然后是如何显示的问题 首先为了保密和保护版权 我不赞成把word转成html 因为那样保密性太差了稍微有点能力都都可以还原出来,我的观点是吧word转成图片,这样不仅保密好而且免去了处理wmf的步骤 因为这个东西如果自己写可能回花很长时间所以 我这里是借助了一个工具 libreoffice

大家可以看一下这篇文章

https://blog.csdn.net/hczjb/article/details/85066090

不过这还不行 主要是差一个文件 大家可以根据提示 去新建一下这文件 然后就可以用了

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容