ARTICLE · 1333704
PDF、表格、扫描件:企业文档的解析管线,才是 RAG 的第一道生死关
AI × JAVA · 工程笔记 28
让原文件的关系、单位和出处一起进入索引
先把结论说清楚
PDF里“有字”不等于知识已经正确入库。表头、单位、脚注和原页位置丢了,数字本身也可能变成错误证据。
一、数字还在,语义可能已经断了
设定一份合成设备手册:第一页写额定功率与单位,第二页续表只剩型号和数字。抽取器保留了四十五,检索也能找到它,但回答不知道这是千瓦、伏特还是表中的另一个指标。问题不是文字数量太少,而是来源关系在入库时被拆散。
PDF、表格、扫描件与图文混排需要不同的摄入路线,不能仅凭文件扩展名选择处理器。上游丢失会限制后续,但视觉检索、回源读取与人工复核仍可能补证据,答案质量不只由解析决定。真正要做的是识别信息缺口、保留原始来源,并为失败材料提供可验证的修复路径。
二、先按页面和内容分类,不只按扩展名
一个PDF可以同时有原生文本、扫描页、隐藏OCR层和插图。是否能抽出文字不等于文字可用:它可能乱码、顺序错或只覆盖页眉。逐页记录文本质量、图像类型与结构,再决定文本布局、OCR或视觉辅助路线,不能一个文件统一贴扫描件标签就结束。
可以把摄入看成给书建立可追溯索引:知道字在哪一页,还要知道它属于哪一栏、哪张表。类比的边界是PDF往往保存绘制位置而非阅读顺序,索引员无法仅按出现顺序推断语义。PDFBox的文本抽取说明可帮助理解这个边界,但工具调用成功不代表已经还原版式。
页眉页脚要根据实际模板识别,固定裁掉顶部六十个单位可能也删掉正文标题。保存原页与裁剪变换,先在多模板样本上验证;页边距、旋转、双栏和脚注都值得独立检查,不能拿一份干净PDF代表全部资料。

摄入保留的是信息与原文关系。原创机制/实验示意,推算曲线。
三、文本路线保住顺序和出处
原生文本先处理字符映射、阅读顺序、段落与标题层级,再切分。每个片段保留文档修订、物理页、印刷页码、章节、原文范围及解析器版本;清洗后的字符位置和原PDF坐标不相同,需要映射而不是复制一个offset。
连字符换行、列表编号、否定词与数学符号容易在清洗中改变含义。移除页眉可降低噪声,但不能删除所有重复句;安全声明和单位可能恰好每页重复,却是必要条件。每条清洗规则保存版本和前后差异,便于回放故障。
Spring AI的ETL组件可组织Reader、Transformer与Writer职责,却不自动保证所有文档结构正确。示例API要按项目依赖版本核对;本文不把自定义parseTable占位函数包装成框架已经实现的能力,实际工作量应留在解析与验证步骤。
字符映射失败时,页面肉眼可读但抽取文本仍可能乱码。应把可见渲染与抽取结果配对抽查,确认问题来自字体映射、阅读顺序还是内容本身;重新OCR是一个可验证路线,而不是把所有异常字符静默删除。
四、表格路线保住键、单位和空值语义
简单表可按行序列化并带完整表头;层级、合并格与跨页续表则需要额外结构。行记录要能定位回原表,表头路径和单位不能只存在另一个无关chunk。详细的单元格证据闭包另文讨论,这里的重点是摄入不能把原关系不可逆丢掉。
空白、零、破折号、未提供和不适用不是同一值。列类型、日期序列、区域格式、负数括号和百分比应显式标准化,同时保留原显示值。Excel有坐标也不等于天然简单:公式、隐藏行、合并格和缓存值仍影响读取。
Apache POI的公式评价文档说明公式单元格与计算结果的区别。选择读取公式、已有缓存或实际求值,要根据工作簿与支持函数确定;外部链接、未支持函数和陈旧缓存应标明,不能悄悄把旧结果当成当前计算事实。
五、扫描与图像路线不要迷信单个置信数
OCR前的分辨率、旋转、背景与版面分割会影响结果,Tesseract官方质量说明可作处理参考。识别后检查关键字段与结构,不仅看平均字符正确;一个金额小数点或型号字符错,可能比十个普通错字更重要。
不同OCR工具和字段的置信分数未必可直接比较,零点八五不应作为跨引擎万能入库阈值。可用标注集校准字段级复核策略,低把握时保留图页并进入待确认,而不是只留下看似整洁的错误文本。
图表、照片和示意图可保留原图与说明,必要时由视觉模型辅助检索或阅读;自动图注是派生内容,可能猜错箭头与部件,不能替代原图证据。图中文字和文本段落相互引用时,也要保存关系与坐标。
质量分数也要保存粒度:整页平均很高,不代表目标金额或否定词可靠。复核优先级可以结合字段重要性与识别不确定性,关键错字单独报警;提高门槛后还应查看多少合法页面被错送人工,避免只优化错误率而积压全部任务。
六、Java只验证路线和记录合同
下面是Demo.java已编译原样摘录,usableText与meaningfulImage由人工夹具给定。它不检测真实页面;row也不解析PDF或Excel,只验证表头和值一一对应,附来源与修订,缺值保留为MISSING。
源码中的路由说明混合页可同时需要两类处理,而不是强迫二选一。生产还需字段策略、阅读顺序、坐标变换、权限与错误恢复;这段小代码不能据此宣称解析系统已经完成。
JAVA 示例代码 · 点击图片可放大查看


