Python 如何将Latex转换成Word公式?
好久没写博客啦! 最近帮女朋友(数学老师)搞了个题目转成Word的小工具。情景就是,我们在一些图片里获取到数学题目时通常会使用到ocr
技术,但是呢通过 ocr给到的数学公式是Latex表达式, 这也就是为什么我们用识图软件或者手机微信等自带的识别不了数学公式,识别了粘贴到word中又变成了乱码文本。但是ocr识别不是这篇博客的内容 那么如何将Latex表达式写入到Word中呢?
Latex在线工具链接:
踩坑经历:
-
sympy
可以解析Latex表达式(但是式子中有%解析会报错),解析完了是一个个节点对象需要自己识别组装word的oxml数学公式节点 -
plasTeX
chatgpt说的是可以很好的识别解析,可以自定义渲染器进行组装word的oxml数学公式节点。但是并没有按理想的情况解析 -
最后无意间了解到了mathml 它是以xml格式来展示数学公式而且可以通过
latex2mathml
库很好的进行转换。那么转换一下思路,既然不能直接将Latex转换成word的oxml那我们可以Latex
->mathml
->oxml
再通过python-docx写入到段落的文本对象中-
然后我就搜到了这样一篇文章: python-docx/issues这是在github上的python-docx库中的一个问题(Insert MathML as plain text for Word 2010 to render it as an equation) 将MathML作为Word 2010的纯文本插入,能让它展示为word的公式
-
有一个名叫peepall的大佬的回答并且已经解决了这个问题:
I've managed to make it work. However, you must use the MathML to Office MathML stylesheet in order to transform the MathML data into Office-compatible MathML.
The stylesheet is installed along with Microsoft Office and you can find it in:
C:\Program Files (x86)\Microsoft Office\Office14\MML2OMML.XSL
.#!/bin/env python # coding: utf-8 from lxml import etree # Convert MathML (MML) into Office MathML (OMML) using a XSLT stylesheet tree = etree.fromstring(mathml_string) xslt = etree.parse(mml2omml_stylesheet_path) transform = etree.XSLT(xslt) new_dom = transform(tree) paragraph = doc.add_paragraph() paragraph._element.append(new_dom.getroot())
You may also need to remove any namespace from the `` tag before transforming it into Office MathML. Let me know if it works for you too.
-
他说如果要将MathML数据转换成Office兼容的MathMl,需要使用
MathML to Office MathMl
样式表,如果你安装了Office那么你可以在C:\Program Files (x86)\Microsoft Office\Office14\MML2OMML.XSL
中找到它
-
解决
综上,我现在有一个Latex表达式我需要先使用latex2mathml
库,将其转换成mathml,再通过上述的办法转换成oxml写入word,下面是我的示例(如果你需要MML2OMML文件可以在这里下载):
import latex2mathml.converter
from docx import Document
from lxml import etree
def latex_to_mathml(latex_str: str) -> str:
"""
latex 转成 mathml表达式
:param latex_str: latex字符串
:return: mathml表达式
"""
return latex2mathml.converter.convert(latex_str)
xslt = etree.parse(r"./plug/MML2OMML.XSL")
xslt_transform = etree.XSLT(xslt)
def mathml_to_oxml(mathml_str: str):
"""
mathml表达式 转换成word的oxml
:param mathml_str: mathml表达式
:return: word的oxml dom
"""
mathml_xml = etree.fromstring(mathml_str)
return xslt_transform(mathml_xml).getroot()
def latex_to_oxml(latex_str: str):
mathml_str = latex_to_mathml(latex_str)
return mathml_to_oxml(mathml_str)
if __name__ == '__main__':
latex_str = r'\frac{\frac{a}{c}}{b}\times d\%'
# 创建一个新的 Word 文档
doc = Document()
# 添加一个段落
paragraph = doc.add_paragraph()
# 创建一个 run 对象
run = paragraph.add_run()
run._element.append(latex_to_oxml(latex_str))
# 保存文档
doc.save('example.docx')
如果你还有任何疑问或者更好的解决方案可以留言或者联系我QQ:1126184155