文 / Seeek X
PDF 保存的是页面呈现结果,不一定保存人类理解的阅读顺序。解析 PDF,需要同时处理文字层、几何位置、版面结构与扫描图像。
02|PDF 不是文本:RAG 解析 PDF 时到底在解析什么?
打开一份 PDF,我们会自然地从标题读到正文,从左栏读到右栏,也知道页脚不是内容。
于是很多人会以为,程序看到的也是同一篇文章。
实际上,PDF 更像一张“如何把页面画出来”的说明书。它首先关心的是某个字符放在什么位置、使用什么字体、图片画在哪里,而不是这句话属于哪一段、哪一节,应该排在谁后面。
人看到的是文档,解析器先看到的往往只是页面元素。
三种 PDF,实际上是三类输入
第一类是原生文本 PDF。
它通常由 Word、排版软件或业务系统导出,页面背后存在可选择的文字。复制一段内容能够得到正常文本,解析器也可以读取字符及其坐标。
第二类是扫描 PDF。
每一页本质上是一张图片。人能看见文字,是因为大脑在识别图像;程序如果不经过 OCR,只会知道这里有一张图。
第三类是混合 PDF。
有些页面有文字层,有些页面是扫描件;有些文件给扫描图叠了一层 OCR 文本,但文本位置错乱或内容重复。它看起来最像“已经处理好”,实际却可能带来隐蔽错误。
因此,解析前的第一个问题不该是“用哪个 PDF 库”,而是:这一页究竟有什么层?
有文字层,为什么顺序仍然会乱?
因为页面坐标不等于阅读顺序。
想象一篇双栏论文。视觉上,我们先读完左栏,再从右栏顶部继续。解析器如果只按照字符写入文件的顺序提取,可能读成左栏第一行、右栏第一行、左栏第二行、右栏第二行。
同样的问题还会出现在:
• 标题横跨两栏,正文从下一行分开;
• 文本框、批注和脚注散落在不同坐标;
• 表格中的数字逐个绘制,没有天然的行列结构;
• 页眉页脚每页重复,却比正文更早被读取;
• 一个单词被换行连字符拆开,抽取后无法复原。
所以 PDF 解析不是简单的“把文字拿出来”,而是要根据位置、间距、字体和版面区域,推断哪些字符组成一行、哪些行组成一段、哪些区域应该先读。
OCR 解决的是“看见字”,不是“理解页面”
扫描 PDF 必须先经过 OCR。但 OCR 的主要任务,是把像素识别成字符。
它可以告诉系统某个矩形区域里可能写着“年度总收入”,却不一定知道它是表头、图例还是正文;也不一定知道右侧的“1250”与它属于同一行。
OCR 之后仍然需要版面分析:
找出标题、正文、列表、表格、图片和页眉页脚区域;
恢复区域之间的阅读顺序;
合并跨行、跨栏甚至跨页的内容;
对低置信度字符和异常结构作标记。
这就像有人把照片上的每个汉字都认了出来,但把字条剪散后交给你。认字完成了,文章还没有恢复。
为什么“复制出来正常”也不能证明解析可靠?
手工复制通常只覆盖一小段,而且人会自动修正轻微错序。
RAG 处理的却可能是几千份文件。一个每页都出现的页眉,会被重复几千次;一个表格列错位,会让大量数值失去归属;一个隐藏 OCR 层与可见文本重叠,会制造成倍的重复内容。
更可靠的抽检方式,是准备几类固定样本:
• 单栏与双栏正文;
• 跨页表格;
• 带脚注和页码的报告;
• 纯扫描件;
• 扫描图加隐藏文字层的文件;
• 中英文、数字和特殊符号混排的页面。
然后比较的不是“有没有抽出字”,而是标题层级、段落顺序、表格关系、重复内容和页码定位是否正确。
一条实用的 PDF 解析路线
生产系统可以先按页诊断,而不是把整份文件一股脑送进同一个解析器。
如果页面存在质量良好的文字层,就优先使用确定性的文字与坐标抽取;如果没有文字层,再进入 OCR;如果版面复杂,则增加布局识别;如果页面包含难以规则化的图表或视觉关系,再把特定区域交给多模态模型解释。
这条路线的重点不是工具名称,而是分流。
能稳定抽取的页面,不必承担模型成本和不确定性;真正依赖视觉理解的页面,也不应该被一个只会读取字符流的工具草草处理。
PDF 解析的完成标准
对于 RAG,一页 PDF 至少应该留下四类信息:
• 内容:文字、表格、图片说明等;
• 结构:标题、段落、列表、表格区域及阅读顺序;
• 位置:页码、坐标或可定位的区域;
• 状态:使用了哪条解析路线,哪里置信度低,哪里可能失败。
只有这样,当答案引用某句话时,用户才能回到对应页面;当结果异常时,工程师也能判断是 OCR 认错字,还是版面顺序排错了。
PDF 不是一篇等待复制的文本,而是一张等待重建的页面。
下一篇,我们把视线从 PDF 扩展到 Word、网页和 Markdown:格式各不相同,进入知识库后要不要都变成纯文本?
技术边界:不同 PDF 的内部结构差异很大。本文给出的是诊断框架,不代表存在一条对所有 PDF 都最优的固定流水线。
感谢阅读
如果觉得有收获,欢迎 点赞、在看、转发
夜雨聆风