ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

pdf-inspector:快速处理PDF,节省成本与延迟,本地生成结构化Markdown!

pdf-inspector:快速处理PDF,节省成本与延迟,本地生成结构化Markdown! pdf-inspector用于PDF分类和文本提取的快速Rust库pdf-inspector是一个快速的Rust库可用于PDF分类和文本提取。它能检测PDF是基于文本的、扫描版的还能在感知位置的情况下提取文本并将其转换为简洁的Markdown格式且整个过程无需OCR。该库提供了Python、Node.js和浏览器WebAssembly的绑定。它由Firecrawl开发旨在本地处理基于文本的PDF处理时间不到200毫秒对于约54%无需OCR服务的PDF可跳过昂贵的OCR流程。主要特性智能分类通过对内容流进行采样在约10 - 50毫秒内检测出基于文本、扫描版、基于图像或混合类型的PDF。同时返回一个置信度得分0.0 - 1.0和每页的OCR路由信息。文本提取支持位置感知的文本提取可获取字体信息、X/Y坐标并自动处理多列阅读顺序。Markdown转换能识别标题通过字体大小比例确定H1 - H4、项目符号/编号/字母列表、代码块通过等宽字体检测、表格基于矩形和启发式方法、粗体/斜体格式、URL链接和分页符。表格检测采用双模式检测既基于PDF绘图操作进行矩形检测也通过文本对齐进行启发式检测。可处理财务表格、脚注和跨页的连续表格。CID字体支持支持对Type0/Identity - H字体进行ToUnicode CMap解码支持UTF - 16BE、UTF - 8和Latin - 1编码。多列布局可自动检测报纸风格的列布局支持顺序阅读顺序和从右到左RTL文本。编码问题检测自动标记损坏的字体编码以便调用者可以回退到OCR。单文档加载文档只需解析一次检测和提取过程共享该解析结果避免了冗余的I/O操作。浏览器WebAssembly可在浏览器和Web Workers中本地运行相同的Rust解析器嵌入了CMaps无需服务器往返。轻量级纯Rust实现无机器学习模型无需外部服务。仅依赖lopdf进行PDF解析。基准测试在opendataloader - bench语料库200个PDF上进行评估仅展示无基于模型的PDF解析的本地引擎且禁用了OCR。得分范围为0 - 1分数越高越好。引擎总体得分阅读顺序NID表格TEDS标题MHS速度200个文档pdf - inspector0.8750.9150.8140.7880.470sliteparse0.8730.9130.6930.8110.750sopendataloader0.8310.9020.4890.7392.569spymupdf4llm0.7350.8860.4010.42417.117smarkitdown0.5890.8440.2730.00016.165s结果于2026年7月31日在Apple M4 Pro上刷新。各引擎版本分别为pdf - inspector 0.2.6、LiteParse 2.10.1、OpenDataLoader 2.2.1、PyMuPDF4LLM 0.2.0和MarkItDown 0.1.5。速度是在排除一次预热运行后五次交替或循环完整语料库运行的中位数每个解析器在单个进程中按顺序处理文档。完整的解析器配置、每个文档的预测结果、评估器输出和生成的图表可在可复现结果分支中找到。适用场景pdf - inspector最适合处理对速度、阅读顺序和表格结构有要求的原生文本PDF。在此次比较中pdf - inspector在总体得分、阅读顺序和表格得分方面表现出色且完成运行速度最快。这使其成为报告、研究论文、财务文件、发票和法律PDF的强大本地默认选择可在不增加OCR延迟或基础设施的情况下生成干净、结构化的Markdown。可使用配对基准测试工具针对相同的语料库和评估器版本比较两个本地构建版本。快速开始Pythonpip install maturinmaturin develop --releaseimport pdf_inspectorresult pdf_inspector.process_pdf(document.pdf)print(result.pdf_type) # text_based, scanned, image_based, mixedprint(result.markdown) # Markdown字符串或None完整API参考docs/python.mdNode.jsnpm install firecrawl/pdf - inspectorimport { readFileSync } from fs;import { processPdf, classifyPdf } from firecrawl/pdf - inspector;const result processPdf(readFileSync(document.pdf));console.log(result.pdfType); # TextBased, Scanned, ImageBased, Mixedconsole.log(result.markdown); # Markdown字符串或null完整API参考napi/README.md浏览器WebAssemblynpm install firecrawl/pdf - inspector - wasmimport init, { processPdf } from firecrawl/pdf - inspector - wasm;await init();const response await fetch(/document.pdf);const pdf new Uint8Array(await response.arrayBuffer());const result processPdf(pdf);console.log(result.pdfType);console.log(result.markdown);完整API参考wasm/README.mdRust// 从crates.io安装cargo add pdf - inspector// 或手动添加[dependencies]pdf - inspector 0.1use pdf_inspector::process_pdf;let result process_pdf(document.pdf)?;println!(Type: {:?}, result.pdf_type);if let Some(markdown) result.markdown {println!({}, markdown);}完整API参考docs/rust - api.mdCLI# 安装CLI工具cargo install pdf - inspector# 将PDF转换为Markdownpdf2md document.pdf# JSON输出用于管道传输pdf2md document.pdf --json# 定位文本项JSON包含是否下划线元数据pdf2md document.pdf --items - json# 仅输出原始Markdown无标题pdf2md document.pdf --raw# 高效令牌输出合并长点线和类似的源填充pdf2md document.pdf --compact# 插入分页符标记pdf2md document.pdf --pages# 仅处理特定页面pdf2md document.pdf --select - pages 1,3,5 - 10# 仅进行检测不提取detect - pdf document.pdfdetect - pdf document.pdf --json# 检测 布局分析表格、列detect - pdf document.pdf --analyze --json从源代码检出时可使用 cargo run --bin pdf2md -- document.pdf 或 cargo run --bin detect - pdf -- document.pdf。架构PDF字节流输入后会分别流向检测器和提取器。检测器可判断PDF类型基于文本、扫描版、基于图像或混合类型提取器则负责解析字体、内容流、XObject、链接和布局等信息进而进行表格检测和Markdown转换。文档通过 load_document_from_path 或 load_document_from_mem 加载一次并在检测和提取阶段共享避免了冗余解析。项目结构src/lib.rs公共API、PdfOptions 构建器和便利函数python.rsPyO3 Python绑定types.rs共享类型如 TextItem、TextLine、PdfRect、ItemTypetext_utils.rs字符/文本辅助函数处理CJK、RTL、连字、粗体/斜体process_mode.rsProcessMode 枚举仅检测、分析、完整处理detector.rs快速PDF类型检测无需加载完整文档glyph_names.rsAdobe字形列表到Unicode的映射tounicode.rs用于CID编码文本的ToUnicode CMap解析extractor/文本提取管道tables/表格检测和格式化markdown/Markdown转换和结构检测bin/CLI工具pdf2md、detect_pdfnapi/Node.js/Bun绑定napi - rswasm/浏览器绑定wasm - bindgen分类原理解析交叉引用表和页面树无需加载完整对象根据扫描策略默认扫描所有页面并提前退出选择页面在内容流中查找文本操作符 Tj/TJ 和图像操作符 Do根据采样页面中文本操作符的存在情况进行分类。该方法可在毫秒内检测300多页的PDF。结果包含 pages_needing_ocr即缺少文本的特定页面编号列表支持按页进行OCR路由而非全有或全无的处理方式。扫描策略策略行为适用场景EarlyExit默认扫描所有页面遇到第一个非文本页面时停止将基于文本的PDF路由到快速提取的管道Full扫描所有页面不提前退出准确区分混合类型和扫描版PDFSample(n)均匀采样n个页面第一页、最后一页、中间页对速度要求高于精度的超大PDFPages(vec)仅扫描指定的以1为索引的页面编号调用者已知需要检查的页面时Markdown输出转换规则标题H1 - H4根据相对于正文文本的字体大小层级检测允许0.5pt的聚类范围。粗体/斜体通过字体名称模式Bold、Italic、Oblique检测。项目符号列表通过 *、-、*、○、●、◦ 等前缀检测。编号列表通过 1.、1)、(1) 等模式检测。字母列表通过 a.、a)、(a) 等模式检测。代码块通过等宽字体Courier、Consolas、Monaco、Menlo、Fira Code、JetBrains Mono和关键字检测。表格结合基于PDF绘图操作的矩形检测和基于文本对齐的启发式检测。财务表格对合并的数值进行令牌拆分。标题说明通过 “Figure”、“Table”、“Source:” 等前缀检测。上标/下标根据相对于基线的字体大小和Y偏移检测。URL转换为Markdown链接。连字符重新连接跨线断开的单词。页码从输出中过滤掉。大写首字母将大的首字母与后续文本合并。点线将目录样式的点线合并为 “ ... ”。用例智能PDF路由pdf - inspector专为大规模处理PDF的管道而设计。在处理PDF时无需对每个PDF都进行OCR而是先由pdf - inspector对其进行分类约20毫秒若为基于文本且置信度高则在本地进行提取约150毫秒否则将其发送到OCR服务2 - 10秒。这种方式为大多数基于文本的PDF如报告、论文、发票、法律文件节省了成本和延迟。调试有关 RUST_LOG 环境变量的使用请参阅docs/debugging.md。许可证本项目采用MIT许可证。那么在实际应用中pdf - inspector还会有怎样的表现呢
返回列表