news 2026/9/12 0:36:17

PaddleOCR doc2md:无需 OCR 即可将 Word、Excel 与 PowerPoint 一键转换为 Markdown

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PaddleOCR doc2md:无需 OCR 即可将 Word、Excel 与 PowerPoint 一键转换为 Markdown

PaddleOCR doc2md:无需 OCR 即可将 Word、Excel 与 PowerPoint 一键转换为 Markdown

【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100+ languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR

doc2md 是 PaddleOCR 内置的轻量级 Office 文档结构化转换功能,它绕开 OCR 推理链路,直接解析 OOXML 文档结构并输出规范的 Markdown 文本。本文以官方教程 docs/version3.x/doc2md.en.md 为核心骨架,结合仓库源码深入讲解其架构、命令行与 Python API 用法、各格式支持细节及常见问题排查,帮助你在知识库构建、文档检索与内容提取场景中直接落地使用。

1. 功能定位:不跑模型的结构化转换器

doc2md 的核心设计理念是"无需 OCR 推理"。与 OCR 对图片/扫描件做像素级文字识别不同,doc2md 直接读取 Office 文件的 XML 内部结构(.docx/.xlsx/.pptx本质上是 ZIP 打包的 OOXML 文档),将段落、表格、图片、公式等结构化元素映射为 Markdown 语法。因此它速度极快、零 GPU 依赖,适合拥有原始 Office 文件的场景。

从源码看,整个功能收敛在 paddleocr/_doc2md 包内,对外暴露两个核心入口(见 paddleocr/init.py):

  • doc2md_convert(source, **kwargs):转换文档并返回结果对象;
  • doc2md_supported_formats():列出当前支持的扩展名。

支持格式.docx(Word)、.xlsx(Excel)、.pptx(PowerPoint)。

三种格式的核心能力对比如下:

功能Word (.docx)Excel (.xlsx)PowerPoint (.pptx)
标题层级✅ 内置样式 + 字号启发式 + 中文编号
文本格式化(粗体/斜体/下划线/删除线)
上标 / 下标
超链接
列表(有序 / 无序 / 嵌套)
表格(含合并单元格)✅ HTML table✅ HTML table✅ HTML table
图片✅ 按比例宽度✅ 浮动图片✅ 按比例宽度
数学公式(OMML → LaTeX)✅ 行内 / 显示公式✅ drawing 层公式
代码块✅ 等宽字体自动识别
文本框
图表(Chart)✅ → HTML table✅ 14 种图表类型
页眉 / 页脚✅ 多节 + 奇偶页
多 sheet / 多幻灯片---分隔
演讲者备注

2. 安装与依赖

使用 doc2md 前,请先按照安装教程完成 PaddleOCR 基础安装,然后安装 doc2md 可选依赖:

pip install "paddleocr[doc2md]"

该 extra 依赖在 pyproject.toml 中定义,四类解析库缺一不可:

包名版本约束用途
python-docx>=0.8.11Word (.docx) 文档解析
python-pptx>=0.6.21PowerPoint (.pptx) 文档解析
openpyxl>=3.0.0Excel (.xlsx) 文档解析
pylatexenc>=2.10,<3数学公式 Unicode → LaTeX 符号映射

值得注意的实现细节是doc2md 采用延迟导入(lazy import)策略:三个转换器模块(docx.py、xlsx.py、pptx.py)在真正转换时才引入对应解析库。若缺失依赖,会抛出如RuntimeError: DOCX conversion requires python-docx: pip install paddleocr[doc2md]之类的明确错误(参见 docx.py 与 xlsx.py),这也是 FAQ 中"转换时报 python-docx is required"的根因。

3. 命令行快速上手

doc2md 以paddleocr doc2md子命令形式集成在 CLI 中,注册逻辑见 paddleocr/_cli.py。基础用法:

# 转换 Word 文档,输出到文件 paddleocr doc2md -i report.docx -o output.md # 转换 Excel 表格,输出到文件 paddleocr doc2md -i data.xlsx -o output.md # 转换 PowerPoint 演示文稿,输出到文件 paddleocr doc2md -i slides.pptx -o output.md # 不指定输出路径,结果打印到终端(stdout) paddleocr doc2md -i report.docx # 查看支持的格式列表后退出 paddleocr doc2md --formats

完整命令行参数如下:

