pdf-inspector
Rust 编写的高速 PDF 分类与文本提取库,支持 Python/Node.js/WASM 多平台,200ms 内完成文本 PDF 处理,基准测试综合分 0.875 排名第一
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
Rust 编写的高速 PDF 分类与文本提取库,支持 Python/Node.js/WASM 多平台,200ms 内完成文本 PDF 处理,基准测试综合分 0.875 排名第一
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
凌晨两点的办公室里,数据工程师小张面对着一堆混杂的 PDF 文件发呆——有扫描件、有原生文本、有表格密集的财务报告,还有图片拼成的"伪 PDF"。他试过 PyMuPDF,速度慢得令人绝望;试过云端 OCR 服务,成本高得吓人。他急需一个方案,能在本地快速区分哪些需要 OCR、哪些直接解析文本,然后统一输出干净的结构化 Markdown。
Firecrawl pdf-inspector 就是为这个场景而生的。
PDF 处理长期以来是 AI 数据 pipeline 中最令人头疼的环节之一。市面上主流方案大致分两类:
问题的根源在于:大约 54% 的 PDF 是原生文本 PDF,根本不需要 OCR。这类文档只需要解析 PDF 结构、提取文字和布局信息即可。但现有工具往往"一刀切",对所有 PDF 都走完整流程,浪费了大量计算资源。
Firecrawl 团队在构建网站抓取平台时遇到了这个痛点,决定从底层解决这个问题——用 Rust 写一个专门针对 PDF 的解析库,既要快(本地 <200ms 处理一份),又要准(表格结构、多栏布局、标题层级都不能乱)。
pdf-inspector 的设计哲学是**"先分类,再路由"**。整个处理流程分两步:
通过采样 PDF 内容流,该库能在毫秒级判断当前文档属于四种类型中的哪一种:
| 类型 | 说明 | 处理策略 |
|---|---|---|
| TextBased | 原生文本 PDF | 直接解析,无需 OCR |
| Scanned | 纯扫描件 | 必须走 OCR |
| ImageBased | 以图片为主的 PDF | OCR |
| Mixed | 混合型 | 部分页面 OCR,部分直接解析 |
检测结果还会给出置信度分数(0.0-1.0)和逐页 OCR 路由建议,方便构建混合处理 pipeline。
对于 TextBased 文档,提取过程极为精细:
最终输出干净的 Markdown 格式,包含 H1-H4 标题层级(按字体大小比例计算)、有序/无序列表、代码块(通过等宽字体识别)、表格(跨页续表自动合并)、粗体/斜体、超链接等。
在 opendataloader-bench 标准评测集(200 份真实 PDF,涵盖研究报告、财务报表、法律文档、发票等)上,pdf-inspector 的表现相当亮眼:
| 引擎 | 综合分 | 阅读顺序 | 表格结构 | 标题层级 | 处理速度 |
|---|---|---|---|---|---|
| pdf-inspector | 0.875 | 0.915 | 0.814 | 0.788 | 0.470s |
| liteparse | 0.873 | 0.913 | 0.693 | 0.811 | 0.750s |
| opendataloader | 0.831 | 0.902 | 0.489 | 0.739 | 2.569s |
| pymupdf4llm | 0.735 | 0.886 | 0.401 | 0.424 | 17.117s |
| markitdown | 0.589 | 0.844 | 0.273 | 0.000 | 16.165s |
测试环境为 Apple M4 Pro(2026 年 7 月 31 日刷新)。pdf-inspector 在综合分、阅读顺序和表格结构三项上均排名第一,处理速度是第二名的 1.6 倍,是 MarkItDown 的 36 倍。
pdf-inspector 不只是一个 Rust 库,它提供四个平台的原生绑定:
pip install maturin
maturin develop --release # 编译 Rust 扩展
import pdf_inspector
result = pdf_inspector.process_pdf("document.pdf")
print(result.pdf_type) # "text_based", "scanned", "image_based", "mixed"
print(result.markdown) # Markdown string or None
npm install @firecrawl/pdf-inspector
import { processPdf, classifyPdf } from '@firecrawl/pdf-inspector';
const result = processPdf(readFileSync('document.pdf'));
console.log(result.pdfType); // "TextBased", "Scanned", "ImageBased", "Mixed"
console.log(result.markdown); // Markdown string or null
Node.js 版本提供区域提取(bounding box),返回每个区域的 needsOcr 标记,方便构建精确的混合 pipeline。预编译平台二进制订 5-6 MB,TypeScript 类型定义内置。
npm install @firecrawl/pdf-inspector-wasm
import init, { processPdf } from "@firecrawl/pdf-inspector-wasm";
await init();
const result = processPdf(new Uint8Array(pdfBuffer));
WASM 版本在浏览器中完全本地运行,PDF 字节不会上传到任何服务器。CMap 文件已嵌入包内,CJK 字体解码不依赖文件系统。单线程运行,不需要跨域隔离,适合 Web Worker 中处理大文档避免 UI 卡顿。
pdf-inspector 的核心代码完全使用 Rust 编写,零依赖机器学习模型,不调用任何外部 API,唯一外部依赖是 lopdf(PDF 解析)。
src/
lib.rs – 公开 API,process_pdf_with_options
detector.rs – PDF 类型分类,扫描检测,逐页采样
types.rs – TextItem, TextLine, PdfRect, PdfLine
tounicode.rs – CMap/ToUnicode 解析,CID 解码
text_utils.rs – CJK/RTL 处理,Otsu 阈值,连字展开
extractor/
content_stream.rs – PDF 操作符状态机(Tj/TJ/Td/Tm/q/Q)
fonts.rs – 字体宽度/编码,CMapDecisionCache
layout.rs – 栏检测(直方图),报纸/表格分类
tables/
detect_rects.rs – 矩形表格检测(并查集聚类)
detect_heuristic.rs – 启发式表格检测(间距直方图)
detect_lines.rs – 线边框表格检测
grid.rs – 行列边界,单元格分配
format.rs – 表格→Markdown 格式化
代码质量管控严格:所有提交必须通过 cargo fmt(格式化)、cargo clippy -- -D warnings(零警告级别静态检查)、cargo test(267 个单元测试 + 73 个集成测试)。CI/CD 由 GitHub Actions 驱动。
pdf-inspector 的出现,填补了"本地快速处理 + 高质量输出"这个长期存在的空白。它让隐私敏感的文档处理(医疗记录、法律合同、内部报表)可以在本地完成,而不需要昂贵的云端服务或缓慢的通用 Python 库。
从 Firecrawl 团队的战略角度看,pdf-inspector 是其 AI 数据 pipeline 的核心组件——公司 104 个 GitHub 公开仓库、近 3000 粉丝的社区体量,都建立在稳定、高性能的文档解析能力之上。第三方开发者也已开始为其构建 Swift 绑定(iOS/macOS)、Web UI(浏览器端零依赖界面)等扩展生态。
最佳适用场景:研究报告、财务报表、法律文档、发票合同、政府公开文件等以文本和表格为主的 PDF 数据提取与 AI 训练语料清洗。