深度技术文章揭示 AI 处理 PDF 的根本问题:大多数工具只复制表面文本忽视结构,导致表格、表单、扫描件都失效;阐释 PDF 内部存储与显示的本质差异。
让 AI 工具读取一份扫描版合同,然后会发生一件奇怪的事:它会告诉你,它已经理解了这份文档。
我见过太多次这种事情出错,以至于早已见怪不怪。大多数 PDF 工具根本没有真正读取 PDF。
它们只是复制页面上碰巧存在的字符,按照页面碰巧存储它们的顺序排列,然后把这称为“提取”。表格变成一堵没有行结构的数字墙,表单变成一堆没有字段的文本。
扫描页面则会变成一片空白,因为那里从来就没有可供复制的文本,只有一张看起来像文本的文字图片。
如果你曾经向 AI 助手询问 PDF 中的内容,却得到一个自信满满但完全错误的答案,原因很可能就在这里。下面我们来看看背后究竟发生了什么,以及修复这个问题需要做什么,包括本文所依据的完整工程实现解析。
打开 PDF,你会看到一个整洁的页面:标题、段落,以及排版规整的小表格。但这些东西实际上并不存在于文件中。至少,不是以你理解的方式存在。
WHAT YOU SEE ON THE PAGE WHAT THE PDF ACTUALLY STORES
Q3 Report "Q" at (72, 40)
───────── "3" at (84, 40)
Revenue Costs " " at (96, 40)
142,500 88,200 "R" at (72, 58)
"e" at (81, 58)
(a clean heading "v" at (90, 58)
and a tidy table) ... character by character,
position by position
no row. no column. no table.
just ink, and where it goes.
第一次有人向我解释这件事时,我也不太相信。在你所看到的页面之下,PDF 更接近于一组排版指令:把这个特定字母放在这个精确位置,使用这种字体和字号。它从不会说“这是一个表格”,也不会说“这是一个标题”。它只会说明墨迹应该落在哪里。
如果只是为了打印页面,这种方式完全没问题。但当你希望计算机从页面中提取含义,而不只是把它显示出来时,整个机制就会失效。Foxit 的技术解析对这种存储模型进行了深入讲解,详细程度远超一篇 Medium 文章所能容纳的范围。
我以前一直以为,“PDF 提取”意味着计算机会用一种与人类阅读大致相似的方式读取文档。事实并非如此,至少默认情况下不是。
大多数提取工具只擅长一件事:读取这些排版指令,然后按照字符被绘制时的大致顺序,把它们返回给你。工程师把这个过程称为内容序列化(content serialization)。你不需要记住这个术语,只需要了解它会在哪里失效。
如果表格的行高不一致——这种情况在财务报表中极为常见——工具就会悄无声息地把各行合并到错误的位置。
签名、印章或 Logo 根本不是文本,因此永远不会被复制出来,即使它们会影响后续的实际决策。
扫描页面完全没有底层字符,它只是一张照片。让一个基础工具“提取”它,你得到的只会是空白。
表单字段中的值可能与页面上视觉呈现的内容完全分开存储。如果只复制可见文本,就可能彻底丢失真正的数据。
这些都不是某个特定工具的 bug,而是“复制字符”这种方法从一开始就注定存在的能力上限。
真正的结构化提取会提出一个完全不同的问题。它问的不是“这里有哪些字符”,而是“这是什么,它与周围的一切有什么关系”。
在实践中,这意味着需要同时完成几件具体的事情:
并排放置的两个文本块会被识别为两个独立的栏,而不是拼成一句混乱的句子。
一组数字会与某个特定表格中的特定行关联起来,而不是作为满页游离的数字存在。
扫描页面会先经过真正的字符识别,让文字照片转化为真实、可用的文本。
系统会直接读取表单字段中存储的值,而不是根据附近碰巧打印出来的内容进行猜测。
一个构建完善的系统也不会只停留在“文本”和“非文本”的区分上。它通常能够识别页面上十余种不同类型的内容:标题、各级小标题、普通段落、表格、图片、脚注、超链接、表单字段,甚至盖章批注。每一项都会根据其真实类型添加标签。
当这些环节全部正确完成后,PDF 就不再是一张只能由计算机显示的图片,而会变成计算机能够使用的结构化数据:可以交给 AI、导入电子表格,或者送入 CRM。
下面是同一张表格在两种方式下的呈现结果。我认为,这个对比比外围的任何文字解释都更有说服力。
BASIC EXTRACTION STRUCTURAL EXTRACTION
"Q3 Revenue Total 142,500 { "type": "table",
Q3 Costs 88,200 Net 54,300" "rows": [
["Q3 Revenue", "142,500"],
one wall of characters, ["Q3 Costs", "88,200"],
no rows, no columns, ["Net", "54,300"]
no idea what belongs ]}
where
every value knows exactly
which row and column
it belongs to
左边的结果,机器可以显示;右边的结果,机器才能真正使用。这正是一个构建完善的结构化提取引擎所要完成的转换。
你不需要编写任何代码,也能理解它的大致工作方式。这类结构化提取系统通常分为四个直观的步骤。
UPLOAD ANALYZE CHECK STATUS DOWNLOAD
(get back a ──▶ (runs in the ──▶ (poll every ──▶ (get the finished,
ticket for background, couple of structured file)
the file) not instantly) seconds)
你把文档交给系统,系统将其存储起来,并返回一个对应于该文件的任务编号。接着,你要求系统分析文档。由于真正读取一个混乱页面需要切实的处理时间,系统会在后台启动任务,而不是立即给出答案。你每隔几秒检查一次任务状态,直到系统报告处理完成。然后,你下载最终结果:一个结构化文件,其中列出了系统发现的每个表格、表单、标题、段落和图片,并准确标注它们各自是什么,以及位于页面上的什么位置。
第一次看这种任务运行时,我一直在刷新页面,后来才意识到,等待本身正是整个流程的关键,而不是系统出了故障。不存在一个瞬间完成的“读取这个 PDF”按钮,因为真正读取一份混乱的现实世界文档,从来就不可能是瞬间完成的操作。系统需要认真地遍历整个页面,一次性把事情做对。
这并不只是工程团队内部流传的一种观点。NVIDIA 在 2025 年进行了一项对比测试,使用真实的财务申报文件和报告,对比专门构建的提取 pipeline 与通用 AI 视觉模型。结果显示,专用提取方案在获取正确信息方面的准确率高出约 7%,页面处理速度则快了约 32 倍。
坦率地说,如此巨大的速度差距也让我感到惊讶。通用模型并不缺乏对页面进行概括性描述的能力。它真正不擅长的,恰恰是那些枯燥的结构化工作:始终把每个数字与正确的行关联起来,把每个字段与正确的标签关联起来,而且每一次都要保持一致。
这种一致性正是真实业务流程所需要的。无论一个粗略猜测听起来多么自信,它都无法可靠地提供这种一致性。专用结构化提取引擎要解决的,正是这一差距。
如果你构建或使用过能够让 AI 根据自己的文档回答问题的工具,那么这里值得停下来认真想一想。
这类工具的工作方式,是先把文档切分成多个 chunk,然后针对某个问题,把最相关的 chunk 交给 AI。
如果输入这些 chunk 的阅读顺序已经混乱——比如两栏内容被合并成一个语无伦次的段落,或者表格中的数字失去了行标签,四处游离——那么无论在其上叠加多么聪明的搜索逻辑,都无法恢复原本的含义。起始 chunk 已经错了,就不可能靠检索把正确含义找回来。
正确识别结构必须发生在检索之前,而不是之后。
RAG pipeline 在这个问题上获得了最多关注,但它并不是唯一会失效的场景。直到我不再把它视为一个“AI 问题”之后,才开始注意到这种模式无处不在。
财务团队把数字提取到仪表盘中时,需要确保每个值都与正确的行标签关联,否则这个仪表盘只是在自信地展示错误结果。
销售团队根据扫描合同自动填写 CRM 时,需要的是表单字段中的真实值,而不是对复选框附近碰巧出现的文本进行最佳猜测。
合规团队构建审计追踪记录时,需要知道文档中存在哪些印章、签名和批注,而不只是其中的段落文本。
团队不同、工具不同,但根本原因每次都一样:上游的某个环节只是复制了字符,却没有理解结构。
如果你需要处理任何具有一定规模的 PDF,不妨直接问自己几个问题。我在许多交流中都问过类似的问题,也很清楚,人们在诚实回答之前通常都会先停顿一下。
你导出的表格中,是否出现过数字本身正确,却落在错误行里的情况?
是否有些功能在直接生成的 PDF 上运行正常,但遇到扫描或传真文档就会出错?
表单明明已经填写了数据,返回的表单值却是否曾经为空?
你的 AI 助手是否会在处理篇幅较长、多栏排版或年代较久的文档时,回答质量明显下降?
只要其中任何一个问题的答案是“是”,通常都可以追溯到同一个根本原因:pipeline 中的某个环节正在复制字符,而不是读取结构。
构建文档密集型产品的公司,不会指望 AI 自己弄明白这一切。它们会在 AI 看到文档之前,就在提取层解决问题,使用专门构建的工具,把表格、表单、扫描页面和页眉识别为它们本来的不同事物,而不只是网格上的一堆字符。
Foxit 的工程团队最近发布了一篇详细的技术解析,深入讲解了这一过程在底层究竟如何运作,包括流行提取库中的具体失效点,以及构建完善的结构化提取引擎如何避开这些问题。如果你正在构建任何需要规模化处理 PDF、发票、合同或扫描表单的产品,这篇文章值得一读:《深入 Foxit 的 PDF 结构化提取引擎》。
下次 AI 针对某份文档给出自信满满但完全错误的答案时,不要急着责怪模型,先检查上游环节。很可能在 AI 介入之前,某个表格就已经丢失了行结构,或者某个扫描页面根本没有被读取。
每次看到 AI 在舞台演示中“完美读取”文档时,我都会想到这一点。舞台演示使用的是干净整洁的 PDF,生产环境可不是。两者之间的差距,正是本文一直在讨论的差距:复制字符与真正理解结构之间的差距。现在,在信任任何一种结果之前,你已经知道该问什么问题了。
Foxit 的开发者团队会定期发布此类技术解析,涵盖 PDF API、文档自动化和 Agent 式文档工作流。如果“底层实际发生了什么”这类内容对你有帮助,可以关注 Foxit Developer Solutions 的 LinkedIn 页面,他们会在那里率先发布相关文章。本文所依据的原始技术文章也值得直接收藏:《深入 Foxit 的 PDF 结构化提取引擎》。
你还可以关注 Foxit 的 LinkedIn 主页,了解开发者内容以外更广泛的产品动态。
Foxit,《深入 Foxit 的 PDF 结构化提取引擎》
LinkedIn:"https://www.linkedin.com/company/foxit-corporation"
如需采取进一步措施,你可以考虑屏蔽此人和/或举报滥用行为。