文档内容转 Markdown:结构化到可读格式的工程实践
文档内容转 Markdown:结构化到可读格式的工程实践
学习目标
读完本章后,你将能够:
- 理解文档解析中间表示到 Markdown 的转换流程
- 掌握多模态 Markdown 与 NLP Markdown 的区别与适用场景
- 处理表格、公式、图片在 Markdown 中的表达
- 实现符合人类阅读顺序的文档重组
前置知识
- 深度文档理解:基于视觉模型的非结构化文档解析 — 文档布局与内容提取
- 多引擎文档解析架构 — 解析引擎的统一中间表示
1. 从中间表示到 Markdown
文档解析系统通常采用两阶段转换策略:
中间表示(middle_json)的核心结构:
{ "page_info": [{"w": 612, "h": 792}, ...], "blocks": [ { "type": "title", "bbox": [100, 50, 500, 80], "lines": [{"text": "文档标题", "bbox": [...]}] }, { "type": "table_body", "bbox": [...], "html": "<table>...</table>" } ]}为什么要用中间表示?
- 不同解析引擎(Pipeline/VLM/Hybrid)的输出格式不同
- 统一的中间格式使输出模块可以复用
- 便于调试、可视化、质检
2. 两种 Markdown 输出模式
2.1 多模态 Markdown(mm_markdown)
保留所有视觉元素的引用,适合多模态模型:
# 文档标题
这是正文段落,包含行内公式 $E = mc^2$。

| 列1 | 列2 | 列3 ||-----|-----|-----|| A | B | C |
$$\int_{0}^{\infty} e^{-x^2} dx = \frac{\sqrt{\pi}}{2}$$特点:
- 图片以
引用 - 表格转换为 HTML 或 Markdown 表格
- 公式转换为 LaTeX 格式
- 保留图片描述(caption)和脚注(footnote)
2.2 NLP Markdown(nlp_markdown)
纯文本模式,移除视觉元素引用,适合文本模型:
# 文档标题
这是正文段落,包含行内公式 $E = mc^2$。
[图片:figure_caption]
[表格:列1=A, 列2=B, 列3=C]
行内公式已保留为 LaTeX。特点:
- 图片以占位文本
[图片:描述]代替 - 表格以自然语言描述
- 仍然保留行内和行间公式(LaTeX)
- 适合纯文本 LLM 处理
3. 关键转换策略
3.1 阅读顺序重建
PDF 等格式存储的是页面内的绝对位置信息,不保证阅读顺序。需要根据以下规则重建:
- 页面内排序:从上到下、从左到右
- 分栏处理:先左栏后右栏
- 跨页元素合并:识别跨页表格和连续段落
- 页眉页脚过滤:去除重复出现的页眉页脚内容
3.2 表格转换
表格在 Markdown 中有两种表示方式:
| 方式 | 适用场景 | 示例 |
|---|---|---|
| HTML 表格 | 复杂表格(合并单元格、嵌套表头) | <table><tr><td rowspan="2">...</td> |
| Markdown 表格 | 简单表格(无合并单元格) | | A | B | C | |
策略:
- 简单表格 → Markdown 表格(可读性更好)
- 复杂表格 → HTML 表格(保留结构信息)
3.3 公式转换
| 公式类型 | Markdown 表达 | 示例 |
|---|---|---|
| 行内公式 | $...$ | 质能方程 $E=mc^2$ |
| 行间公式 | $$...$$ | 独立展示的积分公式 |
| 公式编号 | 保留在行末 | $$...$$ (1) |
4. 内容列表模式(content_list)
除了 Markdown,许多系统还提供内容列表 JSON 输出:
[ {"type": "text", "content": "正文内容"}, {"type": "table", "content": "<table>...</table>"}, {"type": "image", "content": "images/fig1.png", "caption": "图1 描述"}, {"type": "equation", "content": "\\int_0^1 x^2 dx"}]适用场景:
- 需要精细控制每个元素的处理方式
- 下游系统需要结构化数据而非纯文本
- 需要对不同类型内容应用不同处理策略
5. 陷阱与对策
| 陷阱 | 对策 |
|---|---|
| 页眉页脚重复出现 | 检测跨页重复的文本块并过滤 |
| 分栏文档顺序错乱 | 先检测分栏边界,再栏内排序 |
| 跨页表格断裂 | 检测表格延续标记,合并跨页表格 |
| 公式转 LaTeX 失败 | 保留原文本,标注转换失败 |
| 图片引用路径错误 | 使用相对路径,与输出目录结构匹配 |
6. 设计权衡
Markdown vs JSON 输出
| 维度 | Markdown | JSON 内容列表 |
|---|---|---|
| 可读性 | 人类可直接阅读 | 需要工具解析 |
| 结构化 | 弱(半结构化) | 强(完全结构化) |
| 保真度 | 可能丢失部分信息 | 保留全部信息 |
| 下游处理 | 适合文本模型 | 适合结构化处理管线 |
| 文件大小 | 较小 | 较大 |
推荐策略:同时提供两种输出格式,让用户根据下游需求选择。
多模态 vs NLP 输出
| 维度 | 多模态 Markdown | NLP Markdown |
|---|---|---|
| 图片处理 | 保留引用路径 | 替换为文本描述 |
| 表格处理 | HTML/Markdown 表格 | 自然语言描述 |
| 适用模型 | 多模态 LLM | 纯文本 LLM |
| 信息量 | 完整 | 有损 |
参考来源
- MinerU 官方仓库:https://github.com/opendatalab/MinerU
- CommonMark 规范:https://commonmark.org/
- Pandoc 文档:https://pandoc.org/
- Markdown 指南:https://www.markdownguide.org/