免费 · 在你浏览器里跑 · 不注册

PDF 表格转 Markdown

大多数转换器会把一张表格还给你一行流水账。这个转换器量出列的位置,写成真正的 Markdown 管道表,还会数有多少格子是空的 —— 所以它能在自己没做好的时候直接告诉你,而不是让你事后自己发现。标题、列表和链接的排版也一起保留下来。

手边没有 PDF?
  • 293 页转出 2,469 行一份中文年报,329 张表。全程没有上传任何东西。
  • 别家在这里是零同一篇十五页论文:这里 103 行,pdf2md.net 0 行,PDF.ai 0 行。
  • 表格没做好会认账空格子超过四分之一,结果页直接说出来。靠猜的转换器给不了这句话。
  • 单个文件 1,000 页不会在年报转到一半的时候撞上限,也没有每日次数可以用完。

一张表格要活着转成 Markdown,得先发生这些事

PDF 里没有表格。里面只有坐标上的字符,有时候旁边还画了几条线。下面每一条都是这个 PDF 转 Markdown 的转换器为了把表格还原出来而做的一步,每一步都对应一份真实文档在缺了它的时候崩掉的样子。

  • 文件里没有任何东西写着「单元格」

    你看到的那个方框是画上去的,不是容器。按文本流顺序读的转换器拿到的是文件碰巧存成什么顺序就是什么顺序 —— 一张四列的表格变成一行流水账,就是这么来的。

  • 列是从横坐标里量出来的

    一整页下来起点横坐标相同的字符属于同一列。最左边那一列行标签经常整个落在画的框线外面,所以它是按几何关系被收回来的,而不是因为在框外就被丢掉。

  • 被换行拆散的行会被合回去

    一个高单元格折成三行,整行就以三段碎片的形式到达。它们按碎片之间的对齐关系合并回一条逻辑行,而不是按它们占了几行。

  • 挤成一格的表头会被按列分回去

    两行、三行的表头会落成一整串文字 ——「Complexity per Layer Sequential Maximum Path Length」就是一个真实例子。只要下面那些列的边界是清楚的,表头就沿着这些边界切开。

  • 量了框却没抄字的格子会再走一遍

    引擎有可能找到了一个单元格的框,却什么都没往里写。这些格子会在表格输出之前按它们自己的 bbox 重读一次,之后还是空的就如实计数,而不是藏起来。

六份文档,每一张表都数过

这些是测试样本集里带表格的文档,用的就是这个页面上跑的同一份代码转成 Markdown 的。最后一列是空格子的占比 —— 转换器就是拿这个数来决定要不要在你的文件上给出警告的。

文档页数表格行数空格子
Attention Is All You NeedarXiv 1706.03762151010316.1%
Language Models are Few-Shot LearnersarXiv 2005.14165(GPT-3)75322672.0%
Deep Residual LearningarXiv 1512.03385,双栏122411714.0%
伯克希尔·哈撒韦 2023 年报密集财务表格1521571,46827.1%
令和6年版 情報通信白書 データ編日文统计表格3102053.2%
中国石油 2023 年度报告A 股中文版2933292,46914.4%

这张表里有一行是超线的:伯克希尔年报的 27.1% 触发了转换器自己的警告,任何人转这份文件都会在屏幕上看到那句话。它被留在这里而不是拿掉,因为一个只展示跑得好的文档的样本集,什么也证明不了。

源文件、它们的哈希,以及能把这些数字复算出来的命令,都在评测页

同一张表,四个 PDF 转 Markdown 转换器

Attention 论文的 Table 1 是四列四行,表头跨两行。下面每个转换器拿到的都是同一个文件。它们的输出是从存档结果里逐字复制的,不是手打的。

pdf2md.net 把它还成了流水账

行和行黏在一起,表头也黏进了第一行。整份十五页文件里一张管道表都没有。

pdf2md.net
Layer Type Complexity per Layer Sequential Maximum Path Length Operations Self-Attention O(n 2 · d) O(1) O(1) Recurrent O(n · d 2 ) O(n) O(n) Convolutional O(k · n · d 2 ) O(1) O(logk(n)) Self-Attention (restricted) O(r · n · d) O(1) O(n/r)

整份文件 0 行表格

pdf2md.me
| Layer Type | Complexity per Layer | Sequential Operations | Maximum Path Length |
|---|---|---|---|
| Self-Attention | O(n2 · d) | O(1) | O(1) |
| Recurrent | O(n · d2 ) | O(n) | O(n) |
| Convolutional | O(k · n · d ) | O(1) | O(logk(n)) |
| Self-Attention (restricted) | O(r · n · d) | O(1) | O(n/r) |

10 张表格共 103 行

