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 概念和机制 概念 信号在生活中随处可见,如:古代战争中摔杯为号、现代战争中的信号弹、体育比赛中使用的信号枪他们都有共性:简单、不能携带大量信息、满足…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...

ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...