当前位置: 首页 > article >正文

使用Python解析PPT文件并生成JSON结构详解

引言

PowerPoint(PPT)文件的自动化处理是办公自动化和数据提取的常见需求。本文将介绍如何通过Python的python-pptx库,将PPT文件的样式、结构、文本内容等信息解析为标准化的JSON格式,为后续的自动化处理、数据迁移或样式复用提供基础。


核心代码解析

1. 颜色转换函数:rgb_to_hex

将RGB颜色值(如(255, 0, 0))转换为十六进制字符串(如#FF0000)。
当前代码存在缺陷:原函数直接返回RGB元组,而非十六进制字符串。以下是修正后的实现:

def rgb_to_hex(rgb):"""将 RGB 颜色转换为十六进制字符串(如 #FF0000)"""if rgb is None:return Nonereturn f"#{rgb[0]:02X}{rgb[1]:02X}{rgb[2]:02X}"

2. 解析单个形状:parse_shape

提取形状的类型、位置、样式、文本内容等信息,支持文本框、表格、图片等类型。

关键步骤:
  • 基础属性:形状类型(如MSO_SHAPE_TYPE.TEXT_BOX)、位置(left, top)、尺寸(width, height)。
  • 填充样式:颜色类型(纯色/渐变)、颜色值(十六进制)。
  • 边框样式:颜色、线宽、虚线类型(如MSO_LINE_DASH_STYLE.DASH)。
  • 文本样式:段落对齐、字体名称、大小、加粗/斜体、颜色。
  • 特殊处理
    • 表格:解析行、列及单元格内容。
    • 图片:记录尺寸信息。
示例输出(文本框):
{"type": 1,  // MSO_SHAPE_TYPE.TEXT_BOX"name": "Text Box 1","text": "Hello World","fill": {"type": "MSO_FILL.SOLID","color": "#FF0000"},"line": {"color": "#000000","width": 12700,  // EMU单位"dash_style": "MSO_LINE_DASH_STYLE.SOLID"},"text_style": {"paragraphs": [{"text": "Hello World","runs": [{"text": "Hello World","font": {"name": "Arial","size": 24,"bold": false,"color": "#000000"}}]}]}
}

3. 解析整个PPT:parse_presentation

遍历PPT的每一页和每个形状,调用parse_shape生成结构化数据。

示例输出(JSON片段):
{"slides": [{"slide_number": 254,  // PPT内部ID"shapes": [{"type_name": "MSO_SHAPE_TYPE.TABLE","table": [[{"text": "Header 1", "row_span": 1, "col_span": 1},{"text": "Header 2", "row_span": 1, "col_span": 1}],[{"text": "Row 1", "row_span": 1, "col_span": 1},{"text": "Data", "row_span": 1, "col_span": 1}]]}]}]
}

4. 保存为JSON:save_to_json

将解析结果以可读格式保存为文件。

def save_to_json(data, output_path):with open(output_path, "w", encoding="utf-8") as f:json.dump(data, f, indent=4, ensure_ascii=False)

使用示例

1. 安装依赖

pip install python-pptx

2. 运行代码

if __name__ == "__main__":input_pptx = "template.pptx"  # 输入PPT路径output_json = "presentation_info.json"  # 输出JSON路径parsed_data = parse_presentation(input_pptx)save_to_json(parsed_data, output_json)

3. 输出JSON结构

{"slides": [{"slide_number": 254,"shapes": [{"type": 1,"name": "Text Box 1","text": "Sample Text","fill": {"type": "MSO_FILL.BACKGROUND", "color": null},"line": {"color": null, "width": 0, "dash_style": null},"text_style": {"paragraphs": [{"text": "Sample Text","runs": [{"text": "Sample Text","font": {"name": "Calibri","size": 11,"bold": false,"color": "#000000"}}]}]}}]}]
}

核心功能与适用场景

1. 支持的形状类型

类型名称对应值描述
MSO_SHAPE_TYPE.TEXT_BOX1文本框
MSO_SHAPE_TYPE.TABLE19表格
MSO_SHAPE_TYPE.PICTURE17图片
其他形状根据MSO枚举形状、线条等

2. 典型应用场景

  • 样式复用:提取模板样式,批量生成符合规范的PPT。
  • 数据迁移:将PPT内容导出为JSON,用于数据分析或内容管理。
  • 自动化生成:结合JSON数据,动态生成PPT(需反向实现apply功能)。

注意事项

  1. 单位转换

    • PPT中的尺寸单位为EMU(English Metric Unit),可通过shape.width/9525转换为像素(1 EMU ≈ 0.01像素)。
  2. 异常处理

    • 部分形状可能无文本框(如图片),需通过shape.has_text_frame判断。
    • 颜色值可能为None(如填充为透明色),需设置默认值。
  3. 扩展建议

    • 支持更多样式:如阴影、3D效果。
    • 反向生成PPT:根据JSON数据重建PPT文件。

总结

通过本文的代码和解析,开发者可以快速实现PPT文件的自动化解析与数据提取。无论是学术研究、企业报告自动化,还是结合LLM生成内容,这一工具链都能提供强大的基础支持。下一步,你可以尝试:

  • 结合LLM生成内容:用GPT生成文本后,填充到JSON的text字段。
  • 可视化样式:将JSON数据渲染为网页或图表,用于PPT设计预览。

通过Python和JSON的结合,PPT的自动化处理从未如此简单!

import json
from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE_TYPE
from pptx.enum.text import PP_ALIGN
from pptx.enum.dml import MSO_FILL, MSO_LINE_DASH_STYLEdef rgb_to_hex(rgb):"""将 RGB 颜色转换为十六进制字符串(如 #FF0000)"""if rgb is None:return Nonereturn (rgb[0], rgb[1], rgb[2])def parse_shape(shape):"""解析单个 Shape 的信息"""data = {"type": shape.shape_type,"type_name": str(MSO_SHAPE_TYPE(shape.shape_type)),"name": shape.name,"left": shape.left,"top": shape.top,"width": shape.width,"height": shape.height,"rotation": shape.rotation,"text": "","fill": {},"line": {},"text_style": {}}# 解析填充样式fill = shape.filltry:data["fill"] = {"type": str(MSO_FILL(fill.type)),"color": rgb_to_hex(fill.fore_color.rgb) if fill.fore_color else None}except:data["fill"] = {"type": str(MSO_FILL(fill.type)),"color": None}# 解析边框样式line = shape.line# try:data["line"] = {"color": rgb_to_hex(line.color.rgb) if line.color.type else None,"width": line.width,"dash_style": str(MSO_LINE_DASH_STYLE(line.dash_style)) if line.dash_style else None}# except:#     print()# 解析文本样式(如果存在文本框)if shape.has_text_frame:text_frame = shape.text_frameparagraphs = []for paragraph in text_frame.paragraphs:runs = []for run in paragraph.runs:run_data = {"text": run.text,"font": {"name": run.font.name,"size": run.font.size.pt,"bold": run.font.bold,"italic": run.font.italic,"color": rgb_to_hex(run.font.color.rgb)}}runs.append(run_data)paragraph_data = {"text": paragraph.text,"runs": runs,"level": paragraph.level,"alignment": str(PP_ALIGN(paragraph.alignment)) if paragraph.alignment else None}paragraphs.append(paragraph_data)data["text_style"] = {"paragraphs": paragraphs}data["text"] = text_frame.text# 处理表格if shape.shape_type == MSO_SHAPE_TYPE.TABLE:table = shape.tablerows = []for row in table.rows:cells = []for cell in row.cells:cell_data = {"text": cell.text.strip(),"row_span": cell.row_span,"col_span": cell.col_span}cells.append(cell_data)rows.append(cells)data["table"] = rows# 处理图片if shape.shape_type == MSO_SHAPE_TYPE.PICTURE:data["image"] = {"width": shape.width,"height": shape.height}return datadef parse_presentation(pptx_path):"""解析整个 PPT 文件并返回 JSON 结构"""prs = Presentation(pptx_path)presentation_data = {"slides": []}for slide_idx, slide in enumerate(prs.slides):slide_data = {"slide_number": slide.slide_id,"shapes": []}for shape in slide.shapes:shape_data = parse_shape(shape)slide_data["shapes"].append(shape_data)presentation_data["slides"].append(slide_data)return presentation_datadef save_to_json(data, output_path):"""将解析后的数据保存为 JSON 文件"""with open(output_path, "w", encoding="utf-8") as f:json.dump(data, f, indent=4, ensure_ascii=False)# 使用示例
if __name__ == "__main__":input_pptx = "template.pptx"  # 输入的 PPT 文件路径output_json = "presentation_info.json"  # 输出的 JSON 文件路径# 解析 PPTparsed_data = parse_presentation(input_pptx)# 保存为 JSONsave_to_json(parsed_data, output_json)

相关文章:

使用Python解析PPT文件并生成JSON结构详解

引言 PowerPoint(PPT)文件的自动化处理是办公自动化和数据提取的常见需求。本文将介绍如何通过Python的python-pptx库,将PPT文件的样式、结构、文本内容等信息解析为标准化的JSON格式,为后续的自动化处理、数据迁移或样式复用提供…...

LabVIEW永磁同步电机性能测试系统

开发了一种基于LabVIEW的永磁同步电机(PMSM)性能测试系统的设计及应用。该系统针对新能源汽车使用的电机进行稳态性能测试,解决了传统测试方法成本高、效率低的问题,实现了测试自动化,提高了数据的准确性和客观性。 ​…...

MTK Camera 照片切视频Systrace拆解分析

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、Systrace 拆解概览二、Systrace 阶段拆解详解 一、Systrace 拆解概览 MTK Camera 照片切换视频trace 拆解(非切换摄像头类) 照片切换视频模块trace…...

某合约任意提取BNB漏洞

1背景描述 合约是一个在满足特定条件时在区块链上执行代码的程序,各方以数字签署合同的方式准许并维护它的其运行。这些代码可以是向朋友汇款、买卖 NFT 虚拟商品等一系列复杂的内容。 存在漏洞的目标合约是一个结合Meme文化病毒式传播与去中心化金融(D…...

Linux_3.2

今天继续学习shell语法 shell类似一个面向过程的语言,要区分好面向过程和面向对象的语言的区别。 循环语句 for循环 for i in a 2 cc doecho $i done #输出a 2 ccfor file in `ls` doecho $file done #输出ls命令的输出for i in $(seq 1 10) doecho $i done #输出1-10,seq…...

插件实现:分别通过winform和WPF界面输入操作CAD——CAD c#二次开发

效果如下图所示: 主程序 using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; using System; using System.Windows…...

【学Rust写CAD】20 平铺模式结构体(spread.rs)

这个 Spread。rs文件定义了渐变超出定义区域时的扩展方式,通常用于处理渐变在边界之外的行为。 源码 //color/spread.rs #[derive(Debug, Clone, Copy)] pub struct Pad; // 空结构体,表示 Pad 模式#[derive(Debug, Clone, Copy)] pub struct Reflect…...

maya调整全局关节显示大小

请按以下步骤操作: 在 Maya 主菜单栏中,找到 Display (显示) 菜单。 在 Display 菜单下,找到 Animation (动画) 子菜单。 在 Animation 子菜单中,点击 Joint Size... (关节大小...)。 这时会弹出一个小窗口或者直接在界面上出现…...

白酒迈入3.0时代,珍酒李渡如何穿越周期高质增长?

当下,白酒行业仍处深度调整期,过往通过渠道拓展、硬广宣传等推动规模扩张、提升市场份额的模式,愈发难以为继。 行业迫切需要构建高质增长新模式,完成增长动能转换。中国酒业协会理事长宋书玉提出,白酒消费亟需进入品…...

HTTP代理:网页加速的隐形引擎

目录 引言:网页加载速度为何至关重要? 一、HTTP代理的核心加速原理 二、四大加速黑科技详解 三、实战场景性能对比 四、代理加速的隐藏代价 五、未来发展趋势 结语:智能代理的选型指南 引言:网页加载速度为何至关重要&#…...

人工智能-LangGraph+ChatUI+DeepSeek API搭建本地智能助手

人工智能-LangGraphChatUIDeepSeek API搭建本地智能助手 0 环境说明1 LangGraph2 Agent Chat UI 0 环境说明 环境项环境说明操作系统Windows11 专业版硬件信息联想拯救者Y9000PcondaAnancondaPython版本3.12NodeJs18.20.0 # 使用conda创建python环境 conda create -n langgra…...

3dmax批量转glb/gltf/fbx/osgb/stl/3ds/dae/obj/skp格式导出转换插件,无需一个个打开max,材质贴图在

3dmax批量转glb/gltf/fbx/osgb/stl/3ds/dae/obj/skp格式导出转换插件,无需一个个打开max,材质贴图在 3dmax批量转glb/gltf/fbx/osgb/stl/3ds/dae/obj/skp格式导出转换插件,无需一个个打开max,材质贴图在...

虚幻5入门

常用操作 运行时,调试相机,按~键,输入ToggleDebugCamera 。进入自由视角 常用节点 gate节点:用于控制该流程通不通,执不执行。Flip Flop节点:反转执行,一次A,一次B。Set Timer by…...

【解决】Edge浏览器硬件加速问题:无法滚动与卡顿的应对方法

Edge浏览器开启硬件加速后无法滚动屏幕,关闭后虽然可以滚动但出现卡顿,可能是由多种原因导致的。以下是一些可能的解决方法: 1. 检查显卡驱动 更新显卡驱动:确保显卡驱动是最新版本。过时的驱动可能会导致硬件加速功能不稳定。回…...

慧通测控:汽车RGB氛围灯功能测试介绍

在汽车内饰不断进化的当下,汽车 RGB 氛围灯已从曾经的小众配置,逐渐成为众多车主提升驾乘体验的热门选择。它宛如车内的 “魔法精灵”,凭借丰富的功能,为单调的车厢披上一层梦幻而温馨的色彩。今天,让我们深入探究汽车…...

QML Book 学习基础6(定位/布局元素)

目录 定位元素 Column Row Grid Flow 布局元素 1.元素填充它的⽗元素。 2.对齐 定位元素 Column Column (列)元素将它的⼦对象通过顶部对⻬的列⽅式进⾏排列。 spacing 属性⽤来设置每个元素之间的间隔⼤⼩ Row Row (⾏)元…...

【SpringCloud】LoadBalance-负载均衡

4. 负载均衡-LoadBalance 4.1 为什么需要负载均衡? 不知道各位心中有没有女神,通常来说一个女神就会有多个舔狗,那这些舔狗呢,就会心甘情愿的帮女神干活,假设女神小美现在有三个舔狗,小美喜欢让这三个舔狗…...

自然语言处理(26:(终章Attention 2.)带Attention的seq2seq的实现)

系列文章目录 终章 1:Attention的结构 终章 2:带Attention的seq2seq的实现 终章 3:Attention的评价 终章 4:关于Attention的其他话题 终章 5:Attention的应用 目录 系列文章目录 前言 一、编码器的实现 二、解…...

Sentinel实战(二)、流控规则之流控阈值类型、流控模式

spring cloud Alibaba-sentinel-流控 流控规则前置环境一、基于阈值类型(QPS/线程数)维度,设置流控规则demo1、流控规则:设置QPS流控规则设置含义测试,观察流控规则设定后的效果demo2、流控规则-设置线程数流控规则设置含义测试,观察流控规则设定后的效果二、基于流控模…...

AI与.NET技术实操系列(四):使用 Semantic Kernel 和 DeepSeek 构建AI应用

1. 引言 在人工智能技术飞速发展的今天,大型语言模型(Large Language Models, LLMs)已成为智能应用开发的核心驱动力。从智能客服到自动化内容生成,LLMs的应用正在深刻改变我们的工作和生活方式。 对于.NET开发者而言,…...

go 使用os复制文件

在 Go 语言中,你可以使用 os 包中的 Open、Create、Copy 函数来复制文件。以下是一个简单的示例: package mainimport ("fmt""io""os" )func copyFile(src, dst string) error {// 打开源文件srcFile, err : os.Open(src…...

嵌入式软件安全设计指南(V2.0)

嵌入式软件安全设计指南(V2.0) 一、安全设计基础原则 1.1 最小特权原则 /* FreeRTOS任务权限控制示例 */ void vTaskSafe(void *pvParameters) {// 限制IO访问权限vTaskRestrictPermissions(portPRIVILEGED_BIT);// 仅允许访问指定内存区域vTaskSetMP…...

HarmonyOS:ComposeTitleBar 组件自学指南

在日常的鸿蒙应用开发工作中,我们常常会面临构建美观且功能实用的用户界面的挑战。而标题栏作为应用界面的重要组成部分,它不仅承载着展示页面关键信息的重任,还能为用户提供便捷的操作入口。最近在参与的一个项目里,我就深深体会…...

25-智慧旅游系统(协同算法)三端

介绍 技术: 基于 B/S 架构 SpringBootMySQLLayuivue 环境: Idea mysql maven jdk1.8 node 管理端功能 首页展示图表:以数据可视化方式展示关键业务数据。 用户管理:管理系统用户,包括查看、编辑等操作。 供应商管…...

数据结构实验1.2: 顺序表的基本运算

文章目录 一,问题描述二,基本要求三,算法分析(1)插入算法(2)删除算法 四,参考程序五,运行效果 一,问题描述 创建一个顺序表,编程实现顺序表的下列…...

Swoole 的 Hyperf 框架和 Go 的 Gin 框架高并发原理以及技术实现对比分析

Swoole 的 Hyperf 框架和 Go 的 Gin 框架虽然都支持高并发,但它们的实现原理、底层机制和适用场景有显著差异。以下从 高并发原理、技术实现区别、优缺点 三个方面详细分析: 一、高并发实现原理 1. Hyperf (PHP Swoole) Hyperf 的高并发能力基于 Swoo…...

【QT】QT中的信号与槽

QT中的信号与槽 一、信号与槽函数的作用二、如何关联信号与槽函数1、借助集成开发环境,右键转到槽函数示例代码: 2、调用connect函数手动关联信号与槽函数 三、扩展四、总结信号与槽的特点1、一个类如果要使用信号以及槽函数,那么该类的定义中…...

使用Python爬虫获取1688商品(按图搜索)接口

一、引言 随着电商行业的不断发展,消费者对商品搜索的效率和准确性要求越来越高。1688作为国内领先的B2B电商平台,提供了丰富的商品搜索功能,其中按图搜索功能(类似于淘宝的拍立淘)极大地提升了用户的购物体验。本文将…...

C/C++ JSON 库综合对比及应用案例(六)

第六部分:C/C JSON 库综合对比及应用案例 📢 快速掌握 JSON!文章 视频双管齐下 🚀 如果你觉得阅读文章太慢,或者更喜欢 边看边学 的方式,不妨直接观看我录制的 JSON 课程视频!🎬 …...

AI Agent拐点已至,2B+2C星辰大海——行业深度报告

大家好,我是吾鳴。 今天吾鳴要给大家分享一份由开源证券出品的关于AI Agent的报告,报告从AI Agent商业化应用、C端B端应用与布局,投资建议等方向介绍2025AI Agent新元年。报告一共28页PDF,文末有完整版下载地址。 内容摘要 2025年…...