200ms识别PDF类型并提取文本的入门指南
【免费下载链接】pdf-inspectorFast Rust library for PDF inspection, classification, and text extraction. Intelligently detects scanned vs text-based PDFs to enable smart routing decisions.项目地址: https://gitcode.com/GitHub_Trending/pdf/pdf-inspector
把一份 PDF 交给下游前,最怕的不是慢,而是分不清哪几页能直接抽文本、哪几页必须走 OCR。pdf-inspector 做的就是这一步:先判断 PDF 是文本型还是扫描型,再决定本地抽取还是转交 OCR,省掉一批没必要的识别开销。
🚀 三分钟跑通:装完就能抽文本
Python 一条命令装好,装完直接抽文本。
pip install pdf-inspector第一次运行,一个函数同时给类型和 Markdown,返回里还带页数和置信度。
import pdf_inspector r = pdf_inspector.process_pdf("document.pdf") # 检测+抽取+转Markdown print(r.pdf_type, r.page_count, r.confidence) print(r.markdown is not None) # 是否抽到了文本pdf-inspector 在四端给同套接口:Node 装npm install @firecrawl/pdf-inspector(函数叫processPdf/classifyPdf),Rust 用cargo add pdf-inspector,浏览器有 WASM 包,PDF 字节全程不出浏览器。
📋 能力总览:每项都标了可核对的数字
- 分类检测:约 10-50ms 判定 text_based / scanned / image_based / mixed,返回 0-1 置信度与逐页 OCR 路由。
- 本地抽取:文本型 PDF 全程 <200ms 出 Markdown,纯 Rust、无 ML 模型、无外部服务,转换逻辑见 src/markdown/。
- 表格识别:矩形 + 文本对齐双模式,覆盖财务报表、脚注、跨页续表,实现在 src/tables/。
- 多列与 RTL:自动识别报纸式多列并给出正确阅读顺序,支持 RTL 文本。
- 编码解码:ToUnicode CMap 处理 CJK / CID 字体,坏编码自动标记、提示回退 OCR。
- 选择性 OCR:只对被拒页面跑 PP-OCRv6 Small,纯文本 PDF 不加载 OCR 运行时。
- 多语言绑定:Python / Node.js / 浏览器 WASM / Rust 四端同接口,MIT 协议。
🛠️ 实战演练:按场景挑接口,不纠结语言
只判类型、不抽内容。管线里先做分流,classify_pdf最轻。
d = pdf_inspector.classify_pdf("doc.pdf") # 仅分类,跳过抽取 print(d.pdf_type, d.confidence) # 类型 + 置信度 print(d.pages_needing_ocr) # 需要OCR的页(0索引)要坐标和字体信息。排版、高亮、重建版面时用带位置的文本块。
items = pdf_inspector.extract_text_with_positions("doc.pdf", pages=[1]) for it in items[:5]: # 打印前5块 print(f"p{it.page} ({it.x:.0f},{it.y:.0f}) {it.font_size:.1f} {it.text!r}")扫描页混合文档。让库自己决定哪几页 OCR,不用你手写规则。
ocr = pdf_inspector.process_pdf_with_ocr("scan.pdf") # 自动只OCR需要的页 print(ocr.pages_routed_to_ocr) # 被路由到OCR的页 print(ocr.markdown) # 融合后的Markdown📊 数据表现:200份PDF基准
数字取自 opendataloader-bench 语料:200 份 PDF、OCR 关闭、只比本地引擎;硬件 Apple M4 Pro,2026-07-31 刷新,耗时为剔除预热后五次完整跑的中位数。综合 / 阅读顺序 / 表格 / 标题均为 0-1 质量分,越高越好。
| 引擎 | 综合 | 阅读顺序 | 表格 | 标题 | 全语料耗时 |
|---|---|---|---|---|---|
| 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 |
按 README 口径,约 54% 的常见 PDF 无需 OCR,正是本地抽取能直接吃下的部分。
🧭 进阶与扩展:两个常用高级点
区域抽取接版面模型。extract_text_in_regions按[x1,y1,x2,y2]从指定页取文本,每块带回needs_ocr标记,适合“布局模型圈区域 + 本地抽文本”的混合管线,抽取入口在 src/extractor/。
离线选择性 OCR。pdf-inspector 的process_pdf_with_ocr支持page_numbers(1索引)、model_directory和offline=True,可指向本地 PP-OCRv6 模型、禁止联网;纯文本文档不会触发下载。
延伸阅读
- Python API 参考
- Node.js 绑定说明
- 浏览器 WASM 使用
- 分类检测实现
下一步,拿你自己的文档接classify_pdf进管线,用pages_needing_ocr数一下能省掉多少 OCR 调用。
【免费下载链接】pdf-inspectorFast Rust library for PDF inspection, classification, and text extraction. Intelligently detects scanned vs text-based PDFs to enable smart routing decisions.项目地址: https://gitcode.com/GitHub_Trending/pdf/pdf-inspector
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考