PHP读取WORD中的数学公式

PHP解析WORD中的公式

我这里用的是获取word文件中的XML信息,在XML中将公式转换为 MathML语言描述。
PHP: 7.3
扩展:zip

获取WORD中的XML信息

		date_default_timezone_set('Asia/Shanghai');
       $archive = new \ZipArchive();
       $result  = $archive->open($filename);
       if ($result === true) {
     
           $document = $archive->getFromName('word/document.xml');
       } else {
     
           //抛出异常 不能正确打开docx文件
       }

$document 中就是获取的word的xml数据。

WORD公式在XML中是如何描述的

例如下面这个公式:
在这里插入图片描述
对应的word中的XML语言描述是:


     
         
             
             
             
             
             
                 
                     
                         
                         
                     
                 
             
         
         ∃x∃y A(x,y)⇔∀y∃x A(x,y)
     
 

可以看到 公式是用 标签包裹的

所以基本思路就是 使用正则匹配所有 m:oMath 标签中的内容 转换为 MathML语言 然后就可以在HTML页面展示了

匹配和转换



        $xml = preg_replace_callback('/()([\s\S]*?)(<\/m:oMath>)/', function ($matches) {
     

            $mml = $this->xml_document . '' . $matches[0] . '';
            // var_dump($mml);
            $domDocument = new DomDocument();
            $domDocument->loadXML($mml);
            $numberings = $domDocument->getElementsByTagNameNS('http://schemas.openxmlformats.org/wordprocessingml/2006/main', 'body');
            $numberings = $numberings->item(0);
            $xsl        = new DOMDocument;
            $xsl->load("../OMML2MML.XSL");
            $processor = new XSLTProcessor();
            $processor->importStyleSheet($xsl);
            $omml                = $processor->transformToXML($numberings);
            $omml                = str_replace('', '', $omml);
            $omml                = str_replace('xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"', '', $omml);
            $omml                = str_replace("mml:", '', $omml);
            $omml                = str_replace("\n", '', $omml);
            $num                 = count($this->mml_arr);
            $this->mml_arr[$num] = $omml;
            return "{mosoteach_math_xml$num}";
        }, $xml);

        $xml = trim(strip_tags($xml));
        
		//...

        foreach ($this->mml_arr as $key => $value) {
     
            $str = "{mosoteach_math_xml$key}";
            $xml = str_replace($str, $value, $xml);
        }

上面是匹配的部分代码 我会把完成代码的压缩包放到文末。

如何向WORD中写入公式

很遗憾的是 我暂时没有找到直接向WORD中写入 oMath 这种标签的方法,只能先将 MathML 数据转为图片,然后插入WORD中

MathML 数据转图片我是用的接口,百度上有很多这种服务 我用的是这个:

https://www.wiris.net/demo/editor/render?mml=$mml

注意这个接口的mml参数 需要用urlencode函数处理一下


代码地址: https://download.csdn.net/download/qq_39281715/15936083

你可能感兴趣的:(PHP,php)