python + word文本框中文字识别并替换【真替换,不只是识别】

news2024/9/27 21:26:09

1. 简单描述

在一些转换场景下,文本框不会被转换,需要先识别成文字内容。
【识别的文字段落可能会和实际看到的效果有些差异,后续还需校对,如下图】。
在这里插入图片描述
不足:除了上面说的那个情况(上图说的问题,有大神解决了可发评论区,不胜感激。),还有就是如果文本框要是还有一些特殊字体样式,或者图片什么的未作处理,读者可自行优化。

2.废话少说,直接上干货

def docx_handle_textbox(word_path, new_word_path=''):
    doc = docx.Document(word_path)
    textbox_flag = False  # 默认不存在
    for para in doc.paragraphs:
        text_box_list = []
        if para._element.xml.find('textbox') != -1:  # 表示文本框
            textbox_flag = True
            # print(para._element.xml)
            # print('该文档存在文本框,需核实替换内容是否正确(主要是文本的顺序)')
            # print( para._element.xml) # /v:group/v:group/v:rect/v:textbox
            # for textbox in para._element.xpath('.//w:r/w:pict/v:group/v:group/v:rect/v:textbox/w:txbxContent/w:p'): # 类型需要相同w, 否则需要指定 namespace

            # ============================================不保留文本框文字样式==================================================
            # for p in para._element.xpath('.//w:p'):
            #     tmp_run_list = []
            #     for run in p.xpath('.//w:t'):
            #         tmp_run_list.append(run.text)
            #     if len(tmp_run_list) > 0:
            #         text_box_list.append(''.join(tmp_run_list))
            #
            # para._element.clear()  # 清除原来的文本框
            #
            # # 【方法一】将一个大文本框作为一整段,不推荐
            # # text_box_content = '\n'.join(text_box_list)
            # # print(text_box_content)
            # # para.text = text_box_content
            #
            # # 【方法二】推荐做法根据文本框里的段进行分段
            # for tbc in text_box_list:
            #     para.insert_paragraph_before(tbc)  # 文本框所在段前插入段落【由于文本框被清除,即在完成了原文本框内容的替换】
            # ==============================================================================================================

            # 保留一些简单样式
            for p in para._element.xpath('.//w:p'):
                tmp_run_list = []
                for run in p.xpath('.//w:r'):  # 一个run的内容
                    tmp_run_list.append(run)
                if len(tmp_run_list) > 0:
                    text_box_list.append(tmp_run_list)

            para._element.clear()  # 清除原来的文本框

            # 【方法一】将一个大文本框作为一整段,不推荐
            # text_box_content = '\n'.join(text_box_list)
            # print(text_box_content)
            # para.text = text_box_content

            # 【方法二】推荐做法根据文本框里的段进行分段
            for tbc in text_box_list:  # tbc可以认为是一个段落

                # 文本框所在段前插入段落【由于文本框被清除,即在完成了原文本框内容的替换】
                insert_para = para.insert_paragraph_before('')  # 插入空字符段落,表示创建一个空段落
                for run_ct in tbc:
                    # 1.添加run
                    run = insert_para.add_run(run_ct.text)

                    # 2.对run进行样式添加
                    # 2.1检查斜体样式
                    if run_ct.xml.find('<w:i/>') != -1:
                        # print(f"文本 '{run_ct.text}' 是斜体。")
                        run.font.italic = True
                    # 2.2检查是否加粗
                    if run_ct.xml.find('<w:b/>') != -1:
                        # print(f"文本 '{run_ct.text}' 是加粗。")
                        run.font.bold = True
                    # 2.3检查文本颜色(如果已设置)
                    colors = re.findall('<w:color w:val="(.*?)"/>', run_ct.xml)
                    if colors:  # 非空
                        run.font.color.rgb = RGBColor.from_string(colors[0])
                    # 2.4一些特殊样式处理;Todo 需要根据word中具体内容去调整
                    if run_ct.style == '0Char':  # 非None word中的双下划线,此处只能使用单下划线操作【要先原样式比较麻烦】
                        run.underline = True

    if textbox_flag:  # True则进行文本框的替换
        if new_word_path == '':  # 新路径为空,则覆盖原文件
            new_word_path = word_path
        doc.save(new_word_path)

    return textbox_flag

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1663400.html

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

