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亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...

使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
TCP/IP 网络编程 | 服务端 客户端的封装
设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...
简单介绍C++中 string与wstring
在C中,string和wstring是两种用于处理不同字符编码的字符串类型,分别基于char和wchar_t字符类型。以下是它们的详细说明和对比: 1. 基础定义 string 类型:std::string 字符类型:char(通常为8位)…...

ZYNQ学习记录FPGA(二)Verilog语言
一、Verilog简介 1.1 HDL(Hardware Description language) 在解释HDL之前,先来了解一下数字系统设计的流程:逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端,在这个过程中就需要用到HDL,正文…...