ENGINEERING NOTES
技术专栏目录
01 firecrawl/pdf-inspector 如何把 PDF 先分类再提取:Rust 本地库的最小使用流程
NO.01
firecrawl/pdf-inspector 如何把 PDF 先分类再提取:Rust 本地库的最小使用流程
2026/08/04 00:00:00
TECH NOTE
先给结论:它解决的是 PDF 进入下游流程前的分流问题
pdf-inspector 是 firecrawl 开源的 Rust PDF 检查、分类和文本提取库,主要入口包括 Python 的 pdf_inspector.process_pdf、Node.js 的 processPdf/classifyPdf,以及浏览器侧的 @firecrawl/pdf-inspector-wasm。
这个项目最值得看的不是“又一个 PDF 转文本工具”,而是先判断文件属于 text_based、scanned、image_based 还是 mixed,再决定继续本地解析、转入 OCR,还是进入人工复核队列。
README 给出的 Python 构建路径是 pip install maturin 与 maturin develop --release;Node.js 侧使用 npm install @firecrawl/pdf-inspector;WASM 侧使用 npm install @firecrawl/pdf-inspector-wasm。
官方基准使用 opendataloader-bench 的 200 份 PDF,在禁用 OCR、只比较本地非模型解析器的条件下,pdf-inspector overall 为 0.875,reading order 为 0.915,tables 为 0.814,200 份文档速度为 0.470s。
短期更适合做原生文本 PDF 的快速入口分流和 Markdown 提取;如果主要输入是扫描件、照片 PDF 或需要 OCR 识别,它不能替代 OCR 引擎。
TECH NOTE
这个项目为什么会火:PDF 解析的第一步经常被做错
TECH NOTE
前置条件:先把它当作本地库,而不是云端文档服务
TECH NOTE
最小使用路径:从源码构建到一次分类和 Markdown 输出
获取 firecrawl/pdf-inspector 仓库并进入项目目录,检查 README.md、pyproject.toml 和 src 目录是否存在;这一步的对象是源码,输入是本地 Git 工作区,检查点是后续 maturin 能在当前目录找到 Python 构建配置。
安装 maturin 并执行 maturin develop --release,目标是把 Rust 核心构建成本地 Python 扩展;检查点是 Python 解释器能够 import pdf_inspector,而不是只看到安装命令成功结束。
把待测样本命名为 document.pdf 放在仓库根目录,至少先用一份原生文本 PDF 试跑;检查点是 process_pdf 能返回 result.pdf_type,并且输出值落在 text_based、scanned、image_based、mixed 这类分类结果里。
用 Python 调用 pdf_inspector.process_pdf("document.pdf"),打印 pdf_type 与 markdown;检查点是原生文本 PDF 应该能得到 Markdown 字符串,扫描件或图片型 PDF 则可能返回空内容或不适合继续本地文本提取。
如果你的服务栈在 Node.js,安装 @firecrawl/pdf-inspector,并把同一份 document.pdf 交给 processPdf(readFileSync('document.pdf'));检查点是 pdfType 与 markdown 能在服务端脚本中被读取,便于后续接队列、数据库或 RAG 管线。
如果要在浏览器或 WASM 环境处理文件,再安装 @firecrawl/pdf-inspector-wasm;检查点是调用前必须 await init(),输入必须是 Uint8Array,而不是直接把文件路径交给 WASM 入口。
记录每份样本的 pdf_type、markdown 是否为空、Markdown 长度和处理耗时;检查点不是“跑通一次”,而是能否把 scanned、image_based 和 mixed 样本从 text_based 样本里稳定分出来。
BASH
git clone https://github.com/firecrawl/pdf-inspector.git cd pdf-inspector pip install maturin maturin develop --release python - <<'PY' import pdf_inspector result = pdf_inspector.process_pdf("document.pdf") print(result.pdf_type) print(result.markdown) PY npm install @firecrawl/pdf-inspector npm install @firecrawl/pdf-inspector-wasmTECH NOTE
命令与配置:能确认的配置很少,但边界反而清楚
ENV
[build-system] requires = ["maturin>=1.0,=3.8" [tool.maturin] features = ["python"]TECH NOTE
工作流拆解:把 pdf_type 当作路由信号,而不是展示字段

TECH NOTE
验收清单:不要只看能否打印 Markdown

验收指标要至少记录四项:每份 PDF 的 pdf_type、markdown 是否为空、Markdown 字符长度或行数、处理耗时;如果目标是表格或报告,还要人工抽查阅读顺序和表格结构是否足够进入下游。
权限和隐私边界比较清楚:pdf-inspector 是本地 Rust 库,README 没有要求 API key 或外部服务;但你自己的接入层如果把 PDF 上传到对象存储、OCR 服务或日志系统,隐私边界就已经不再由 pdf-inspector 单独决定。
不适合扩大使用的失败条件很明确:扫描件占比高、mixed 文件经常漏页、Markdown 表格结构不能满足抽取需求、maturin 构建在目标部署环境不稳定,或者浏览器 WASM 处理大文件时内存不可控,都应该暂缓全量替换。
分类结果要和人工抽样对照。至少挑出 text_based、scanned、image_based、mixed 各若干份样本复核;如果分类经常与人工判断不一致,后面的 OCR 路由和 RAG 入库都会被污染。
性能验收不能直接照搬官方 0.470s。官方数字是在 Apple M4 Pro、200 份 opendataloader-bench 文档、五次轮换完整运行并排除预热的条件下得到的;你的服务器、文件大小、并发方式和 I/O 路径都会改变结果。
TECH NOTE
取舍判断:今天该不该把它放进你的 PDF 流程
DECISION
今天可以试的人:正在做文档导入、RAG、报告解析、合同或发票文本抽取,并且手里有较多原生文本 PDF 的开发者,可以先 clone firecrawl/pdf-inspector,按 README 的 maturin 和 process_pdf 路线跑 20 份真实样本。应该先观望的人:主要处理扫描件、照片 PDF、手写内容或强依赖 OCR 的团队,不要把它当完整文档理解方案。试用时看三个指标:pdf_type 与人工判断的一致率、markdown 对阅读顺序和表格结构的保留程度、在你自己的机器和部署环境里的单文件耗时与构建稳定性。
夜雨聆风