直接回答
可靠的离线 PDF 搜索应只承诺应用确实提取出来的文字,并让每个命中带有足够的来源位置,方便读者回到原文核对。旧 Android PdfRenderer 接口负责页面渲染;API 35 增加 PdfRenderer.Page.getTextContents 与 searchText。应固定并单独测试实际文字 API 或解析器,渲染像素本身不证明文本已提取。Storage Access Framework(SAF)提供用户选择文档的 URI 和访问授权,但不保证提供者一定在本机,也不保证文件永远可用,更不代表 PDF 含有可选择文字。这些都要作为独立假设验证。事实卡 RAG-01 和 PRIVACY-01 支持来源可追溯和数据边界审查,却不能证明 Cove 已具备 PDF 能力。本文是验证方法,不是产品声明。 先把功能范围收窄为确定性检索:对指定解析器返回的文本建立词项索引,保存文档身份和页码,并搜索字面词项。扫描图片页的 OCR 是另一条路径,有独立输出和失败状态。不能默默把所有页面渲染成图像,再交给视觉模型却称作普通 PDF 搜索。也不要把向量或生成式答案塞进同一验收项;那会改变检索行为,需要另一套证据、引用规则、隐私分析和无结果策略。 在改代码前准备有确定答案的样例集:含可选择文字的电子 PDF、图片扫描页、混合文件、旋转页、重复页眉,以及范围内的损坏或受限文件;再加上来自不同提供者、显示文件名相同的两个文件。审核者预先标注预期词项、页码以及绝不能出现的词项。优先使用合成文档;若用获准真实文件,不要把原件或文字写进日志与报告。为样例记录稳定测试标识;适用时可记录源字节摘要,避免参考答案被悄然替换。 追踪每一层:URI 如何取得、授权是临时还是持久、解析器名称和版本、哪些页返回文字、哪些页没有以及原因。索引记录应含来源标识、页码、解析版本和偏移或摘录,使用户能打开原始上下文。如果解析器只提供整份扁平字符串,不得编造页码映射。若规范化改动大小写或标点,要保留通向原始摘录的方式并说明规则。 结果只有可审计才有用。查询集要先标注预期页面,再检查精确词项、标点、重复页眉、同名文件、空白页以及位于页首和页尾的词项。记录漏检和意外命中。搜索结果不是宽泛问题的答案;要展示源页面,让人阅读上下文。若加了排序,相关性判断应与解析正确性和字面匹配分开记录。 访问与保留还需另一轮验证。提供者可能撤销授权、同一文档句柄返回不同字节,或依赖网络。不要从“离线”标签推断整个流程都本地运行;应在受控无网络状态下观察具体路径,并记录不可用的设置或提供者行为。明确应用保存的是私有副本、提取文本缓存、索引,还是仅保存 URI;它们有不同保留影响。用户删除或撤销权限后,应使所有派生文字和搜索记录失效。再次搜索确认被删词语不再出现在结果、诊断、备份或测试导出中。 最终报告列出构建、Android 版本、提供者入口、解析器版本、样例清单、索引结构、查询集及全部失败。它可以说固定样例得到了已核验的页码命中,不能推广到所有 PDF、提供者或语言。扫描页在独立 OCR 测试前应明确标为未索引;答案生成保持在本文范围之外。这样可以验证一个小型本地搜索功能,而不会暗示 Android 渲染、Cove 或未经验证的模型已经提供 PDF 理解能力。
旅客登机前离线搜索行程 PDF
旅客在登机前通过 Android 文档选择器打开已保存的行程 PDF。文件含可选择的酒店文字、扫描地图页和重复页眉。稍后没有网络时,旅客搜索车站名称,需要一个能回到原文页面核对的结果。
决策
分别测试 URI 授权、文本提取、页码映射、精确搜索和删除;除非有独立验证过的 OCR 路径,否则扫描页显示未索引。
预期结果
已核验命中标明来源和页码;扫描页显示限制,不虚构结果。
需要收集的证据
只有将以下证据与同一模型文件和测试运行关联起来,结论才可复核:
- RAG-01:检索结果需要来源与位置
- PRIVACY-01:本地推理不代表所有数据路径均本地
任务质量需要有版本记录的语料和验收规则;流畅的单条样例不等于准确度结果。
实施流程
- 定义导入和授权状态. 使用用户选择的测试 URI,记录提供者、授权类型、进程重启行为和撤销结果。经过系统选择器并不能证明文件保存在本机。
- 搜索前分类逐页提取. 运行选定解析器并记录每页文本、空输出、错误和页码映射。将 PDF 渲染、文本提取和可选 OCR 保持为不同阶段。
- 构建保留来源的索引. 保存来源标识、页码、解析器版本、规范化词项及必要偏移,使用户能够打开页面并核对原文上下文。
- 用带标签的查询集评估. 搜索前准备预期词项及页码。检查重复页眉、标点规范化、缺失页、同名不同源文件和意外命中。
- 测试撤销授权和删除. 移除或撤销来源、使派生记录失效后再次搜索,确认已删除内容不再出现在结果、日志、备份或测试输出中。
让每个阶段的状态都可观察。失败信息应指出阶段、模型、运行时和恢复动作,同时避免记录用户私密内容。
验收标准
- 每个命中都有已核验的来源标识和页码;若无法映射页码,界面必须明确说明。
- 图片页、损坏文件、受限文件和授权撤销都产生明确结果,不得伪装成成功文本索引。
- 报告区分解析、精确搜索、可选 OCR 与生成答案,不作未经证实的 Cove 能力声明。
决策对照表
| 维度 | 选择或证据 | 解读方式 |
|---|---|---|
| 可搜索电子文本 | 提取文本并保留页码映射 | 只支持解析器实际暴露内容的确定性查找。 |
| 扫描图片页 | 标记未索引或单独测试 OCR | 页面渲染不是文字提取,OCR 也有独立证据和失败场景。 |
| 生成式答案 | 视为独立检索与生成功能 | 需要独立验证依据、引用、隐私及无答案处理。 |
需要避免的失败模式
- 把页面渲染当作文本提取
- 把扫描页静默记为无命中
- 丢失页码和来源
- 将索引内容留在删除后的记录中
还要避免静默回退、版本未固定、缺少取消处理,以及把不同配置的结果混在一起下结论。失败运行也应与成功记录一并保存。
最小复现记录
| 层级 | 记录内容 |
|---|---|
| 设备 | 厂商、型号、芯片、内存档位、操作系统版本 |
| 软件 | 应用版本和 Git 提交号 |
| 模型 | 系列、变体、版本、格式、文件长度、摘要、量化方式 |
| 运行时 | 名称、版本、请求后端及实际后端证据 |
| 工作负载 | 样例版本、输入摘要、提示词摘要、输出策略 |
| 结果 | 完成、失败、取消、回退及保护隐私的诊断信息 |
发布检查表
- ☐ 主要搜索问题已回答,且没有未经支持的数字。
- ☐ 所有模型文件和运行时版本均已固定。
- ☐ 代表性任务和失败处理策略均有说明。
- ☐ 生命周期、取消、清理和回退均已测试。
- ☐ 用户内容与网络边界均有说明。
- ☐ 结论只适用于被记录的配置。
- ☐ 新增测试结果时链接到原始方法或证据。
来源与相关证据
- Android PdfRenderer API
- Android PdfRenderer.Page 分版本文字 API
- Android Storage Access Framework 文档与文件
- Android 文档提供者 URI 授权
中文部署与排错专题见。奇连 AI 端侧专题。
常见问题
Android PdfRenderer 会提取可搜索 PDF 文本吗?
要区分版本:PdfRenderer.Page 在 API 35 加入 getTextContents 与 searchText。旧页面渲染接口不证明能提取文字,生成位图本身也不是可搜索文本的证据。明确并测试实际文字 API、parser 或 OCR 阶段,保留页码来源,以及空结果和不支持状态。
从系统选择器选择 PDF,能证明它保存在本机吗?
不能。SAF 可以提供不同提供者的文档。应记录提供者和 URI 行为,并测试确切流程的网络与持久化边界,也要核实撤销授权后的索引清理。
可以把搜索命中直接写成用户问题的答案吗?
不可以,除非另有经过验证的来源约束问答功能。精确搜索应返回来源和页码,让读者查看原文上下文;命中片段本身不是完整答案。