OffcieMath识别公式内容错误

我的代码:

Document document = new Document("C:\\Users\\11964\\Desktop\\test.docx", loadOptions);
document.getCompatibilityOptions().optimizeFor(MsWordVersion.WORD_2019);
Node[] nodes = document.getChildNodes(NodeType.OFFICE_MATH,true).toArray();
for (Node node:nodes) {
    if (node instanceof OfficeMath officeMath) {
        if (officeMath.getAncestor(NodeType.OFFICE_MATH) == null) {
            System.out.println(officeMath.getText());
        }
    }
}
document.save("tmp.docx");

我的文件:
test.docx (34.6 KB)
输出的时候少了一个字母β。请问是什么原因

@qhkyqhfe 并不总是能够将 OfficeMath 有意义地输出为文本。您可以尝试将公式打印为 MathML:

Document doc = new Document("C:\\Temp\\in.docx");

HtmlSaveOptions opt = new HtmlSaveOptions();
opt.setOfficeMathOutputMode(HtmlOfficeMathOutputMode.MATH_ML);

Iterable<OfficeMath> maths = doc.getChildNodes(NodeType.OFFICE_MATH, true);
for (OfficeMath m : maths)
{
    if (m.getAncestor(NodeType.OFFICE_MATH) == null)
    {
        System.out.println(m.toString(opt));
    }
}

您好。我尝试了多种方法,没有找到一个很好的方式获取原公式的表达式。请问应该如何从MathML中获取原公式呢

@qhkyqhfe 在您的文档中,β 不在 office 数学中。这就是你无法得到它的原因。

您应该把它移到办公室数学中,或者可以使用以下代码:

Document doc = new Document("test.docx");
Iterable<OfficeMath> maths = doc.getChildNodes(NodeType.OFFICE_MATH, true);
for (OfficeMath m : maths) {
    if (m.getAncestor(NodeType.OFFICE_MATH) == null) {
        StringBuilder formulaBuilder = new StringBuilder();
        Node currentNode = m;
        while (currentNode != null) {
            formulaBuilder.append(currentNode.getText());
            currentNode = currentNode.getNextSibling();
        }
        System.out.println(formulaBuilder.toString().trim());
        break;
    }
}

请注意,括号等一些属性只是用于在MS Word文档中显示的设置,因此我们无法在输出中显示它们。

请问如何在保留格式的前提下,正确合并若干个OfficeMath呢

@qhkyqhfe 看来答案在这里 请问如何合并若干个OfficeMath对象?要求保留原有的格式 - #4 by alexey.noskov