news 2026/6/23 4:08:03

解析word格式和字体

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
解析word格式和字体
from docx.shared import Pt from docx.enum.text import WD_COLOR_INDEX from collections import Counter def r(lis): counter = Counter(lis) return counter.most_common(1)[0][0] def parse_word_font(doc_path): """ 解析Word文档的字体信息,返回每个文本块的字体属性 :param doc_path: Word文档路径(.docx) :return: 列表,每个元素为{text: 文本内容, font: 字体属性字典} """ doc = Document(doc_path) font_info_list = [] fontsizeall=[] # 1. 解析段落文本的字体 for d,para in enumerate(doc.paragraphs): if '一九七五' in para.text: pass if not para.text.strip(): # 跳过空段落 continue # 段落可能包含多个run(不同字体样式的文本块) if para.style.font.size: parafont=para.style.font.size.pt else: parafont=None # word文档解析原理.Word里面顶层是paragraph, 如果paragraph里面写字号大小了.那么里面的子结构runs里面的字体大小就是None! tmp=[] for run in para.runs: if not run.text.strip(): continue # 提取字体核心属性 font_attr = { "name": run.font.name, # 字体名称(如"微软雅黑") "size": run.font.size.pt if run.font.size else parafont, # 字号(磅) "bold": run.font.bold, # 加粗(True/False/None) "italic": run.font.italic, # 斜体(True/False/None) "underline": run.font.underline, # 下划线(None/True/样式) "color": run.font.color.rgb if run.font.color.rgb else None, # 字体颜色(RGB) "highlight": run.font.highlight_color, # 高亮颜色(WD_COLOR_INDEX枚举) "strike": run.font.strike, # 删除线(True/False/None) "subscript": run.font.subscript, # 下标(True/False/None) "superscript": run.font.superscript, # 上标(True/False/None) } fontsizeall.append(font_attr['size']) tmp.append({ "text": run.text, "font": font_attr, "type": "paragraph" # 标记文本类型:段落 }) tmp_fixed={} tmp_fixed['text']=''.join([i['text'] for i in tmp]) tmp_fixed['name']=r([i['font']['name'] for i in tmp]) tmp_fixed['size']=r([i['font']['size'] for i in tmp]) tmp_fixed['bold']=r([i['font']['bold'] for i in tmp]) tmp_fixed['italic']=r([i['font']['italic'] for i in tmp]) tmp_fixed['underline']=r([i['font']['underline'] for i in tmp]) tmp_fixed['strike']=r([i['font']['strike'] for i in tmp]) tmp_fixed['subscript']=r([i['font']['subscript'] for i in tmp]) tmp_fixed['superscript']=r([i['font']['superscript'] for i in tmp]) tmp_fixed['color']=r([i['font']['color'] for i in tmp]) tmp_fixed['type']=r([i['type'] for i in tmp]) font_info_list.append(tmp_fixed) # 2. 解析表格中的文本字体 for table in doc.tables: for row in table.rows: for cell in row.cells: for para in cell.paragraphs: for run in para.runs: if not run.text.strip(): continue font_attr = { "name": run.font.name, "size": run.font.size.pt if run.font.size else None, "bold": run.font.bold, "italic": run.font.italic, "underline": run.font.underline, "color": run.font.color.rgb if run.font.color.rgb else None, "highlight": run.font.highlight_color, } fontsizeall.append(font_attr['size']) font_info_list.append({ "text": run.text, **font_attr, "type": "table_cell" # 标记文本类型:表格单元格 }) fontsizeall=[i for i in fontsizeall if i is not None] originsize=r(fontsizeall) for d,i in enumerate(font_info_list): font_info_list[d]['size']=originsize if font_info_list[d]['size'] is None else font_info_list[d]['size'] return font_info_list # 调用示例 if __name__ == "__main__": doc_path = "new2\叶圣陶集 第25卷 书信 2 第2版_11994042.docx" # 替换为你的Word文档路径 font_info = parse_word_font(doc_path) # 打印解析结果 for idx, item in enumerate(font_info[:10]): print(f"=== 文本块 {idx+1} ===") print(f"文本内容: {item['text']}") print(f"文本类型: {item['type']}") print("字体属性:") for k, v in item['font'].items(): # 格式化颜色/高亮显示 if k == "color" and v: v = f"RGB({v[0]}, {v[1]}, {v[2]})" elif k == "highlight" and v: v = f"{v.name} ({v.value})" print(f" {k}: {v}") print("-" * 50)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/22 20:22:52

Blender版本管理技巧:从新手到高手的全流程指南

Blender版本管理技巧:从新手到高手的全流程指南 【免费下载链接】Blender-Launcher Standalone client for managing official builds of Blender 3D 项目地址: https://gitcode.com/gh_mirrors/bl/Blender-Launcher 还在为Blender版本切换而烦恼吗&#xff…

作者头像 李华
网站建设 2026/6/23 5:29:38

DataX Web UI:企业数据同步的终极可视化解决方案

DataX Web UI:企业数据同步的终极可视化解决方案 【免费下载链接】datax-web-ui DataX Web UI 项目地址: https://gitcode.com/gh_mirrors/da/datax-web-ui 在当今数据驱动的商业环境中,企业面临着海量数据同步的严峻挑战。传统的数据同步工具往往…

作者头像 李华
网站建设 2026/6/24 0:42:45

系统可观测性实战指南:从混乱日志到智能洞察的架构进化

你是否曾在深夜被无数告警信息淹没,却找不到问题的根源?或者面对海量日志却无法快速定位故障?别担心,这正是系统可观测性要解决的核心问题!在现代分布式系统中,可观测性已经不再是可有可无的附加功能&#…

作者头像 李华
网站建设 2026/6/23 18:53:42

分布式训练终极指南:同步与异步策略深度解析

在大规模机器学习项目中,分布式训练已成为提升模型迭代效率的关键技术。然而,面对复杂的集群环境和多样的业务需求,如何在同步SGD与异步SGD之间做出明智选择,成为每个AI工程师必须面对的核心挑战。本文将深入剖析这两种策略的内在…

作者头像 李华
网站建设 2026/6/23 13:46:49

一根同轴线,真的扛得住 4K 吗? ——从摄像头带宽算起,聊透车载 SerDes 接口选型

🚗🔥 一根同轴线,真的扛得住 4K 吗? ——从摄像头带宽算起,聊透车载 SerDes 接口选型 从摄像头带宽算起,聊透车载 SerDes 接口怎么选 写给: 被“4K / 8MP / Gbps”绕晕的产品经理 被 SerDes lane 数量折磨的硬件工程师 以及正在做 L2+ / L3 架构选型的人 一、先说句大…

作者头像 李华