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.xdnf.cn/news/145587.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Lingo求解器基本语法

Lingo是一款用于线性规划和整数规划的数学建模和求解软件&#xff0c;被广泛应用于运筹学、生产优化、供应链管理等领域。今天与大家一起来熟悉一下它的基本语法 Lingo基本语法 1、定义目标函数为MIN&#xff0c;MAX. 2、以一个分号“&#xff1b;”结尾。除SETS,ENDSETS,D…

煤矸石检测数据集(yolo)

yolo煤矸石检测 数据集 pt模型 界面&#xff0c; ✓3091张图片和txt标签&#xff0c;标签类别两类&#xff1a;“coal”、“rock”。 ✓适用于煤矸石识别&#xff0c;深度学习&#xff0c;机器学习&#xff0c;yolov5 yolov6 yolov7 yolov8 yolov9 yolov10&#xff0c;Python 煤…

Nvidia的高级研究科学家Jim Fan预计在未来两到三年内,机器人技术将取得重大进展

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Wacom 和 Splashtop 携手共赴 IBC 2024 展会,宣布向欧洲市场隆重推出 Wacom Bridge

2024年9月10日 荷兰阿姆斯特丹&德国杜塞尔多夫 Wacom 是数位笔技术的全球领袖&#xff0c;Splashtop 是高性能远程访问解决方案领域的先驱&#xff0c;双方宣布已在欧洲隆重推出 Wacom Bridge&#xff0c;目前 Splashtop Enterprise 和 Splashtop Business Access Perform…

【算法】BFS 系列之 多源 BFS

【ps】本篇有 4 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1&#xff09;01 矩阵 .1- 题目解析 .2- 代码编写 2&#xff09;飞地的数量 .1- 题目解析 .2- 代码编写 3&#xff09;地图中的最高点 .1- 题目解析 .2- 代码编写 4&#xff09;地图分析 .1- 题…

英集芯IP5912:集成开关充电功能的低功耗8位POWER MCU芯片

英集芯IP5912是一款功能丰富的、集成了降压充电管理功能的8位MCU芯片&#xff0c;它内置了一个5V输入的同步降压充电DC-DC&#xff0c;功率管也是内置的&#xff0c;同时提供最大1.5A的充电电流。封装方式采用SOP16&#xff0c;方案应用时只需要很少的外围器件&#xff0c;就可…

Visual Studio 2022 - QT 环境中文字符乱码问题

Visual Studio 2022 - QT 环境中文字符乱码问题 一、Visual Studio 2022 - Qt 环境 在 QT 中使用中文字符串常会出现乱码现象&#xff0c;如下&#xff1a;以下提供了几个解决方法&#xff0c;仅供参考 QString str "百香果真是一直可爱的小猫咪"; qDebug() <…

大数据-142 - ClickHouse 集群 副本和分片 Distributed 附带案例演示

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Tcping:一款实用的端口存活检测工具

简介 tcping 是一个基于TCP协议的网络诊断工具,通过发送 TCP SYN/ACK包来检测目标主机的端口状态。 官网:tcping.exe - ping over a tcp connection 优点: (1)监听服务器端口状态:tcping 可以检测指定端口的状态,默认是80端口,也可以指定其他端口。 (2)显示ping返…

ESXI主机证书报错

VCENTER提示主机证书状态异常 没有虚拟机运行 查看状态发现即将过期&#xff08;但其实已经过期了&#xff09; 点击更新即可&#xff0c;当有虚拟机运行时&#xff0c;不能直接更新证书。

探索自闭症寄宿学校的专属教育模式

在自闭症儿童教育的探索之路上&#xff0c;寄宿学校作为一种特殊的教育形式&#xff0c;正逐渐展现出其独特的优势与价值。这些学校不仅为自闭症儿童提供了一个安全、稳定的生活环境&#xff0c;更通过专属的教育模式&#xff0c;帮助他们逐步克服障碍&#xff0c;实现潜能的最…

掌握数据中心虚拟化:关键挑战与解决方案

数据中心虚拟化是使用云软件平台将物理数据中心转变为数字数据中心的过程&#xff0c;使企业能够远程访问信息和应用程序。它包括在数据中心内创建物理基础设施的多个虚拟版本&#xff0c;通过将服务器、存储和网络等资源划分为虚拟实体来实现资源的高效利用。 虚拟化环境中的关…

关于 NLP 深度学习的核心流程

基本流程实现的先后顺序&#xff08;每一步都包含很多技术点&#xff09;&#xff1a; 选定语言模型结构 关于语言模型&#xff1a; 作用 判断那一句话相对更合理&#xff0c;相对不合理的会得到较底的分值&#xff1a; 挑选成句概率分值最高的评价指标&#xff1a;PPL&…

微服务架构中的负载均衡与服务注册中心(Nacos)

1. 负载均衡&#xff1a;解决实际业务问题 1.1 业务场景思考 想象一个电子商务平台的微服务架构。我们有一个订单服务和多个用户服务实例。当订单服务需要调用用户服务时&#xff0c;它如何选择具体调用哪一台用户服务器&#xff1f;这就是负载均衡要解决的核心问题。 1.2 常…

主流卷积神经网络CNN总结

ResNet&#xff08;2015&#xff09;残差神经网络 残差结构 ResNet50具体卷积结构图 ResNeXt&#xff08;2016&#xff09;加入了分组卷积的思想&#xff0c;将原ResNet网络中的block替换成由group分组的block&#xff0c;两者得到的feature map一致&#xff0c;只是参数量更少…

《微软飞行模拟2024》储存空间需求仅不到前作的1/5

根据微软在最新一期 Xbox Wire 中的介绍&#xff0c;将于今年11 月登陆 Xbox Series X|S 主机的《微软飞行模拟2024》将比前作占用空间小很多。 微软解释了为何新作的文件大小仅为30GB&#xff0c;约为前作的五分之一。简单来说&#xff0c;微软使用了云流媒体传输技术。公司还…

SEC重拳打击币安

美国SEC于上周四提交针对币安的拟议修订投诉&#xff0c;重点关注交易所的代币上市流程。 1.美国证券交易委员会对币安提出拟议的修订申诉。 2.SEC在驳回币安最初诉讼的动议中基本获胜&#xff0c;但在驳回动议的命令中&#xff0c;关于某些代币的若干问题仍未得到解答。 3.SEC…

木马加载器通用套路

木马加载器通用套路 加载器 木马有两种类型&#xff0c;第一种是自己写的木马&#xff0c;作为远控客户端&#xff0c;第二种是加载器 加载器就是把C2的shellcode加载到目标机器的过程。目前攻防场景下&#xff0c;主流手段是通过加载器的方式实现远控 既然是加载器&#xff…

C#开源的一个能利用Windows通知栏背单词的软件

前言 今天给大家推荐一个C#开源且免费的能利用Windows通知栏背单词的软件&#xff0c;可以让你在上班、上课等恶劣环境下安全隐蔽地背单词&#xff08;利用摸鱼时间背单词的软件&#xff09;&#xff1a;ToastFish。 操作系统要求 目前该软件只支持Windows10及以上系统&…

基于uniapp的民宿酒店预订系统(后台+小程序)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…