参数说明类型默认值
-i,--input输入文件路径,必填(使用--formats时可省略);支持.docx.xlsx.pptxstr必填
-o,--output输出 Markdown 文件路径;不设置则打印到 stdout;设置后图片自动保存到同目录images/子目录strNone
-q,--quiet静默模式,不打印耗时、保存路径等提示flagFalse
--formats打印支持的文件格式列表并退出,此时无需--inputflagFalse
--no-drawings跳过文本框(docx)与 drawing 层数学公式(xlsx)的提取,仅适用于 docx / xlsxflagFalse
--no-headers-footers跳过页眉页脚提取,仅适用于 docxflagFalse
--sheet-name仅转换指定名称的 sheet,不设置则转换全部;仅适用于 xlsxstrNone
--max-rows每个 sheet 的最大转换行数,用于限制大表格输出;仅适用于 xlsxintNone

这些 flag 在 CLI 内部被一一映射为 Python API 的 kwargs(见 paddleocr/_cli.py):--no-drawings对应extract_drawings=False--no-headers-footers对应extract_headers_footers=False--sheet-name--max-rows直接透传。转换完成且未开启--quiet时,CLI 会打印耗时(毫秒)与输出/图片保存路径。

4. Python API 详解

Python API 的顶层入口是paddleocr._doc2md.convert,其底层实现见 paddleocr/_doc2md/core.py:先校验文件存在性,再通过注册表按扩展名/MIME 类型选出转换器实例,执行convert_file后,若指定output则自动写入 Markdown 文件并落盘images/图片。

基础用法:

from paddleocr._doc2md import convert # 转换文档,返回结果对象 result = convert("report.docx") # 访问 Markdown 文本 print(result.markdown) # 查看提取的图片(字典:key 为相对路径,value 为图片字节) print(list(result.images.keys())) # 查看文档标题 print(result.title) # 查看元信息(格式、sheet 数量等) print(result.metadata)

ConvertResult字段说明(数据结构定义见 paddleocr/_doc2md/base.py):

字段类型说明
markdownstr转换后的 Markdown 文本
imagesdict[str, bytes]提取的图片字典,key 为相对路径(如images/image1.png),value 为图片原始字节
titleOptional[str]文档标题,可能为None
metadatadict文档元信息,如格式类型、sheet 数量等

指定输出路径(自动保存 Markdown 与图片):

from paddleocr._doc2md import convert # 指定 output 后,Markdown 写入文件,图片保存到同目录 images/ 下 result = convert("report.docx", output="output/report.md")

图片落盘逻辑由convert统一处理:result.images中的每个相对路径都被拼接到输出文件所在目录,逐一以二进制写入(见 core.py),因此 Markdown 中的图片引用天然是相对路径。

各格式可用的 kwargs 参数:

参数类型默认值适用格式说明
extract_drawingsboolTruedocx, xlsx是否提取文本框(docx)/ drawing 层数学公式(xlsx)
extract_headers_footersboolTruedocx是否提取页眉页脚
sheet_nameOptional[str]Nonexlsx仅转换指定名称的 sheet,None表示全部
max_rowsOptional[int]Nonexlsx每个 sheet 的最大转换行数

按格式传入 kwargs 示例:

from paddleocr._doc2md import convert # Word:不提取文本框和页眉页脚 result = convert("report.docx", extract_drawings=False, extract_headers_footers=False) # Excel:仅转换名为 "Sheet1" 的 sheet,最多 100 行 result = convert("data.xlsx", sheet_name="Sheet1", max_rows=100)

5. 各格式支持特性深度解析

5.1 Word (.docx)

标题识别采用三种互补策略:

  • 内置 Heading 样式:Word 内置 Heading 1–6 样式直接映射为#######
  • 字号启发式:字号大于正文 1.5 倍且段落较短时,自动提升为标题;
  • 中文编号一、格式识别为 H2,(一)格式识别为 H3。对应正则见 docx.py:_RE_H2 = re.compile(r"^[一二三四五六七八九十百千]+[、..]")_RE_H3 = re.compile(r"^([一二三四五六七八九十百千]+)")

文本格式化:粗体(**)、斜体(*)、下划线(<u>)、删除线(~~)、上标(<sup>)、下标(<sub>)。样式解析时遵循"run 级 > 字符样式 > 段落样式"的优先级链(见 docx.py 中的_effective_bold/_effective_italic/_effective_underline辅助函数),确保继承样式不被漏掉。

列表:有序、无序、嵌套列表,缩进层级自动识别。

