PDF 与 Markdown 文档提取/切分对比分析
一、PDF 跨页为什么麻烦
PDF 本质是印刷描述语言,不是文档格式:
告诉打印机:在 (x, y) 坐标画这段文字,字号 12,字体 宋体。
同一段落跨两页,PDF 内部长这样:
Page 1: "这是第一页的内容,继续..."
Page 2: "这是第二页的内容,结束。"
没有任何东西告诉你这两段是同一段话。需要自己判断:
- 去掉页眉页脚(header/footer)——但每本书的页眉规则不同
- 去掉页码
- 判断 Page 1 末尾的句子是否完整,与 Page 2 开头是否衔接
- 同一段落可能被分页符、图片、表格、脚注打断
| 维度 | 为什么难 |
|---|---|
| 坐标定位 | 文字位置是绝对的,不是流式的 |
| 缺乏语义 | 没有 <p>、<h1>、<div> 标签 |
| 页眉页脚 | 每一页都可能重复,需要过滤 |
| 段落还原 | 需要启发式算法(行距、字体变化) |
| 表格跨页 | 表头可能只在第一页,后续页只有数据行 |
结论:PDF 是「所见即所得」的终点,不是内容的起点。用它做内容提取,本质上是逆向工程。
二、MD 文件为什么容易切分
Markdown 是语义格式,不是布局格式:
# 第一章
这是第一段。
这是第二段。
## 1.1 小节
| 特征 | 切分依据 | |
|---|---|---|
| 章节 | #、##、### 等标题标记 | |
| 段落 | 两个连续换行符 | |
| 列表 | - 、1. 前缀 | |
| 代码块 | ` ````包裹 | |
| 表格 | | 分隔符和 `--- | ---` 分隔线 |
切分 MD 可以做到 100% 精确,不需要任何猜测:
split("\n\n")→ 段落- 正则匹配
^#{1,6}\s→ 章节 - 按标题层级构建树 → 结构化文档
这是格式本身的设计意图——MD 就是让人能直接读源码、直接切分的。
三、表格跨页的复杂性
在 PDF 中
Page 1: [表头 | 列1 | 列2]
[数据1 | 11 | 12]
[数据2 | 21 | 22]
(表格继续到下一页)
Page 2: [数据3 | 31 | 32]
[数据4 | 41 | 42]
难点:
- 表头只在第一页,后续页只有数据行,需要把表头重新拼接回去
- 行被截断,需要判断上一页最后一行与下一页第一行是否属于同一个表格
- 表格内的文字可能被分页符打断在单元格中间
- 表格旁边可能有浮动图片或注释,复杂布局下更难
在 MD 中
MD 表格没有跨页问题(MD 没有「页」的概念),但有新的问题:
- 行数太多的表格,单个 MD 段落太长,切分后会丢失上下文
- 单元格内容含换行——标准 Markdown 不支持
- 合并单元格——标准 MD 表格不支持,需 HTML 表格
- 切分时如果按段落切,表格作为一个整体可能会被错误截断
四、核心对比
| 维度 | Markdown | |
|---|---|---|
| 内容模型 | 固定布局(Fixed Layout) | 流式文档(Flow Document) |
| 语义 | 无 | 有(标题、段落、列表等) |
| 跨页还原 | 需要启发式算法 | 不需处理(没有页的概念) |
| 表格提取 | 需要检测表格区域、合并跨页行 | 直接解析 | 语法 |
| 切分精度 | 取决于 PDF 质量和工具 | 可以做到 100% |
| 实用复杂度 | 高 | 低 |
核心矛盾:PDF 是「给人看的」,MD 是「给人和机器都能读的」。
五、可能的实际场景
- 文档提取/切分工具开发:PDF 处理麻烦,值得优先考虑工具选型(Camelot/Tabula/PyMuPDF)
- 跨平台内容发布:来源文档(PDF/Word)提取表格时结构错乱,需规划处理流程
- 论文参考资料处理:PDF 参考资料跨页,提取信息时难以还原原文
延伸方向
- PDF 段落还原的具体算法(行距聚类、字体检测、启发式合并)
- PDF 表格提取的实用方案(Camelot/Tabula/PyMuPDF 对比和选型)
- MD 切分的最佳实践(按标题层级切为结构化 JSON)
- PDF → MD 转换的坑(Pandoc/Marker/MinerU 效果对比)