相关文章

pgAdmin 4 使用

瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7,Microsoft Windows (64-bit) 10 版本&#xff1a;14 文档用途 本文介绍pgAdmin4使用技巧和工具所具有的比较好的功能。 详细信息 pgAdmin4是用于设计、维护和管理…

简单的表单初始密码验证的实现

目录 简单示例&#xff1a;表单初始密码验证 1.1准备工作(图1&#xff09; 1.2 index部分 1.3 css部分 1.3.1先把css部分链接到index.html中&#xff0c;注意链接的地址。 1.3.2添加样式 1.4 JS部分 1.4.1 先把js部分链接到index.html中&am…

Android APP读写外置SD卡无权限 java.io.IOException: Permission denied

在物联网应用里&#xff0c;app需要对挂载SD卡读写文件&#xff0c;从 Android 4.4&#xff08;KitKat&#xff09;版本开始&#xff0c;Google 引入了一项名为 "Storage Access Framework" 的新功能&#xff0c;该功能限制了应用对外部存储的直接读写权限,要不然就是…

Html + Express 实现大文件分片上传、断点续传、秒传

在日常的网页开发中&#xff0c;文件上传是一项常见操作。通过文件上传技术&#xff0c;用户可以将本地文件方便地传输到Web服务器上。这种功能在许多场景下都是必不可少的&#xff0c;比如上传文件到网盘或上传用户头像等。 然而&#xff0c;当需要上传大型文件时&#xff0c;…

构建第一个ArkTS应用之@AppStorage:应用全局的UI状态存储

AppStorage是应用全局的UI状态存储&#xff0c;是和应用的进程绑定的&#xff0c;由UI框架在应用程序启动时创建&#xff0c;为应用程序UI状态属性提供中央存储。 和AppStorage不同的是&#xff0c;LocalStorage是页面级的&#xff0c;通常应用于页面内的数据共享。而AppStora…

Apache Flume概述

Apache Flume概述 1.Flume定义 ​ Flume是cloudera(CDH版本的hadoop) 开发的一个分布式、可靠、高可用的海量日志收集系统。 它将各个服务器中的数据收集起来并送到指定的地方去&#xff0c;比如说送到HDFS、Hbase&#xff0c;简单来说flume就是收集日志的。 2.Flume基础架构…

导出QQ好友列表、群列表、群员列表

MENU 准备工作在浏览器地址栏中输入地址使用F12快捷键打开开发者工具(浏览器控制台)点击头像登入网站(推荐)或手机扫码登录获取群列表获取好友列表获取群员列表 准备工作 一台带有浏览器的电脑 在浏览器地址栏中输入地址 https://qun.qq.com/member.html 使用F12快捷键打开开发…

手机同步与数据安全:让手机和电脑完美结合!

在当今这个高度信息化的社会&#xff0c;手机和电脑不仅为我们提供了丰富的信息资源&#xff0c;让我们能够随时随地获取所需的信息&#xff0c;还为我们的生活带来了极大的便利。无论是工作、学习还是娱乐&#xff0c;手机和电脑都发挥着至关重要的作用。 然而&#xff0c;随…

阿里云服务器在线安装nginx

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《nginx实战》 目录 内容简介 安装步骤 1.root用户登录连接阿里云服务器 2.在usr/local下新建nginx目录 3.安装 1安装下载工具 2下载nginx压缩包 3解压 4安装nginx依赖的库 5编译并安装 6启动nginx 7开启…

【数据结构】顺序表(一)

