把 PDF 里的表格提取成 Markdown
问任何一个经常转 PDF 的人什么东西最容易坏,答案几乎只有一个:表格。标题、段落、列表都转换得很可靠,唯独表格每一次都要人眼把关。
这篇文章讲清楚表格在 PDF 格式里为什么结构性地难、现代转换器怎么把它重建为 Markdown 管道表格、哪些表格特性 Markdown 根本表达不了,以及如何验证一张转换后的表格而不是盲信。
PDF 没有“表格”这个概念——问题的全部根源
Word 文档、HTML 页面、电子表格都有真实的表格对象:行、列、单元格、跨行跨列。PDF 格式什么都没有。你在 PDF 里看到的表格,只是一组按坐标摆放的文本片段,外加附近可选的一堆画线和矩形。
这意味着提取表格不是“取回”,而是“推断”。转换器必须判断哪些片段属于同一行、各自属于哪一列、旁边的线是单元格边框还是页面装饰、表格在哪里结束下一段从哪里开始。
这也解释了为什么同一张表在这个 PDF 里转得很好、在另一个里一塌糊涂。差别不在表格本身的复杂度,而在文档携带了多少证据:明确的框线和一致的对齐给了探测器抓手,它们缺席时就只能靠猜。
带线表格 vs 空白对齐表格
带线表格——单元格之间有可见线条的那种——是宽容的情形。线条把页面切成区域,每个区域放一个单元格的文本,结构识别问题退化成“在已知网格里读顺序”。大多数转换器(包括本站的)都能处理得很好。
无边框、靠空白对齐的表格正相反。没有线可依,探测器只能按坐标聚类文本片段:基线对齐的聚成一行,x 坐标扎堆的聚成一列。对齐哪怕差之毫厘——某个单元格偏出它的列两个点——都会波及整行值的归属。
报表软件导出的财务对账单多半带线,转换干净。从幻灯片贴出来的表、纯靠空格排的表、跨页断开又重复表头的表,属于无边框和碎片化的情形,人眼检查没有商量余地。
结构识别如何重建网格
本站转换器背后的 PDF 引擎把表格结构识别做进了提取流程:检测页面上的表格区域、切分成行列、把每个文本片段归入单元格,然后以 GitHub 风格的 Markdown 管道表格输出。
这个输出是诚实、有损但有用的最大公约数。管道表格保住了最核心的语义——哪个值对应哪个行头列头——同时丢弃 Markdown 无处记录的视觉细节:列宽、底纹、对齐。
近年来公开表格提取基准上的识别质量进步巨大,这类引擎的得分远超“复制粘贴 PDF 文本”的朴素路线。但基准分是平均值,你的表格可能低于平均。下面有验证建议,它存在自有道理。
你的 Markdown 里会出现什么
干净的转换产出的正是人手写的样子:一行表头、一行分隔线、每个数据行一行管道。空单元格保持为空,数字列的值原样保留,表格在 GitHub、Obsidian 和所有主流 Markdown 渲染器里都是真正的表格。
上下文也保留。表格上方的段落、以普通文本排版的表题、下方的脚注都按正常内容转换,表格带着它的上下文,而不是孤零零地悬在那里。
保不住的是行列之外的任何二维结构。列组、横贯整表的汇总行、嵌套的子表头,都会被拍平成额外的行或并进单元格文本。数据还在,它原本的形状不在了。
合并单元格和 GFM 的天花板
GitHub 风格的管道表格刻意保持极简:恰好一行表头、没有单元格跨列、没有跨行、除每列左/中/右对齐外没有任何合并。源 PDF 里任何更富的结构都必须拍平来适配。
横跨三列的合并单元格会变成首格有文本、后两格为空,或者每个格子都重复一遍。两级表头变成一行表头,层级用分隔符拼起来。拍平能不能接受完全取决于下一步:在文档里读没问题,导进电子表格就有损。
如果目的地真的需要合并结构,说明这张表已经超出了 Markdown 的能力范围,而不是转换器的。对那一张表,从原始来源导出 CSV、或用电子表格软件自己的 PDF 导入,才是更好的路——不该逼转换器假装语义还在。
数字永远要抽查
表格转换的失败模式天然安静。挪了一列的表格渲染出来完全正常,只是有一个值站错了位置。被分页切断的行会变成两行。负号被读成连字符,负数变正数,表格外观毫无变化。
所以验证力度要和后果成正比。博客文章里的表格,渲染后扫一眼;进报告的财务或科研表格,对行数、列合计、随机抽样单元格和原文核对;喂给模型或数据库的任何表格,这一步是管线的一部分,不是可选项。
转换器能帮的地方它会帮:看起来需要复核的页面会在转换警告里被标记出来,而不是沉默放过。把这些标记当作指针——指向最值得先查的那几行。
用 Pandoc 把表格送往更远
表格一旦成为 Markdown 管道表,就是本站其他输出格式背后的 pandoc 引擎里的一等公民。选 HTML 输出,表格变成真正的 <table> 标记;选 LaTeX,变成 tabular;选 RST,变成 grid 语法。
第二级转换是无损的:pandoc 先把管道表解析进文档模型再写出,列对齐和表头结构在每种格式里都保留。PDF 转 Markdown 那一步丢掉的东西不会回来,但后续也不再丢任何东西。
大多数工作流到 Markdown 就停了,因为目的地只说 Markdown。当目的地不是——LaTeX 论文、Sphinx 站点——转换路径已经铺好,一个下拉框的事,跑在同一条本地私密的管线上。