七、验收应问资料还能回答原问题吗
准备80份合成或获准测试文档,原生双栏、表格续页、扫描、图文混排各20份。按模板族分开发与盲测,人工标注段落顺序、关键字段、表格关系和出处;再给每份若干可核验问题,检查信息是否被保留,而不只统计输出字数。
A用单一文本提取,B按页面路由并保留结构,C在B上加质量复核与回源。固定同一文件版本、切分和检索配置,先比较解析产物,再将相同问题送下游;若改了阅读模型,需另设对照,不能将收益全算给解析。
单独注入旋转、低分辨率、重复页眉、断开的表头、公式缓存过期和型号近形字符。缺失原文件、密码保护或不支持格式应有明确失败状态,保留重试与人工处理入口,不能用空文档代表成功。
验收指标至少分空结果、关键字段精确、阅读顺序、结构关系与来源可定位,并注明分母是页、字段还是文档。只有失败文档进入人工池时,抽查也要覆盖已自动通过的文档,防止高置信错值长期无人发现。
八、结果预期:质量门要看错误成本
在标注与模板代表性可靠时,B可能改善顺序与关系,C可能减少高影响错值进入索引,但人工复核和图页保留会增加成本。实际投入应分解析、复核与下游返工记录,随文档类型变化;一个工具的字符分数也不能代表所有业务答案都正确。
计划80份×三路线为240次解析作业;若每份3题,下游为720次问答条件,尚未计重复与裁判。本文没有执行这些PDF、OCR或模型实验,未提供乱码率、表格保留率或答案准确率实测。
实际只运行Java21的三路选择、带单位行序列化、来源页和缺值非零断言。局部记录正确不代表原始资料正确,也不能作为大规模入库已验收的证据。
九、保留能重新解释的原材料
交付产物应包括原文件摘要、解析版本、页面变换、结构记录、质量错误与原文映射。索引只是可重建派生物,源证据不可因换解析器而无痕覆盖;修复时只重建受影响版本并保留前后验证。
RAG摄入不是把文件变成一串字,而是把信息及其关系搬到可查询世界。让下游知道哪里确定、哪里缺失、怎么回源,比把所有文件都标成成功更可靠。
还应限制单文件页数、图像尺寸、解析耗时和解压资源,避免一个坏文件拖住整个批次。批处理按文档隔离失败,记录已完成的稳定阶段,再从可验证检查点恢复;重跑不能重复写入同一批派生片段。

按模板族验证信息是否保留。原创机制/实验示意,推算曲线。
一图回顾


Java 示例与参考资料
示例覆盖的逻辑:Java21人工页面路由、行记录与缺值合同,无PDF/OCR/Excel解析或模型。
运行命令:javac -encoding UTF-8 Demo.java && java -ea Demo
本地示例输出:pageRoutes=TEXT_LAYOUT/OCR_OR_VISUAL/HYBRID; assertions=PASS row=型号=ZX-100; 额定功率(kW)=45; missing_not_zero=true PDF_OCR_spreadsheet_parsing=NOT_RUN
以下参考一手文档、原始研究或作者实现;指标定义与计算参数见正文。
Apache PDFBox 3 FAQ(已打开)
Tesseract ImproveQuality(已打开)
Apache POI Formula Evaluation(已打开)
Spring AI ETL Pipeline(已打开)















































































