PDF 转 Markdown 为什么比看起来难

PDF 内部到底装了什么、转换器为什么要靠猜、表格和分栏的硬骨头在哪���—一份做了一年之后的认知。

Ben
Ben
2026年4月22日

PDF 转 Markdown 为什么比看起来难

刚开始做 PDF2MD 的时候,我以为 PDF 解析是已经解决的问题。库一抓一大把,格式都几十年了,Markdown 又简单——调个函数应该就出干净文本。

做了一年,想把这一年的认知写下来。因为我老收到同样的问题:为什么我的(或者别人的)转换器在某些 PDF 上烂掉。短答案:PDF 看起来是结构化文档,其实不是。

PDF 里到底装了什么

一份 PDF 是一串绘图指令。大概是这样:"用 Helvetica 12pt 在 (72, 720) 画字符 H。在 (78, 720) 画 e。在 (84, 720) 画 l……"就这样。没有"这是段落""这是标题""这是表格的一行"这种概念。PDF 格式里有 tagged PDF 之类的扩展支持这些语义,但实际生产环境里几乎没人用。

所以你读 PDF,拿到的是定位过的字符。其它一切——段落、标题、表格、阅读顺序、分栏——都得靠推理重建。

PDF 解析所有问题的根源,都在这。

怎么重建段落

基本套路:水平方向距离近的字符聚成词,同一行的词聚成行,垂直方向距离近的行聚成段。每一步都有阈值,每份 PDF 的阈值都不一样,要根据字号和行距来定。

大部分时候管用。失败的情况:行距特别紧(段落被合并)、行距特别松(一段被切成两段)、首字下沉(章节首字母特别大,被当成单独一段)、还有那种逐字符 draw call 的 PDF(每个字符之间的空格检测失灵,每个字成了独立的"词")。

怎么猜标题

PDF 里没有"我是标题"。转换器靠字号、字重、行长短、行的上下空白来推断。18 号粗体、独占一行、上下都有空,大概率是标题。12 号常规、嵌在邻接文本里,大概率是正文。

猜错的情况:

  • 整篇都是小字号,标题只靠加粗区分。
  • 整篇都是大字号(少见但有,诗集和某些法律文档)。
  • 正文里偶尔加粗强调,被当成标题升级。
  • 图下方的说明文字短而独立,看起来像标题。

要彻底修这个问题,没有 ML 不行。Marker 走的就是这条路——用模型把页面区域分类。这把问题从"规则和阈值"变成"数据和训练",更准但出错时也更难排查。

表格为什么是最糟糕的部分

Word 文档或 HTML 里,表格就是表格。有 <table> 元素,有行有单元格。PDF 里的表格只是一堆字符串排成网格。转换器要做的事:

  1. 识别这块区域是不是表格(不是无关的多列文字)。
  2. 找列边界(哪怕没画线,竖线在哪儿)。
  3. 找行边界(哪怕没画线,横向断点在哪儿)。
  4. 把每段文字塞进对的单元格。
  5. 处理单元格内换行——一个单元格内容跨两行视觉上的行。
  6. 处理合并单元格——跨两列或两行的格子。

每一步都可能炸。第 5 条最常坑我。如果一个单元格里的文字换到第二行,朴素的解析器会把那行当成新的一行。本来三行的表格瞬间变六行,每隔一行半空。

好的转换器会综合多个信号:有线就用线、文字边缘对齐、行间列宽一致性。哪怕有这些,硬骨头表格(财报、合并表头的科学数据表)有时候还是要手工修。

多栏排版

双栏页面,本质是两段文字流恰好画在同一张纸上。PDF 不会说"先读 A 栏再读 B 栏"。读者知道是因为视觉惯例。

转换器靠找贯穿全页的垂直空白带来识别栏。找到一条干净的纵向空白,大概是栏间距,左边的文字应该在右边的之前读。

会翻车的情况:

  • 图横跨两栏(栏间距被打断)。
  • 标题横跨两栏(同上)。
  • 两栏宽度不同(栏间距更难找)。
  • 页脚有脚注打断栏的流向。

学术论文上面四种全占。Marker 处理得好;我这个浏览器方案过得去;裸文本提取器烂得很。

阅读顺序

哪怕在一栏里,阅读顺序也未必明确。一段 pull quote 卡在中间,把上下文切开。一段图说放在图旁边,应该在它指代的正文段之前还是之后?侧边栏可能是从上往下读,也可能只是补充。

大部分转换器在这个问题上选择投降,按"每栏从上到下"读。偶尔出错,但是个能站得住脚的默认。

OCR 是另一个完全独立的问题

上面所有讨论都建立在"PDF 里有可选中的文字"上。如果 PDF 是扫描版——拍照、纸质扫描——根本没有文字可提取。"字符"就是像素。

要处理这种,得用 OCR(光学字符识别)——一整套独立技术。Tesseract 是开源标杆。新一点的方案用视觉语言模型(GPT-4V 那个家族),更准但更重。

PDF2MD 没做 OCR。要做意味着浏览器要载入一个至少 50MB 的模型,可能更大,而且 OCR 慢。我宁愿保持页面轻,让用户单独跑 OCR。这事我反复想过。

这些对你意味着什么

如果你在用某个转换器,输出不对,问题大概率能映射到上面某一条:

  • 输出空白 → 扫描版,需要 OCR。
  • 顺序乱 → 多栏没识别出来。
  • 标题层级错 → 字号启发式被骗。
  • 表格坏掉 → 单元格内换行或没线。
  • 页面间内容粘连 → 页眉处理失败。

知道原因不一定能直接修,但能告诉你下一步——是换一个转换器(Marker 处理版面、OCR 处理扫描),还是手打那段���

我在做的事

PDF2MD 上我在改进的方向:

  • 学术论文上更稳的栏识别。
  • 检测到换行时更智能的单元格合并。
  • 可选 OCR(WASM 实现,开关式),给那些"扫一张传单进来转一下"的小场景。

发现 PDF 在转换器上有意思的失败案例,发到 [email protected]。这种边缘案例是我找 bug 最有用的来源。

最后更新:2026 年 4 月 22 日

PDF 转 Markdown 为什么比看起来难 | PDF 转 Markdown 在线转换器 | 快速、安全、PDF 转 MD | pdf2md.net