最近一段时间一直在研究利用php脚本让word文档转html的方法,下面就记录了一个利用php的插件phpword实现word文档转html的方法。

安装phpword

通过下面的命令来安装 phpword插件

composer require phpoffice/phpword

phpword实现 word 转 html 的方法示例

$info = 'ee.docx';
//加载word文件 并 通过getSections获取word文档的全部元素
$sections = \PhpOffice\PhpWord\IOFactory::load($info)->getSections();
//定义html变量用于存储word文本内容
$html = '';
//循环所有元素
foreach($sections as $section) {
    //获取当前元素的所有子元素
    $elements = $section->getElements();
    //循环当前子元素
    foreach ($elements as $eky => $evl) {
        $html .= '<p>';
        if ($evl instanceof PhpOffice\PhpWord\Element\TextRun) { //判断是否普通文本
            $content_elements = $evl->getElements();
            foreach ($content_elements as $eky2 => $evl2) {
                $html .= elementHandler($evl2, $evl);
            }
        }elseif($evl instanceof PhpOffice\PhpWord\Element\PreserveText){ //判断是否保留元素(如自动生成链接的网址元素)
            $data = $evl->getText();
            $find = array('{','HYPERLINK','}',' ','"','f','g');
            $replace = '';
            $resText = str_replace($find, $replace, $data);
            if(isset($resText)){
                $html .= $resText[0];
            }
        }elseif($evl instanceof PhpOffice\PhpWord\Element\Table){
            $all_table_elements = $evl->getRows();
            $html .= '<table style="margin:0;padding:0;border-collapse:collapse;border-spacing:0;" >';
            foreach ($all_table_elements as $tky => $tvl) {
                $html .= '<tr style="padding:0">';
                $all_table_cells = $tvl->getCells();
                foreach ($all_table_cells as $cky => $cvl){
                    $cell_elements = $cvl->getElements();
                    //获取表格宽度(返回单位为:缇)
                    $td_width = $cvl->getWidth();
                    $td_width_px = round($cvl->getWidth()/15,0);
                    $html .= '<td style="border: 1px solid #777777;padding:2px 5px;width:'.$td_width_px.'">';
                    foreach ($cell_elements as $cl){
                        //判断当存在elements属性时执行
                        if( property_exists($cl, 'elements') ){
                            $content_elements = $cl->getElements();
                            foreach ($content_elements as $eky2 => $evl2) {
                                $html .= elementHandler($evl2, $cl);
                            }
                        }
                    }
                    $html .= '</td>';
                }
                $html .= '</tr>';
            }
            $html .= '</table>';
        }
        $html .= '</p>';
    }
}
//保存为 html 文件
file_put_contents('2.html',$html);
//输出 html 内容到浏览器
echo $html;
function elementHandler($end_element, $parent_element)
{
    $html = '';
    if ($end_element instanceof PhpOffice\PhpWord\Element\Text) { //判断是否普通文本
        $style = $end_element->getFontStyle();
        //$fontFamily = mb_convert_encoding($style->getName(), 'GBK', 'UTF-8');
        $fontFamily = $style->getName();
        $fontSize = $style->getSize() ? ($style->getSize()/72)*96 : '';
        $isBold = $style->isBold();
        $fontcolor = $style->getColor();
        $styleString = '';
        $fontFamily && $styleString .= "font-family:{$fontFamily};";
        $fontSize && $styleString .= "font-size:{$fontSize}px;";
        $isBold && $styleString .= "font-weight:bold;";
        $fontcolor && $styleString .= "color:{$fontcolor};";
        $html .= sprintf('<span style="%s">%s</span>',
            $styleString,$end_element->getText()
        //mb_convert_encoding($evl2->getText(), 'GBK', 'UTF-8')
        );//dump($end_element->getText());
    }elseif ($end_element instanceof PhpOffice\PhpWord\Element\Link) {  //判断是否链接
        $style = $end_element->getFontStyle();
        //$fontFamily = mb_convert_encoding($style->getName(), 'GBK', 'UTF-8');
        $fontFamily = $style->getName();
        $fontSize = $style->getSize() ? ($style->getSize()/72)*96 : '';
        $isBold = $style->isBold();
        $fontcolor = $style->getColor();
        $styleString = '';
        $fontFamily && $styleString .= "font-family:{$fontFamily};";
        $fontSize && $styleString .= "font-size:{$fontSize}px;";
        $isBold && $styleString .= "font-weight:bold;";
        $fontcolor && $styleString .= "color:{$fontcolor};";
        $html .= sprintf('<a href="%s" style="%s">%s</a>',
            $end_element->getSource(), $styleString, $end_element->getText()
        //mb_convert_encoding($evl2->getText(), 'GBK', 'UTF-8')
        );
    } elseif ($end_element instanceof PhpOffice\PhpWord\Element\Image) { //判断是否图片
        //可以在这里执行自定义方法将图片上传到OSS或者图片服务器哈
        $imageDataTmp = $end_element->getImageStringData(true);
        $imageType = $end_element->getImageType() ? $end_element->getImageType() : 'image/jpg';
        $imageData = 'data:' . $imageType . ';base64,' . str_replace(array("\r\n", "\r", "\n"), "", $imageDataTmp);
        //保存文件
        //$imageSrc = './uploads/' . md5($end_element->getSource()) . '.' . $end_element->getImageExtension();
        //file_put_contents($imageSrc,base64_decode(explode(',',$imageData)[1]));
        $html .= '<img src="'. $imageData .'" style="width:100%;height:auto">';
    }
    return $html;
}

PS:上面的代码只是大致的把逻辑思路,各位如果使用可自行修改代码!