PDF.ai 把它拆成了标题

不只是没有表格 —— 上标和表头的第二行都变成了二级标题,于是整份文档的大纲里塞满了表格的碎片。

PDF.ai
Layer TypeComplexity per LayerSequentialMaximum Path Length
## Operations
Self-AttentionO(n
## 2
·d)O(1)O(1)
RecurrentO(n·d
## 2
)O(n)O(n)

0 行表格 · 整份文件 310 个二级标题

pdf2md.me
| Layer Type | Complexity per Layer | Sequential Operations | Maximum Path Length |
|---|---|---|---|
| Self-Attention | O(n2 · d) | O(1) | O(1) |
| Recurrent | O(n · d2 ) | O(n) | O(n) |

103 行表格 · 一份三级大纲

iLovePDF 建出了表格,但把表头弄丢了

这一家确实输出了管道表 —— 整份文件 67 行 —— 所以它的问题更隐蔽也更麻烦:三行表头塌进一个格子,「Operations」掉到正文行里当数据,旁边还凭空多出两个空列。

iLovePDF
| Layer Type |   | Complexity per Layer Sequential Maximum Path Length |   |
| --- | --- | --- | --- |
|   |   | Operations |   |
| Self-Attention | O(n2 · d) | O(1) | O(1) |

四列,其中两列是空的;表头在正文里

pdf2md.me
| Layer Type | Complexity per Layer | Sequential Operations | Maximum Path Length |
|---|---|---|---|
| Self-Attention | O(n2 · d) | O(1) | O(1) |

四列,表头在表头该在的地方

竞品输出捕获于 2026 年 8 月,未登录的免费档。转换器会变 —— 如果你发现其中哪一家已经不是这样了,告诉我们,我们重跑。

PDF 转 Markdown 在表格上仍然会错的地方

下面每一条都是在上面那个样本集的某份文档上实测到的。一个卖表格保真的页面如果一条都不列,正是这个站要反对的那种说法。

  • 两行表头会变成两行

    伯克希尔那张 59 年业绩表的两列表头是「in Per-Share Market Value of Berkshire」摞成两行的。第一行成了表头,第二行成了正文第一行。下面的数字全对,只是上面那个标签落错了格子。

  • 货币符号可能被单独甩出来

    会计版式会把 $ 放进单独一列,好让数字对齐。这个间隙一旦宽到足以被读成列边界,一行就会变成「Insurance – underwriting $ | 5,428」而不是「$5,428」。

  • 表示零的短横线可能被当成列表符号

    财务表格里表示「没有」的短横线单独待在格子开头,而这正好也是列表项的样子。在样本集里最糟的那份文档上,这占了识别出的列表项的 12.5%。

  • 本身是图片的表格转不成 Markdown

    扫描件没有文字层可量,也就没有坐标、没有列。转换器在开始产出之前就会认出这一点并说明,而不是还给你一份空文档。

  • 空格子超过四分之一就会告诉你

    这个警告在空格子占比 25% 时触发,而且它没有为了好看被调松:这里最密的那份伯克希尔年报就在线上面。阈值被放在实测区间诚实的那一端之外,所以它只在损坏没有争议的地方才响。

常见问题

关于表格转 Markdown 的几个问题

行和列会以 Markdown 管道表的形式出来 —— 293 页年报出 2,469 行,十五页论文出 103 行。会出问题的是位置而不是丢失:密集财务版式上一个数值可能落进错误的列。转换器会量出空格子的占比,超过 25% 就警告你,而不是让你自己去发现。

能,而且中文文档是样本集里结果最好的一类:中国石油 2023 年 A 股中文年报 293 页,转出 329 张表、2,469 行,空格子 14.4%。列是按横坐标量出来的,坐标不关心格子里装的是哪种文字。

跨两三行的表头会沿着它下面找到的列边界切开:边界清楚时切得对,不清楚时会有一行表头落进正文第一行。Markdown 里没有 rowspan 和 colspan,所以一个合并单元格会被写进它覆盖的第一个格子,其余留空 —— 这也正是空格子占比要报出来而不是藏起来的原因。

单个文件最多 1,000 页,没有大小限制 —— 上面那份 293 页年报是 12 MB。超过 50 MB 左右页面会提示你可能要多等几秒。也没有每日次数限制,因为这件事的运行成本是零:它跑在你自己的机器上。

不需要。转换器是跑在你浏览器 worker 里的 WebAssembly,你的文件不会变成任何一个网络请求。页面加载完之后你可以断网再转一份 —— 这是这句话唯一值钱的证明方式。

拿你手上最难的那张表试试

一份你本来就知道正确答案的表格,十秒钟能告诉你的东西,比这个页面写一千字都多。