当前位置: 首页 > article >正文

phpword读取word docx文档文本及图片转html格式

最近在做一个PHP读取word文档功能,搜索一圈后决定选择用phpword第三方组件。
在这里插入图片描述

composer安装phpWord

composer require phpoffice/phpword

如果你的文件是doc格式,直接另存为一个docx就行了;如果你的doc文档较多,可以下一个批量转换工具:http://www.batchwork.com/en/doc2doc/download.htm

关键点

  • 对齐方式:PhpOffice\PhpWord\Style\Paragraph -> getAlignment()

  • 字体名称:\PhpOffice\PhpWord\Style\Font -> getName()

  • 字体大小:\PhpOffice\PhpWord\Style\Font -> getSize()

  • 是否加粗:\PhpOffice\PhpWord\Style\Font -> isBold()

  • 读取图片:\PhpOffice\PhpWord\Element\Image -> getImageStringData()

  • ba64格式图片数据保存为图片:file_put_contents( i m a g e S r c , b a s e 6 4 d e c o d e ( imageSrc, base64_decode( imageSrc,base64decode(imageData))

完整代码

require './vendor/autoload.php';

function docx2html($source)
{
    $phpWord = \PhpOffice\PhpWord\IOFactory::load($source);
    $html = '';
    foreach ($phpWord->getSections() as $section) {
        foreach ($section->getElements() as $ele1) {
            $paragraphStyle = $ele1->getParagraphStyle();
            if ($paragraphStyle) {
                $html .= '<p style="text-align:'. $paragraphStyle->getAlignment() .';text-indent:20px;">';
            } else {
                $html .= '<p>';
            }
            if ($ele1 instanceof \PhpOffice\PhpWord\Element\TextRun) {
                foreach ($ele1->getElements() as $ele2) {
                    if ($ele2 instanceof \PhpOffice\PhpWord\Element\Text) {
                        $style = $ele2->getFontStyle();
                        $fontFamily = mb_convert_encoding($style->getName(), 'GBK', 'UTF-8');
                        $fontSize = $style->getSize();
                        $isBold = $style->isBold();
                        $styleString = '';
                        $fontFamily && $styleString .= "font-family:{$fontFamily};";
                        $fontSize && $styleString .= "font-size:{$fontSize}px;";
                        $isBold && $styleString .= "font-weight:bold;";
                        $html .= sprintf('<span style="%s">%s</span>',
                            $styleString,
                            mb_convert_encoding($ele2->getText(), 'GBK', 'UTF-8')
                        );
                    } elseif ($ele2 instanceof \PhpOffice\PhpWord\Element\Image) {
                        $imageSrc = 'images/' . md5($ele2->getSource()) . '.' . $ele2->getImageExtension();
                        $imageData = $ele2->getImageStringData(true);
                        // $imageData = 'data:' . $ele2->getImageType() . ';base64,' . $imageData;
                        file_put_contents($imageSrc, base64_decode($imageData));
                        $html .= '<img src="'. $imageSrc .'" style="width:100%;height:auto">';
                    }
                }
            }
            $html .= '</p>';
        }
    }

    return mb_convert_encoding($html, 'UTF-8', 'GBK');
}



$dir = str_replace('\\', '/', __DIR__) . '/';
$source = $dir . 'test.docx';
echo docx2html($source);

补充

很明显,这是一个简陋的word读取示例,只读取了段落的对齐方式,文字的字体、大小、是否加粗及图片等信息,其他例如文字颜色、行高。。。等等信息都忽悠了。需要的话,请自行查看phpWord源码,看\PhpOffice\PhpWord\Style\xxx 和 \PhpOffice\PhpWord\Element\xxx 等类里有什么读取方法就可以了

以下方法直接获取到完整的html

$phpWord = \PhpOffice\PhpWord\IOFactory::load('xxx.docx');
$xmlWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, "HTML");
$html = $xmlWriter->getContent();

注:html内容里包含了head部分,如果只需要style和body的话,需要自己处理一下;然后图片是base64的,要保存的话,也需要自己处理一下
base64数据保存为图片请参考上面代码

如果只想获取body里的内容,可以参考 \PhpOffice\PhpWord\Writer\HTML\Part\Body 里的 write 方法

$phpWord = \PhpOffice\PhpWord\IOFactory::load('xxxx.docx');
$htmlWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, "HTML");
$content = '';
foreach ($phpWord->getSections() as $section) {
    $writer = new \PhpOffice\PhpWord\Writer\HTML\Element\Container($htmlWriter, $section);
    $content .= $writer->write();
}
echo $content;exit;

图片的处理的话,暂时没有好办法能在不修改源码的情况下处理好,改源码的话,相关代码在 \PhpOffice\PhpWord\Writer\HTML\Element\Image 里

public function write()
{
    if (!$this->element instanceof ImageElement) {
        return '';
    }
    $content = '';
    $imageData = $this->element->getImageStringData(true);
    if ($imageData !== null) {
        $styleWriter = new ImageStyleWriter($this->element->getStyle());
        $style = $styleWriter->write();
        // $imageData = 'data:' . $this->element->getImageType() . ';base64,' . $imageData;
        $imageSrc = 'images/' . md5($this->element->getSource()) . '.' . $this->element->getImageExtension();
        // 这里可以自己处理,上传oss之类的
        file_put_contents($imageSrc, base64_decode($imageData));

        $content .= $this->writeOpening();
        $content .= "<img border=\"0\" style=\"{$style}\" src=\"{$imageSrc}\"/>";
        $content .= $this->writeClosing();
    }

    return $content;
}

http://www.kler.cn/a/317515.html

相关文章:

  • 【大数据学习 | HBASE高级】storeFile文件的合并
  • 分布式锁实践方案
  • Vector 深度复制记录
  • ssm100医学生在线学习交流平台+vue(论文+源码)_kaic
  • 知识图谱6:neo4j查询语句
  • 代码 RNN原理及手写复现
  • ElasticSearch分页查询性能及封装实现
  • 为什么推荐使用英文版LabVIEW
  • linux-网络管理-网络配置
  • 直播美颜工具的开发详解:基于视频美颜SDK的解决方案
  • java项目之基于springboot的医院资源管理系统源码
  • 【Linux 从基础到进阶】 Xen 虚拟化技术应用
  • 【实践功能7】前端实现截屏
  • Leetcode算法基础篇-递归算法
  • Spring事务类型及传播行为实战指南
  • JEDEC DDR4 SRAM standard
  • go 读取excel数据存储到mysql
  • 案例研究丨国控星鲨利用DataEase释放数据潜能,重塑业务视野
  • 从底层原理上解释 ClickHouse 的索引
  • leetcode 205.同构字符串
  • 如何快速上手一个Github的开源项目
  • C++ 9.24
  • 如何使用ssm实现疫苗预约系统+vue
  • 使用synchronized锁住字符串
  • Shire 智能体市场:IDE 一键安装多智能体,协同打造集体智慧 Copilot
  • 迎国庆-为祖国庆生python、Java、C各显神通