java word 导出数学公式latex、katex与图片自适应

java word 导出数学公式latex、katex与图片自适应

需求

公司之前在做导出数学试卷的时候使用网页的方式生成试卷(零时解决方案),通过网页的打印pdf方式来生成试卷,使用网页生成试卷在通过浏览器的打印转成pdf存在一些缺陷,网页上布局使用相对和绝对定位处理,会存在图片太大显示不全的问题、公式无法自动换行的问题,页面样式转pdf后无法保证pdf样式的完整性。试卷太多的时候不同学生的试卷不同,使用自动化脚本转pdf根本不适用,费时费力而且无法保证试卷的样式,打印成纸质的问题太多,因此迫切需要将所有学生的试卷一键下载成zip包:
这里补充一下,为什么不直接转pdf,主要是个人未找到latex在pdf中如何显示的问题,如果数学公式转存图片然后放pdf中又会存在公式图片太长超过pdf宽度导致公式线上不全的问题

实现效果

在这里插入图片描述

技术问题

要完成数学试卷一键下载成zip包,需要解决几个技术问题
1、 latex、katex 转word 的数学公式标准
2、 试卷中图片大小、格式问题等比例缩放问题
3、 导出的性能问题
4、word版本,(我这里使用的word2019),200个学生60秒完成导出

解决技术问题

1、首先latex katex数学公式转word公式标准omml,之前了解过latex转图片,或者使用mathml标准在浏览器显示然后通过html转pdf或者word ,主要是因数学公式在网页上线上使用mathjax 处理,在java上没有找到办法在java中加载代码,当然个人尝试过使用javax.script.ScriptEngine 去执行js代码来处理,ScriptEngine 无法获取到doment对象,因此放弃了使用html 转word或pdf的方案 。采用fmath包与 latex_toword包 直接转omml,这两个包经过测试部分公式无法转换成功,
2、目前采用的方案是先将latex转mathml转omml、latex转mathml使用fmath转出来的mathml1.0标准,因此在转omml转出的公式无法在word显示或者导致word报错,word无法打开等问题。因此放弃使用fmath,经过大量的实现找替代方案终于找到
3、mathml 转omml ,通过xsl 执行转换

 <dependency>
			<groupId>com.thoughtworks.xstream</groupId>
			<artifactId>xstream</artifactId>
			<version>1.4.11.1</version>
			<scope>compile</scope>
		</dependency>

可以完美解决
/**
* latex 转 mathml
* @param latex
* @return mathml
* @throws IOException
/
public String toMath(String latex) throws IOException {
SnuggleEngine engine = new SnuggleEngine();
SnuggleSession session = engine.createSession();
/
加载、存储、操作和处理MathML XML文档的API。 */
SnuggleInput input = new SnuggleInput(latex);
session.parseInput(input);
String xmlString = session.buildXMLString();
return xmlString;
}

/**
   *  mathml 转omml
    * xml:是解析的内容
    */
   @SneakyThrows
   public static String xslConvert(String xml) throws FileNotFoundException {
   	TransformerFactory tFac = TransformerFactory.newInstance();
   	StringWriter writer = new StringWriter();
   	StringBuffer stringBuilder=new StringBuffer();
   	try {
   		Transformer t = tFac.newTransformer(new StreamSource(new StringReader(xslString)));
   		Source source = new StreamSource(new StringReader(xml));
   		Result result = new StreamResult(writer);
   		t.transform(source, result);
   		stringBuilder.append(writer.getBuffer().toString());
   	} catch (TransformerException e) {
   		//stringBuilder.append("公式转换出错");
   		e.printStackTrace();
   	} finally {
   		if(writer!=null){
   			writer.close();
   		}
   	}
   	return stringBuilder.toString();
   }
   ```
   今天就先写到这儿。








  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值