PDF Inspector:基于 Rust 的 PDF 检测、分类与文本提取库
由 Firecrawl 构建的 Rust 库——智能区分文本型与扫描件 PDF,本地 200ms 内提取为干净 Markdown,无需 OCR
1.3K Forks
Rust
MIT
默认轻量·无需 OCR
PDF Inspector 是 Firecrawl 开源的一个快速 Rust 库,专注于 PDF 检测(分类)与文本提取。它默认判断一个 PDF 是「文本型」还是「扫描件」,提供带位置感知的文本提取并转换为干净的 Markdown,且无需 OCR 即可工作。项目面向需要处理大量 PDF 的开发者与数据团队,解决「先判断类型、再决定是否调用昂贵 OCR」的路由问题。本文覆盖它的产品定位、核心功能、安装使用、获取方式、同类对比、核心机制、实用技巧、更新动态与常见问题。
一、产品深度介绍
(一)它是什么
PDF Inspector 是一个开源的 Rust 库,核心职责只有两件:一是「看懂」一个 PDF 到底是文本型还是扫描件,二是在不需要 OCR 的前提下,把文本型 PDF 抽取成带结构的干净 Markdown。它的官方定位非常直接:「Fast Rust library for PDF inspection, classification, and text extraction」,即一个用于 PDF 检测、分类与文本提取的快速 Rust 库。
这个定位背后有一个真实的工程动机:Firecrawl 在构建网页/文档抓取管道时发现,大约 54% 的 PDF 其实是文本型,根本不需要昂贵的 OCR 服务。PDF Inspector 因此被设计成在本地 200ms 内完成文本型 PDF 的处理,从而让这部分文档直接跳过 OCR,大幅节省延迟与算力成本。
(二)技术定位与性能
- 智能分类:通过采样内容流,在约 10–50ms 内检测出 TextBased、Scanned、ImageBased 或 Mixed 类型,并返回置信度(0.0–1.0)以及逐页的 OCR 路由建议。
- 位置感知提取:提取文本时保留字体信息与 X/Y 坐标,支持自动多列阅读顺序;对于旋转文本(如页边戳、图表轴标题)会保留真实的轴对齐包围盒,并报告 rotation 角度,而不是把它折叠成零宽字符。
- 默认轻量:Rust 与浏览器构建默认是纯提取,不加载任何 OCR 运行时;原生 Python / Node 包虽然集成了 OCR,但 PDFium、ONNX Runtime 与模型文件保持外置,仅在使用 OCR 时才加载。

