PHPword解析内容支撑
因有些功能不支持,所以新增了某些功能,以防后期变动不好变更,手动做个记录
- 将公式替换成指定的符号,读取到 html 后读取 xml 解析公式,根据标记符号进行替换
文件名PhpOffice\PhpWord\Shared\XMLReader.php
public function getDomFromZip($zipFile, $xmlFile){if (file_exists($zipFile) === false) {throw new \Exception('Cannot find archive file.');}$zip = new \ZipArchive();$zip->open($zipFile);$content = $zip->getFromName($xmlFile);$zip->close();if ($content === false) {return false;}if($xmlFile === 'word/document.xml'){// 字符串替换,将公式替换成$Math$$content = preg_replace('/<m:oMath>[\s|\S]*?<\/m:oMath>/', '<w:r><w:t>$Math$</w:t></w:r>', $content);// 后续在将$Math$标记替换为对应的处理过的mathml公式(或latex表达式、公式图片)}return $this->getDomFromString($content);}
公式转换传送大飞机来咯!
- 表格的单元格宽度的单位
文件名PhpOffice\PhpWord\Reader\Word2007\AbstractPart.php
protected function readTable(){//...foreach ($rowNodes as $rowNode) {if ('w:trPr' == $rowNode->nodeName) { // Row style// @todo Do something with row style} elseif ('w:tc' == $rowNode->nodeName) { // Cell$cellWidth = $xmlReader->getAttribute('w:w', $rowNode, 'w:tcPr/w:tcW');$cellStyle = null;$cellStyleNode = $xmlReader->getElement('w:tcPr', $rowNode);if (!is_null($cellStyleNode)) {$cellStyle = $this->readCellStyle($xmlReader, $cellStyleNode);}$cell = $row->addCell($cellWidth, $cellStyle);// ----------以下为新增部分// 设置单位$cellUnit = $xmlReader->getAttribute('w:type', $rowNode, 'w:tcPr/w:tcW');$cell->setUnit($cellUnit);// ----------以上为新增部分$cellNodes = $xmlReader->getElements('*', $rowNode);foreach ($cellNodes as $cellNode) {if ('w:p' == $cellNode->nodeName) { // Paragraph$this->readParagraph($xmlReader, $cellNode, $cell, $docPart);}}}}}//...
}
- 内容的对齐样式
文件名Element\AbstractContainer.php
protected function addElement($elementName){$elementClass = __NAMESPACE__ . '\\' . $elementName;$this->checkValidity($elementName);// Get arguments$args = func_get_args();$withoutP = in_array($this->container, array('TextRun', 'Footnote', 'Endnote', 'ListItemRun', 'Field'));if ($withoutP && ($elementName == 'Text' || $elementName == 'PreserveText')) {// 此处不知道为何要把样式移除,移除后的段落无alignment样式了,故把此代码注释了,不知会有何遗留问题,待发现。// $args[3] = null; // Remove paragraph style for texts in textrun}// ........}
- 新增首行缩进功能
文件Style\Paragraph.php
/*** 缩进字符** @var integer* @Author * @DateTime 2022-11-03*/private $firstLineChars = 0; //新增属性// 修改方法public function getStyleValues(){$styles = array(// ...'indentation' => $this->getIndentation(),// ------新增内容开始'firstLineChars' => $this->getFirstLineChars(),// ------新增内容结束'spacing' => $this->getSpace(),'pagination' => array('widowControl' => $this->hasWidowControl(),'keepNext' => $this->isKeepNext(),'keepLines' => $this->isKeepLines(),'pageBreak' => $this->hasPageBreakBefore(),),// ...);return $styles;}新增方法/*** Get getFirstLineChars** */public function getFirstLineChars(){return $this->firstLineChars;}/*** Set getFirstLineChars** */public function setFirstLineChars($num = 0){$this->firstLineChars = $num;}
文件Reader\Word2007\AbstractPart.php
protected function readParagraphStyle(XMLReader $xmlReader, \DOMElement $domNode){if (!$xmlReader->elementExists('w:pPr', $domNode)) {return null;}$styleNode = $xmlReader->getElement('w:pPr', $domNode);$styleDefs = array('styleName' => array(self::READ_VALUE, array('w:pStyle', 'w:name')),'alignment' => array(self::READ_VALUE, 'w:jc'),'basedOn' => array(self::READ_VALUE, 'w:basedOn'),'next' => array(self::READ_VALUE, 'w:next'),'indent' => array(self::READ_VALUE, 'w:ind', 'w:left'),'hanging' => array(self::READ_VALUE, 'w:ind', 'w:hanging'),'firstLineChars' => array(self::READ_VALUE, 'w:ind', 'w:firstLineChars'), //新增首行缩进'spaceAfter' => array(self::READ_VALUE, 'w:spacing', 'w:after'),'spaceBefore' => array(self::READ_VALUE, 'w:spacing', 'w:before'),'widowControl' => array(self::READ_FALSE, 'w:widowControl'),'keepNext' => array(self::READ_TRUE, 'w:keepNext'),'keepLines' => array(self::READ_TRUE, 'w:keepLines'),'pageBreakBefore' => array(self::READ_TRUE, 'w:pageBreakBefore'),'contextualSpacing' => array(self::READ_TRUE, 'w:contextualSpacing'),'bidi' => array(self::READ_TRUE, 'w:bidi'),'suppressAutoHyphens' => array(self::READ_TRUE, 'w:suppressAutoHyphens'),);return $this->readStyleDefs($xmlReader, $styleNode, $styleDefs);}
- 读取单元格的边框和颜色
文件名PhpOffice\PhpWord\Reader\Word2007\AbstractPart.php
/*** Read w:tcPr** @param \PhpOffice\PhpWord\Shared\XMLReader $xmlReader* @param \DOMElement $domNode* @return array*/private function readCellStyle(XMLReader $xmlReader, \DOMElement $domNode){$styleDefs = array('vlign' => array(self::READ_VALUE, 'w:vAlign'),'textDirection' => array(self::READ_VALUE, 'w:textDirection'),'gridSpan' => array(self::READ_VALUE, 'w:gridSpan'),'vMerge' => array(self::READ_VALUE, 'w:vMerge'),'bgColor' => array(self::READ_VALUE, 'w:shd', 'w:fill'),);// ------新增内容开始$borders = array('top', 'left', 'bottom', 'right');if ($xmlReader->elementExists('w:tcBorders', $domNode)) {foreach ($borders as $side) {$ucfSide = ucfirst($side);$styleDefs["border{$ucfSide}Size"] = array(self::READ_VALUE, "w:tcBorders/w:$side", 'w:sz');$styleDefs["border{$ucfSide}Color"] = array(self::READ_VALUE, "w:tcBorders/w:$side", 'w:color');$styleDefs["border{$ucfSide}Style"] = array(self::READ_VALUE, "w:tcBorders/w:$side", 'w:val');}}// ------新增内容结束return $this->readStyleDefs($xmlReader, $domNode, $styleDefs);}
- 解析图片宽度
namespace PhpOffice\PhpWord\Reader\Word2007\AbstractPart.php;
protected function readRunChild(XMLReader $xmlReader, \DOMElement $node, AbstractContainer $parent, $docPart, $paragraphStyle = null, $fontStyle = null){if ($node->nodeName == 'w:drawing') {if (!is_null($target)) {if(strpos($target,'wmf') === false){// 2022/12/28 日新增读取图片宽度$imgShowWidth = $xmlReader->getAttribute('cx', $node, 'wp:inline/wp:extent');if($imgShowWidth == null){$imgShowWidth = $xmlReader->getAttribute('cx', $node, 'wp:anchor/wp:extent');}$imageSource = "zip://{$this->docFile}#{$target}";$parent->addImage($imageSource, null, false, $name,$imgShowWidth);}else{$textContent = "{error:不支持mathtype}";$parent->addText($textContent, $fontStyle, $paragraphStyle);}}}}
相关文章:
PHPword解析内容支撑
因有些功能不支持,所以新增了某些功能,以防后期变动不好变更,手动做个记录 将公式替换成指定的符号,读取到 html 后读取 xml 解析公式,根据标记符号进行替换 文件名PhpOffice\PhpWord\Shared\XMLReader.php public fun…...

回归预测 | MATLAB实现RUN-XGBoost龙格库塔优化极限梯度提升树多输入回归预测
回归预测 | MATLAB实现RUN-XGBoost多输入回归预测 目录 回归预测 | MATLAB实现RUN-XGBoost多输入回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现RUN-XGBoost多输入回归预测(完整源码和数据) 1.龙格库塔优化XGBoost,…...

LLM-TAP随笔——语言模型训练数据【深度学习】【PyTorch】【LLM】
文章目录 3、语言模型训练数据3.1、词元切分3.2、词元分析算法 3、语言模型训练数据 数据质量对模型影响非常大。 典型数据处理:质量过滤、冗余去除、隐私消除、词元切分等。 训练数据的构建时间、噪音或有害信息情况、数据重复率等因素都对模型性能有较大影响。训…...
Linux- open() lseek()
文件描述符 文件描述符(File Descriptor,简称 FD)是 UNIX 和 UNIX-like 系统中用于代表和识别打开的文件或其他I/O资源的一种抽象标识。它是一个非负整数,内部由操作系统进行管理和分配。文件描述符可以代表文件、套接字、管道等…...
Halcon Tuple相关算子(一)
(1) tuple_length( : : Tuple : Length) 功能:返回输入元组中元素的个数。 控制输入参数: Tuple:输入元组; 控制输出参数:length:输入元组中元素的个数。 (2) tuple_find( : : Tuple, ToFind : Indices…...

基于图像形态学处理的路面裂缝检测算法matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...................................................... %1:从文件夹中读取多个…...

PY32F003F18之窗口看门狗
一、PY32F003F18窗口看门狗特点: 即使窗口看门狗被禁止,窗口看门狗的"递减计数器"也会继续递减计数。 二、窗口看门狗复位的条件: 1、将"控制寄存器WWDG_CR"中的WDGA1,激活"窗口看门狗计数器等于0x3F"时,则产…...

SpingBoot:整合Mybatis-plus+Druid+mysql
SpingBoot:整合Mybatis-plusDruid 一、特别说明二、创建springboot新工程三、配置3.1 配置pom.xml文件3.2 配置数据源和durid连接池3.2.1 修改application.yml3.2.2 新增mybatis-config.xml 3.3 编写拦截器配置类 四、自动生成代码五、测试六、编写mapper.xml&#…...

计算机视觉与深度学习-经典网络解析-VGG-[北邮鲁鹏]
目录标题 VGG参考VGG网络贡献使用尺寸更小的$3 \times 3$卷积串联来获得更大的感受野放弃使用$11 \times 11$和$5 \times 5$这样的大尺寸卷积核深度更深、非线性更强,网络的参数也更少;去掉了AlexNet中的局部响应归一化层(LRN)层。 网络结构主要改进输入…...

入门级制作电子期刊的网站推荐
随着数字化时代的到来,越来越多的人开始尝试制作自己的电子期刊。如果你也是其中的一员,那么这篇文章可以帮助你制作电子期刊。无论是初学者还是有一定经验的制作者,都能快速完成高质量的电子期刊制作 小编经常使用的工具是-----FLBOOK在线制…...

软件测试内容整理
1. 软件测试 1.1. 定义 软件测试(英语:Software Testing),描述一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。换句话说,软件测试是一种实际输出与预期输出之间的审核或者比较过程。 软件测试的经典定…...

UniAccess Agent卸载
异常场景: UniAccess Agent导致系统中的好多设置打不开 例如:ipv4的协议,注册表,host等等 需要进行删除,亲测有效,及多家答案平凑的 借鉴了这位大神及他里面引用的大神的内容 https://blog.csdn.net/weixin_44476410/article/details/121605455 问题描述 这个进…...

【C++】C++11——构造、赋值使用条件和生成条件
移动构造和移动赋值生成条件移动构造和移动赋值调用逻辑强制生成默认函数的关键字default禁止生成默认函数的关键字delete 移动构造和移动赋值生成条件 C11中新增的移动构造函数和移动赋值函数的生成条件为: 移动构造函数的生成条件:没有自己实现的移动…...

【LeetCode热题100】--56.合并区间
56.合并区间 排序: 如果按照区间的左端点排序,那么在排完序的列表中,可以合并的区间一定是连续的,如下图所示,标记为蓝色、黄色和绿色的区间分别可以合并为一个大区间,它们在排完序的列表中是连续的 算法&a…...

opencv dnn模块 示例(17) 目标检测 object_detection 之 yolo v5
在前文【opencv dnn模块 示例(16) 目标检测 object_detection 之 yolov4】介绍的yolo v4后的2个月,Ultralytics发布了YOLOV5 的第一个正式版本,其性能与YOLO V4不相伯仲。 文章目录 1、Yolo v5 和 Yolo v4 的区别说明1.1、Data Augmentation - 数据增强1…...

关于安卓SVGA浅尝(一)svgaplayer库的使用
关于安卓SVGA浅尝(一)使用 相关链接 SVGA官网 SVGA-github说明文档 背景 项目开发,都会和动画打交道,动画的方案选取,就有很多选择。如Json动画,svga动画,gif等等。各有各的优势。目前项目中…...

【LFU】一文让你弄清 Redis LFU 页面置换算法
上一次,相信大家已经知道关于 LRU 页面置换算法的思想和实现了,这里可以一键直达: 【LRU】一文让你弄清 Redis LRU 页面置换算法 Redis 的淘汰策略中,关于 LFU 页面置换算法,今天咱们来捋一捋到底思想是啥࿰…...

Python爬虫实战:用简单四步爬取小红书图片
小红书是一个热门的社交分享平台,汇聚了大量精美的图片。如果您希望保存或使用这些图片,本文将为您详细介绍如何使用Python爬虫轻松爬取小红书图片。 一、安装必要的库 在开始之前,确保您已经安装了以下Python库: requests&#…...
行为型模式-解释器模式
提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 意图:给定一个语言,定义它的文法表示,并定义一个解释…...

Linux系统编程(五):信号
参考引用 UNIX 环境高级编程 (第3版)黑马程序员-Linux 系统编程 1. 信号基础理论 1.1 概念和机制 概念 信号在生活中随处可见,如:古代战争中摔杯为号、现代战争中的信号弹、体育比赛中使用的信号枪他们都有共性:简单、不能携带大量信息、满足…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...