PPT-MD #!/usr/bin/env python3# -*- coding: utf-8 -*- PPT 转 Markdown 工具把模板 PPT (.pptx) 提取为 Marp 可用的 Markdown。 用法 python pptx_to_md.py 模板.pptx [-o 输出.md] 输出 1) 输出名.md 提取出的 Markdown每页用 --- 分隔 2) 输出名_images/ 模板中用到的图片在 md 中通过相对路径引用 说明 提取仅保留文字、表格和图片的位置信息标题按占位符/字号识别 布局、颜色、动画等版式无法 100% 还原需在生成后手工微调样式。 importosimportreimportsysfrompptximportPresentationfrompptx.enum.shapesimportMSO_SHAPE_TYPEfrompptx.utilimportEmu FRONT_MATTER--- marp: true theme: default paginate: true size: 16:9 --- PIC_EXT{image/png:.png,image/jpeg:.jpg,image/gif:.gif,image/bmp:.bmp,image/tiff:.tiff,image/x-emf:.emf,image/x-wmf:.wmf,}defrun_text(paragraph):把段落里的 run 渲染成 markdown 文本保留加粗/斜体。parts[]forruninparagraph.runs:trun.textifnott:continueifrun.font.bold:t**t**ifrun.font.italic:t*t*parts.append(t)return.join(parts)defhas_text(paragraph):returnbool(paragraph.text.strip())defis_title_shape(shape):ifnotshape.is_placeholder:returnFalsephshape.placeholder_formattry:frompptx.enum.shapesimportPP_PLACEHOLDERreturnph.typein(PP_PLACEHOLDER.TITLE,PP_PLACEHOLDER.CENTER_TITLE)exceptException:returnFalsedefslide_title(slide):优先取标题占位符否则取字体最大的首段。candidates[]forshapeinslide.shapes:ifnotshape.has_text_frame:continueforparainshape.text_frame.paragraphs:ifhas_text(para):size0forruninpara.runs:ifrun.font.size:sizemax(size,run.font.size.pt)candidates.append((para,size,is_title_shape(shape)))ifnotcandidates:returnNone,Nonetitle_cands[cforcincandidatesifc[2]]picktitle_cands[0]iftitle_candselsemax(candidates,keylambdac:c[1]or0)parapick[0]returnpara.text.strip(),pick[1]defpara_lines(shape):返回一个文本框的段落列表 [(text, level), ...]out[]forparainshape.text_frame.paragraphs:trun_text(para).strip()ifnott:continuelvlpara.levelor0out.append((t,lvl))returnoutdefbullet(t,lvl):return *lvl- tiflvlelse- tdefrender_slide(slide,index,img_dir,md_name):lines[]title,_slide_title(slide)lines.append(!-- 第 %d 页%s --%(index,(title)iftitleelse))iftitle:lines.append(## title)else:lines.append(## 第 %d 页%index)forshapeinslide.shapes:ifshape.shape_typeMSO_SHAPE_TYPE.PICTURE:picshape.image extPIC_EXT.get(pic.content_type,.img)fname%s_%d%s%(md_name,index,ext)withopen(os.path.join(img_dir,fname),wb)asf:f.write(pic.blob)lines.append(![](%s/%s)%(os.path.relpath(img_dir,os.path.dirname(os.path.abspath(__file__))).replace(\\,/),fname))continueifshape.has_table:tableshape.table rows[]forrintable.rows:cells[c.text.strip().replace(\n, )forcinr.cells]rows.append(cells)ifrows:lines.append(| | .join(rows[0]) |)lines.append(|---|*len(rows[0]))forrinrows[1:]:lines.append(| | .join(r) |)continueifshape.has_text_frame:iftitleandtitleinshape.text_frame.text.strip():continueplinespara_lines(shape)ifplines:fort,lvlinplines:lines.append(bullet(t,lvl))return\n.join(lines)defmain():iflen(sys.argv)2:print(用法: python pptx_to_md.py 模板.pptx [-o 输出.md])sys.exit(1)pptx_pathsys.argv[1]out_pathNoneif-oinsys.argv:out_pathsys.argv[sys.argv.index(-o)1]ifout_pathisNone:stemos.path.splitext(os.path.basename(pptx_path))[0]out_pathstem.mdmd_nameos.path.splitext(os.path.basename(out_path))[0]img_diros.path.join(os.path.dirname(out_path),md_name_images)os.makedirs(img_dir,exist_okTrue)prsPresentation(pptx_path)slides[]fori,slideinenumerate(prs.slides,1):slides.append(render_slide(slide,i,img_dir,md_name))mdFRONT_MATTER\n\n---\n\n.join(slides)\nwithopen(out_path,w,encodingutf-8)asf:f.write(md)print(已生成 Markdown: out_path)print(已导出图片到: img_dir)if__name____main__:main()

相关新闻

最新新闻

COM+编程实战解析:事务、对象池与遗留系统维护关键指南

COM+编程实战解析:事务、对象池与遗留系统维护关键指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/2 17:58:48
YOLOv8模型剪枝实战:从稀疏化训练到边缘设备部署

YOLOv8模型剪枝实战:从稀疏化训练到边缘设备部署

简介:面向目标检测模型优化方向的开发者和研究者,这份压缩包提供基于 Ultralytics YOLOv8 的完整剪枝实现。包内不仅包含剪枝主脚本,还准备了多种网络结构 YAML 配置(如 GFPN、RepNCSPELAN、DyHead 等变体)、通道重要性…

2026/9/2 17:58:48
从10亿美元收入看Agent后训练范式:Handshake拆解真实工作环境的数据供应链重构

从10亿美元收入看Agent后训练范式:Handshake拆解真实工作环境的数据供应链重构

【摘要】校园招聘平台Handshake的AI训练业务在12个月内实现从0到10亿美元年化收入的增长,其覆盖300万用户的职业网络构成了Agent后训练时代的新型供给基础设施。当前顶尖大模型团队的预训练与后训练算力投入已趋近1:1,AI训练数据正从离散文本标注转向包含…

2026/9/2 17:58:48
AI 视频的账本:谁出钱、谁承担、谁先赚到钱 —— 基于 2026 年半年报的产业格局分析

AI 视频的账本:谁出钱、谁承担、谁先赚到钱 —— 基于 2026 年半年报的产业格局分析

【摘要】2026 年上半年国内新增 AI 短剧 22.19 万部,仅 0.48% 作品播放量破亿,1.3% 作品达到成本回收播放阈值;快手可灵 AI 上半年营收突破 15 亿元,B 站 AI 行业广告收入二季度同比增长超 100%。生成式人工智能内容(A…

2026/9/2 17:58:48
《Orange‘s》随书光盘实践指南:从引导扇区到内核调试

《Orange‘s》随书光盘实践指南:从引导扇区到内核调试

简介:《Oranges:一个操作系统的实现》随书光盘是一份面向操作系统初学者的学习资料包,围绕进程管理、内存管理、中断处理、文件系统等关键概念,提供配合图书阅读的源码与实验材料,帮助读者通过实际操作理解理论。压缩包…

2026/9/2 17:58:48
国产操作系统推荐:从电力核心到航天测发,解析一家深耕关键领域的专业厂商

国产操作系统推荐:从电力核心到航天测发,解析一家深耕关键领域的专业厂商

一、国家级工程验证下的操作系统厂商发展路径1. 依托实体与资质认证体系湖南麒麟信安科技股份有限公司(股票代码:688152)作为国家发改委批复的高可信操作系统国家地方联合工程研究中心的依托实体,其发展路径与国家级科研项目深度绑…

2026/9/2 17:53:48