二、主要功能特点与应用场景
PDF Inspector 的能力可以归纳为「分类 + 提取 + 转换 + 表格 + OCR 路由」五个层次,全部围绕「本地、快速、可路由」展开。
- 智能分类 Smart classification:如前所述,秒级判断 PDF 类型并给出逐页 OCR 路由建议。
- 文本提取 Text extraction:带字体、坐标的位置感知提取,自动处理多列阅读顺序,旋转文本保留真实包围盒。
- Markdown 转换:标题(H1–H4,依据字号比例识别)、项目符号/编号/字母列表、代码块(等宽字体检测)、表格、粗体/斜体、URL 链接与分页符都能还原。
- 表格检测 Table detection:双模式——基于 PDF 绘图操作的矩形检测,以及基于文本对齐的启发式检测,可处理跨页金融表格、脚注等复杂情形。
- CID 字体支持:为 Type0/Identity-H 字体提供 ToUnicode CMap 解码,支持 UTF-16BE、UTF-8 与 Latin-1 编码。
- 多列与 RTL:自动检测报刊式多列与顺序阅读顺序,并支持从右到左(RTL)文本。
- 编码问题检测:自动标记损坏的字体编码,便于调用方回退到 OCR。
- 选择性 OCR Selective OCR:Rust / CLI / Python / Node 可仅对需要 OCR 的页面做本地渲染,运行 PP-OCRv6 Small,保留逐页来源与回退建议。
- 单次文档加载:文档只解析一次,在检测阶段与提取阶段共享,避免冗余 I/O。
- 浏览器 WebAssembly:在浏览器与 Web Worker 中运行同一套 Rust 解析器,内嵌 CMap,无服务器往返。
典型应用场景包括:报告、研究论文、财务文档、发票与法律 PDF 的本地清洗与转换;大规模 PDF 处理管道中在发送 OCR 前先做智能路由;以及任何需要在浏览器端离线解析 PDF 的 Web 应用。
三、如何安装与使用
PDF Inspector 提供 Rust、Python、Node.js / Bun、浏览器 WASM 与 CLI 五种使用形态,下面是各形态的最小可运行示例。
Python(基于 PyO3 绑定):
pip install pdf-inspector
import pdf_inspector
result = pdf_inspector.process_pdf("document.pdf")
print(result.pdf_type) # "text_based", "scanned", "image_based", "mixed"
print(result.markdown)
Node.js(基于 napi-rs 绑定):
import { readFileSync } from 'fs';
import { processPdf } from '@firecrawl/pdf-inspector';
const pdf = readFileSync('document.pdf');
const result = processPdf(pdf);
浏览器 WebAssembly(基于 wasm-bindgen 编译):
import init, { processPdf } from '@firecrawl/pdf-inspector-wasm';
await init();
const result = processPdf(pdfBytes);
Rust,在 Cargo.toml 中声明依赖:
[dependencies]
pdf-inspector = "1"
use pdf_inspector::process_pdf;
let result = process_pdf("document.pdf")?;
CLI 工具,安装后即可把 PDF 转 Markdown 或仅做类型检测:
cargo install pdf-inspector
pdf2md document.pdf # 转 Markdown
pdf2md document.pdf --json # JSON 输出
detect-pdf document.pdf # 仅检测类型
需要 OCR 时,安装带 ocr 特性的 CLI 即可对扫描页做选择性渲染:
cargo install pdf-inspector --features ocr --bin pdf2md
四、官方地址与获取方式
- GitHub 仓库:https://github.com/firecrawl/pdf-inspector
- PyPI:pip install pdf-inspector
- npm:@firecrawl/pdf-inspector 与 @firecrawl/pdf-inspector-wasm
- crates.io:pdf-inspector(Rust 依赖)
- 协议:MIT,允许商用与二次分发
五、与同类方案对比
PDF Inspector 的差异点不在于「能不能抽文本」,而在于「是否先分类再做路由」。下面把它与全量 OCR 流水线、以及通用抽取库做一个横向比较。
| 对比维度 | PDF Inspector | 全量 OCR 流水线 | 通用抽取库(如 pdfplumber) |
|---|---|---|---|
| 运行环境 | 本地 / 浏览器 WASM | 依赖 OCR 服务 | 本地为主 |
| 是否需 OCR | 否(文本型直接提取) | 是 | 否 |
| 类型路由 | 内置 TextBased / Scanned / Mixed 分类 | 无 | 无 |
| 选择性 OCR | 支持,仅渲染必要页 | 全量 | 不支持 |
| 多语言绑定 | Rust / Python / Node / WASM | 视实现而定 | Python 为主 |
| 默认体积 | 轻量,OCR 运行时外置 | 较重 | 轻量 |
| License | MIT | 各异 | 各异 |
简而言之,通用抽取库能解决「文本型 PDF 怎么抽」,但无法判断「这份 PDF 到底需不需要 OCR」;全量 OCR 能解决「扫描件怎么读」,但把 54% 本不需要 OCR 的文档也一刀切地送进昂贵服务。PDF Inspector 正好补齐了中间的「分类与路由」这一环。
六、核心机制深度解析
PDF Inspector 的整体数据流是一条「先分类、后提取」的单向管道。文档只加载一次,检测结果与提取过程共享同一份解析结果。
在 extractor 内部,fonts 负责字体宽度与编码,content_stream 遍历 PDF 操作符产出文本项与矩形,xobjects 处理 Form XObject 中的文本与图像占位,links 抽取超链接与 AcroForm 字段,layout 完成列检测、行分组与阅读顺序。最后由表格模块与 Markdown 模块分别产出结构化结果。
关键设计是「单次文档加载」:通过 load_document_from_path 或 load_document_from_mem 只解析一次文档,在检测与提取阶段之间共享,避免重复 I/O。这也是它能在 200ms 内完成文本型 PDF 处理的重要原因之一。
七、实用技巧
- 先做分类再路由:在批量管道里先用 detect-pdf 判断类型,只对 Scanned / Mixed 的页面走 OCR,文本型直接提取,能省下大量算力。
- 选择性 OCR 省资源:OCR 特性只在真正需要时渲染对应页面并运行 PP-OCRv6 Small,逐页保留来源与回退建议,避免整本文档全量识别。
- 浏览器端零往返:WASM 构建内嵌 CMap,可直接在 Web Worker 中解析 PDF,无需把文件传到服务器,适合隐私敏感场景。
- 编码异常即回退:当检测到损坏字体编码时,利用返回的标记把该页回退到 OCR,而不是硬抽一堆乱码。
- CLI 接管道:pdf2md document.pdf –json 输出结构化 JSON,方便在 shell 或服务端流水线里做二次处理。
八、最新更新动态
仓库一直保持活跃维护,最近一次提交时间为 2026-09-18。从 README 与提交记录可以看到,项目近期的演进重点集中在几个方向:补齐 MIT LICENSE 文件与协议徽章,完善 Rust / Python / Node / WASM 多语言绑定,引入浏览器 WebAssembly 形态让同一套解析器能跑在客户端,以及加入基于 PP-OCRv6 Small 的选择性 OCR 与逐页路由建议。
此外,CID 字体解码、表格双模式检测、多列与 RTL 阅读顺序、编码问题自动标记等能力,也都是围绕「更鲁棒地处理真实世界复杂 PDF」这一目标逐步加入的。对于关注长期稳定性的团队,可以持续跟踪其 crates.io 与 npm 包的版本发布。
九、常见问题 FAQ
Q1:PDF Inspector 需要联网吗?
不需要。纯 Rust 提取完全在本地完成;浏览器 WASM 形态也在客户端本地运行,内嵌 CMap,没有服务器往返。只有当你主动启用 OCR 时,才需要在本地准备好相应运行时。
Q2:一定要安装 OCR 依赖吗?
默认不需要。OCR 运行时(PDFium、ONNX Runtime、PP-OCRv6 模型文件)保持外置,仅在使用选择性 OCR 时才加载。若只处理文本型 PDF,完全可以零额外依赖运行。
Q3:扫描件能提取吗?
可以。扫描件会被分类为 Scanned 或 ImageBased,并给出 OCR 路由建议;配合选择性 OCR,可对需要识别的页面做本地渲染。它不会假装把图片里的字「抽」出来,而是诚实地告诉你该走 OCR。
Q4:支持哪些语言调用?
四种:Rust(核心库)、Python(PyO3)、Node.js / Bun(napi-rs),以及浏览器 WebAssembly(wasm-bindgen)。同一套解析逻辑在这些形态间共享。
Q5:中文或复杂编码的 PDF 怎么办?
支持 CID / Type0 / Identity-H 字体的 ToUnicode CMap 解码,覆盖 UTF-16BE、UTF-8 与 Latin-1;遇到损坏编码时还会主动标记,便于调用方回退到 OCR,而不是输出乱码。
Q6:可以商用吗?
可以。项目采用 MIT 协议,允许商用与二次分发,只需在分发时保留版权与许可声明即可。
十、总结
PDF Inspector 的价值不在于「又一个 PDF 文本抽取库」,而在于把「先判断类型、再决定是否调用 OCR」的路由逻辑做成了一个高速、本地、可嵌入的 Rust 库。它用约 200ms 的本地提取覆盖掉约 54% 不需要 OCR 的 PDF,并把扫描件智能导向 OCR,在延迟与成本上显著优于全量 OCR 方案。配合多语言绑定与浏览器 WASM,它既能嵌入服务端的大规模处理管道,也能直接在 Web 端离线运行。对于经常和大量 PDF 打交道的开发者与数据团队,这是一个值得加入工具箱的轻量组件。
默认安装仅包含纯提取能力;若需处理扫描件 / 图像型 PDF,请单独安装 OCR 运行时(PDFium、ONNX Runtime 与 PP-OCRv6 模型文件),并通过带 ocr 特性的构建启用选择性 OCR。
在撰写本文的过程中,我主要参考了 PDF Inspector 的 GitHub 仓库(firecrawl/pdf-inspector)README.md 与公开 API 信息,仓库地址为 https://github.com/firecrawl/pdf-inspector。文中数据以官方公开信息为准,可能随版本更新而变化。
本文由 AI 辅助整理,基于 PDF Inspector(firecrawl/pdf-inspector)的公开文档撰写;配图由 小黑 IP 生成。内容仅用于技术介绍,不构成商业使用授权建议。

AI智汇具 - AI工具推荐与技能教程_好用的AI工具大全