表格:输出为 HTML<table>格式,合并单元格用rowspan/colspan还原。

图片:按文档内容区宽度计算百分比,输出<img width="75%">形式。

数学公式:OMML 格式公式转为 LaTeX,行内公式用$...$,显示公式用$$...$$

代码块:自动检测等宽字体(Courier New、Consolas 等 9 种),输出为 fenced code block(```)。

其他:文本框内容(wps:txbx,对应 Word 2010 wordprocessingShape 命名空间,见 docx.py)、图表(Chart → HTML table)、超链接(支持普通链接与HYPERLINK域代码两种格式,域代码正则_RE_FIELD_HYPERLINK见 docx.py)、页眉页脚(多节 + 奇偶页)。页眉页脚中仅含页码的文本(如- 3 -Page of)会被_RE_PAGE_ONLY正则过滤,避免污染正文(见 docx.py)。

5.2 Excel (.xlsx)

多 sheet:每个 sheet 输出一个以## sheet名称开头的章节。

数据边界裁剪:通过_find_data_bounds自动定位非空单元格区域,去除尾部空行/空列,只输出有效数据范围(实现见 xlsx.py 起)。

合并单元格:使用rowspan/colspan还原合并结构。

字体格式化:粗体、斜体、下划线、删除线、上标、下标。

超链接:支持单元格级超链接。

浮动图片:同时支持OneCellAnchorTwoCellAnchor两种锚定方式——OneCellAnchor可从ext.cx直接读取图片显示宽度(EMU 单位),TwoCellAnchor则回退为默认处理(见 xlsx.py)。列宽换算按"1 字符 ≈ 7px、1px = 9525 EMU"计算(见 xlsx.py)。

数学公式:解析 sheet 关联的 drawing 层 XML,在mc:AlternateContent/mc:Choice下遍历a:p段落提取 OMML 公式并转为 LaTeX(见 xlsx.py)。

5.3 PowerPoint (.pptx)

多幻灯片:每张幻灯片内容以---分隔。

文本格式化:粗体、斜体、下划线、删除线、上标、下标,删除线通过 DrawingML 命名空间下的a:strike元素检测(见 pptx.py)。

图片:按幻灯片宽度计算百分比,输出带宽度的<img>标签。

表格:HTML<table>格式,支持合并单元格与带背景图片的表格。

图表:支持 14 种图表类型(面积图、折线图、饼图、气泡图、柱状图、条形图、圆环图、雷达图、散点图等,类型枚举映射见 pptx.py 的_CHART_TYPE_NAMES),全部转换为 HTML table 输出。

分组形状(GroupShape):递归处理嵌套的形状组合。

数学公式:从mc:AlternateContent中提取 OMML 公式并转为 LaTeX。

演讲者备注:附加在每张幻灯片内容末尾。

6. 架构原理:注册表驱动的转换器

doc2md 的内部架构遵循"注册表 + 策略模式",代码结构清晰、易于扩展:

  • base.py:定义ConvertResult数据类与BaseConverter抽象基类,后者声明supported_extensions/supported_mimetypes类属性与抽象的convert_file方法;
  • registry.pyConverterRegistry维护"扩展名 → 转换器类"和"MIME 类型 → 转换器类"两张映射表。register支持作为装饰器使用,get_converter先按扩展名匹配、再按 MIME 兜底,均未命中时抛出带支持列表的ValueError——这正是 FAQ 中"格式不支持报 ValueError"的来源(见 registry.py);
  • converters/:docx、xlsx、pptx 三个转换器分别实现对应格式的 XML 解析与 Markdown 渲染;
  • math/:OMML 公式解析与 Unicode → LaTeX 符号映射(依赖pylatexenc),供三种格式复用。

convert()入口通过from . import converters触发全部内置转换器的注册(见 core.py),随后交由default_registry.get_converter(file_path)分发(见 core.py)。用户如需新增自定义格式,可自行继承BaseConverter并注册到注册表,无需改动核心流程。

7. FAQ:常见问题与排查

Q:转换时提示RuntimeError: python-docx is required

doc2md 采用延迟导入,缺少对应格式解析库时会抛出此错误。按需安装依赖:

pip install python-docx # Word (.docx) pip install python-pptx # PowerPoint (.pptx) pip install openpyxl # Excel (.xlsx) pip install pylatexenc # 数学公式支持

或一次安装全部:pip install "paddleocr[doc2md]"

Q:格式不支持,提示ValueError

运行paddleocr doc2md --formats查看当前支持的扩展名。doc2md 仅支持.docx.xlsx.pptx不支持.doc(旧版 Word)、.csv.pdf等格式。

Q:Excel 转换后表格行数很多,输出太长?

使用--max-rows限制每个 sheet 的行数:

paddleocr doc2md -i data.xlsx -o output.md --max-rows 100

Q:只想转换 Excel 中的某一个 sheet?

使用--sheet-name指定 sheet 名称:

paddleocr doc2md -i data.xlsx -o output.md --sheet-name "Sheet1"

Q:Word 文档中的页眉页脚不需要,如何跳过?

使用--no-headers-footers参数:

paddleocr doc2md -i report.docx -o output.md --no-headers-footers

Q:图片输出到哪里?

使用-o指定输出文件时,图片自动保存在输出文件同目录的images/文件夹下,Markdown 中的图片引用路径同步更新为相对路径。

Q:doc2md 与 PaddleOCR 的 OCR 功能有什么区别?

doc2md 直接解析 Office 文档的 XML 结构,不使用任何 OCR 模型,速度快、零 GPU 依赖,适用于拥有原始 Office 文件的场景;PaddleOCR 的 OCR 功能则针对图片或扫描件进行文字识别,适用于没有原始文档的场景。两者互为补充:前者负责"结构化文档 → 文本",后者负责"图像 → 文本"。

【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100+ languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 0:35:53

Django二手商城mymall源码部署与运行故障排查指南

简介&#xff1a;这是一套基于Django框架开发的二手商品交易平台&#xff08;mymall&#xff09;完整源码&#xff0c;面向Python Web开发初学者与Django进阶实践者&#xff0c;解决从零构建电商类应用的核心需求&#xff0c;涵盖用户管理、商品发布、购物车、订单处理及支付宝…

作者头像 李华
网站建设 2026/9/12 0:35:28

降AI率工具深度测评:8款主流工具原理、效果与选型建议

1. 写在测评前面&#xff1a;先搞清楚检测器到底在抓什么1.1 为什么2026年“降AI率”成了绕不开的话题这半年我手里经手的稿件&#xff0c;十篇里有七篇要过“AI检测”这关。很多人一上来就问&#xff1a;“有没有一款神器&#xff0c;粘进去点一下&#xff0c;AI率直接归零&am…

作者头像 李华
网站建设 2026/9/12 0:35:04

线程池拒绝策略怎么选?这四种业务场景一次讲清楚

线程池用得好是性能利器&#xff0c;用不好就是事故源头。很多开发者对核心参数了如指掌&#xff0c;却对拒绝策略一知半解&#xff0c;直接使用默认的 AbortPolicy&#xff0c;结果线上流量一冲&#xff0c;满屏都是 RejectedExecutionException&#xff0c;业务直接雪崩。拒绝…

作者头像 李华
网站建设 2026/9/12 0:34:54

Java异步编程实战:@Async与线程池优化指南

1. 异步编程的本质与核心价值在Java开发中&#xff0c;我们经常听到"这个接口需要用Async优化一下"、"这里要加线程池"之类的建议。但真正理解异步编程本质的开发者并不多。异步不是简单的"让代码跑得快"&#xff0c;而是一种资源调度哲学。我经…

作者头像 李华
网站建设 2026/9/12 0:30:53

南京玄武区壁挂炉维修哪家靠谱,欧米到家专业师傅快速上门解决不点火漏水故障

文章简介南京冬季采暖需求较高&#xff0c;壁挂炉作为家庭供暖和生活热水的重要设备&#xff0c;长期使用后容易出现不点火、不供暖、热水忽冷忽热、故障代码报警、水压异常、漏水等问题。欧米到家专注南京壁挂炉维修服务&#xff0c;提供燃气壁挂炉、电壁挂炉、冷凝壁挂炉、采…

作者头像 李华
网站建设 2026/9/12 0:25:03

AD5293数字电位器与MKV44 MCU组合实现高精度可编程电阻校准方案

提笔先讲个老故事&#xff1a;早年做产线校准板&#xff0c;用的还是那种手拧的3296电位器&#xff0c;一台板子至少卡五分钟&#xff0c;工人拧多拧少全看手感&#xff0c;温度一变指标又漂回去。后来全面换成SPI数字电位器&#xff0c;产线自校准直接自动化&#xff0c;单板测…

作者头像 李华