gpt4 book ai didi

java - 如何在 Apache POI Word 中添加与文本内联的多个方程?

转载 作者:行者123 更新时间:2023-12-02 12:09:34 24 4
gpt4 key购买 nike

我正在使用 Apache POI 将带有 Latex 样式方程的文本转换为 MS Word 文档。在一些帮助下,我能够成功地实现它,但如果该行有多个方程,那么它会产生错误的结果。

以下是我的代码:

import java.io.*;
import org.apache.poi.xwpf.usermodel.*;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
import org.openxmlformats.schemas.officeDocument.x2006.math.CTOMath;
import org.openxmlformats.schemas.officeDocument.x2006.math.CTOMathPara;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;

import uk.ac.ed.ph.snuggletex.SnuggleInput;
import uk.ac.ed.ph.snuggletex.SnuggleEngine;
import uk.ac.ed.ph.snuggletex.SnuggleSession;

import java.io.IOException;

public class CreateWordFormulaFromMathML {

static File stylesheet = new File("MML2OMML.XSL");
static TransformerFactory tFactory = TransformerFactory.newInstance();
static StreamSource stylesource = new StreamSource(stylesheet);

static CTOMath getOMML(String mathML) throws Exception {
Transformer transformer = tFactory.newTransformer(stylesource);

StringReader stringreader = new StringReader(mathML);
StreamSource source = new StreamSource(stringreader);

StringWriter stringwriter = new StringWriter();
StreamResult result = new StreamResult(stringwriter);
transformer.transform(source, result);

String ooML = stringwriter.toString();
stringwriter.close();

CTOMath ctOMath = CTOMath.Factory.parse(ooML);
return ctOMath.getOMathArray(0);
}

public static void main(String[] args) throws Exception {

XWPFDocument document = new XWPFDocument();

String mstr = "The expression is as: $ax^2 + bx = c$ is easier to understand than $$ax^2 + \\frac{\\sin^{-1}\\theta}{\\cot{-1}} \\times y_1$$ or anything in \\[ ay^2 + b_2 \\theta\\]";

XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();
// run.setText("");

SnuggleEngine engine = new SnuggleEngine();
SnuggleSession session = engine.createSession();

SnuggleInput input = new SnuggleInput(mstr);
session.parseInput(input);

String mathML = session.buildXMLString();
System.out.println("Input " + input.getString() + " was converted to:\n" + mathML + "\n\n");


for(String s : mathML.split("\\s+(?=<math)|(?<=</math>)\\s+")){

if (s.startsWith("<math"))
{
CTOMath ctOMath = getOMML(s);
System.out.println(s);

CTP ctp = paragraph.getCTP();
ctp.setOMathArray(new CTOMath[]{ctOMath});
}
else
{
run.setText(s + " ");
System.out.println(s);
}
}

document.write(new FileOutputStream("CreateWordFormulaFromMathML.docx"));
document.close();

}
}

这会生成一个带有

的文档

表达式为:比 ay^2+b_2\theta 中的 或 更容易理解

注意:(ay^2+b_2\theta) 在字方程格式中是正确的。

我需要的是中间有多个方程的内联文本。

最佳答案

如何解决创建任务Office OpenXML文件如*.docx

Office OpenXML文件如*.docx很简单ZIP文件。我们可以解压它们并查看内部结构。在 *.docx我们发现/word/document.xml在那里我们找到XML它描述了文档结构。对于具有内联公式的段落,我们发现类似:

<w:p>
<w:r>
<w:t>text</w:t>
</w:r>
<m:oMath>... </m:oMath>
<w:r>
<w:t>text</w:t>
</w:r>
<m:oMath>... </m:oMath>
...
</w:p>

所以我们需要多次运行来保存文本,并且在它们之间有多个 <m:oMath>... </m:oMath> .

这就是为什么该段落有 OMathArray CTOMath[] 。并且您的代码确实使用具有 one CTOMath 的新数组覆盖此数组。 每次额外 CTOMath被找到。相反,额外的 CTOMath需要添加到数组中,每次追加CTOMath被发现了。

了解我们可以用org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP做什么段落,我们需要为此提供文档。我发现的最好的是grepcode.com 。在那里我们找到CTP.addNewOMath()CTP.setOMathArray(int, CTOMath) .

因此更改您的代码:

  for(String s : mathML.split("\\s+(?=<math)|(?<=</math>)\\s+")){

if (s.startsWith("<math")) {
CTOMath ctOMath = getOMML(s);
System.out.println(s);

CTP ctp = paragraph.getCTP();
ctp.addNewOMath();
ctp.setOMathArray(ctp.sizeOfOMathArray()-1, ctOMath);
}
else {
run = paragraph.createRun();
run.setText(s + " ");
System.out.println(s);
}
}

应该可以。

关于java - 如何在 Apache POI Word 中添加与文本内联的多个方程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46644488/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com