✨✨✨专栏&#xff1a;数据结构 &#x1f9d1;‍&#x1f393;个人主页&#xff1a;SWsunlight 不怕别人看不起&#xff0c;就怕自己不争气。路是人走出来的&#xff0c;关键要靠自己闯。振作起来&#xff0c;生活的含义就是前进。 目录 一、顺序表的概念&#xff1a; 二…

东南亚服务器租用托管的优势

东南亚地区在国际贸易领域展现出了巨大的潜力和吸引力&#xff0c;其未来的外贸发展前景被认为是广阔且充满了无限商机。这一地区以其人口众多、经济快速发展的特点&#xff0c;结合独特的地理优势和丰富的自然资源&#xff0c;正在吸引全球企业的目光。今天我们一起来看看东南…

YOLOv8火焰与烟雾智能检测系统

项目概述&#xff1a; 本项目旨在开发一款高效、实时的火焰与烟雾检测系统&#xff0c;利用先进的深度学习技术——YOLOv8&#xff0c;为安全监控领域提供智能化解决方案。系统不仅能够准确识别视频流或静态图像中的火焰与烟雾&#xff0c;还配备了用户友好的图形界面&#xff…

C++ | Leetcode C++题解之第79题单词搜索

题目&#xff1a; 题解&#xff1a; class Solution { public:bool exist(vector<vector<char>>& board, string word) {rows board.size();cols board[0].size();for(int i 0; i < rows; i) {for(int j 0; j < cols; j) {if (dfs(board, word, i, …

答辩PPT制作太费时?AI工具帮你节省时间

在我原本的认知里面&#xff0c;答辩PPT是要包含论文各个章节的&#xff0c;在答辩时需要方方面面都讲到的&#xff0c;什么摘要、文献综述、实证分析、研究结果样样不落。但是&#xff0c;这大错特错&#xff01; 答辩PPT环节时长一般不超过5分钟&#xff0c;老师想要的答辩P…

精益数字化是什么

在传统的生产过程中&#xff0c;存在很多工作是重复且无价值的&#xff0c;这些工作通常需要花费大量的时间和人力&#xff0c;而且容易出现错误。例如人工测量和记录、纸质文档管理、手工排序和分类等&#xff0c;为了解决这个问题。通过引入精益生产和数字化解决方案&#xf…

springboot基本使用九(redis和springcache缓存)

为什么使用缓存: 减少数据库访问次数,从而提高应用程序的性能 redis可以缓存为啥要和spring cache一起使用? redis缓存:是内存级的缓存。它是使用单纯的内存来进行缓存 spring cache缓存:使用JVM的内存来缓存对象的,这势必会造成大量的内存消耗。但好处是显然的:使用方…

Git详解之五:分布式Git

为了便于项目中的所有开发者分享代码&#xff0c;我们准备好了一台服务器存放远程 Git 仓库。经过前面几章的学习&#xff0c;我们已经学会了一些基本的本地工作流程中所需用到的命令。接下来&#xff0c;我们要学习下如何利用 Git 来组织和完成分布式工作流程。 特别是&#…

UML之用例图

1.用例图 用例图指参与者&#xff0c;用例&#xff0c;边界以及它们之间的关系构成的用于描述系统功能的视图。说明是谁要使用系统&#xff0c;以及可以使用该系统可以做些什么。展示了一个外部用户能够观察到的系统功能模型图 2.用例图的元素 &#xff08;1&#xff09;参与…

使用Postman来调用Salesforce Bulk API 2.0的方法

简介 Bulk API 2.0 可以支持大量数据增删改查&#xff0c; 用新版的Dataloader也可以进行访问&#xff0c;但Dataloader会把CSV里的数据先转成Bean对象&#xff0c;这样会耗费大量的时间&#xff0c;而且数据量过大会卡死&#xff0c;所以直接上传CSV会节省大量时间和避免卡死风…

【Matlab】Matlab之美,抓紧来膜拜大神的创星之作(附2024Matlab教程+代码)

软件介绍 MATLAB是一款商业数学软件&#xff0c;用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境&#xff0c;主要包括MATLAB和Simulink两大部分&#xff0c;可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序…