乐于分享
好东西不私藏

PDF一键变Markdown

PDF一键变Markdown

平时做 AI 知识库、RAG、文档解析,PDF 一直是个比较麻烦的格式。

尤其是论文、财报、合同这类文档,真正难的并不是“把文字提取出来”,而是要判断它到底是不是扫描件、正确识别多栏排版、还原表格和标题结构,最后再转换成适合 AI 使用的 Markdown。

最近看到 Firecrawl 开源的 pdf-inspector,它专门解决的就是这类问题。


它到底能做什么?

pdf-inspector 是一个基于 Rust 开发的 PDF 分类与文本提取库。

它首先会判断 PDF 属于 TextBased、Scanned、ImageBased 还是 Mixed,然后根据结果决定后续应该怎么处理。

也就是说,它不会看到 PDF 就直接扔给 OCR。

对于本身就带有文本内容的 PDF,可以直接进行本地解析;只有真正需要 OCR 的页面,才进一步进入 OCR 流程。

官方数据显示,PDF 类型检测大约只需要 10~50ms,文本型 PDF 的处理目标则可以控制在很低的延迟范围内。

这对于需要批量处理 PDF 的 AI 应用来说,非常重要。


最值得关注的是:PDF转Markdown

很多 PDF 工具只能做到“提取文字”。

但对于现在的 AI 应用来说,仅仅拿到文字远远不够。

pdf-inspector 会尝试理解 PDF 的结构,把标题、正文、列表、代码、表格、链接等内容转换成更加干净的 Markdown。

比如:

一级到四级标题

它会根据字体大小和正文之间的比例判断标题层级。

列表

可以识别项目符号、有序列表以及字母列表。

代码

对于 Courier、Consolas、Monaco、Menlo、Fira Code 等等宽字体,会尝试识别为代码块。

表格

则同时采用 PDF 绘图矩形和文字对齐两种方式进行检测。

它不是简单地按照 PDF 中文字出现的顺序拼接,而是尝试理解原始文档的版式。


多栏PDF也能处理

论文和新闻类 PDF 经常采用双栏甚至多栏排版。

如果只是按照 PDF 内部文字对象的顺序读取,很容易出现:

左栏第一段 → 右栏第一段 → 左栏第二段 → 右栏第二段

最终生成的文本完全无法阅读。

pdf-inspector 在提取过程中加入了布局分析,会尝试识别多栏结构,再重新组织阅读顺序。

同时还支持 RTL 文本以及字体编码处理。

对于论文、研究报告、杂志、法律文件等复杂 PDF,这个能力比单纯的文本提取更加实用。


表格是另一个重点

PDF 表格一直是文档解析中的难点。

一个看起来很简单的表格,在 PDF 内部可能只是大量文字和矩形绘图指令,并不存在真正意义上的“单元格”。

pdf-inspector 为此设计了两套检测方式。

一种是根据 PDF 中的矩形绘制操作识别表格,另一种则通过文字的位置和对齐关系进行启发式判断。

识别之后,再进行行列划分,最终输出 Markdown 表格。

对于财报、发票、数据报告等场景,这个能力尤其有价值。


OCR不是默认开启,而是按需使用

这也是这个项目比较有意思的设计。

很多 PDF 解析方案会直接把整个 PDF 交给 OCR。

问题是 OCR 不仅慢,而且需要额外的模型和计算资源。

pdf-inspector 的思路是:

先判断 → 再提取 → 只有必要页面才 OCR。

例如一个 100 页 PDF,其中 95 页都是正常文本,只有 5 页是扫描图片,那么没有必要把 100 页全部进行 OCR。

它可以返回具体的 pages_needing_ocr,让上层应用只把需要 OCR 的页面交给后续流程。

官方提供的 OCR 流程还支持本地 PP-OCRv6 Small。

这实际上非常适合 AI 文档处理流水线。


跑分也很有意思

官方使用 200 份 PDF 进行测试,在关闭 OCR 的情况下,对比了多个本地 PDF 解析引擎。

pdf-inspector 的综合得分为 0.875,阅读顺序得分 0.915,表格得分 0.814,200 份文档完整处理速度为 0.470 秒

在这组测试中,它的综合、阅读顺序和表格指标都比较突出,同时完成整个测试集的速度也是最快的。

当然,这属于项目方公布的特定测试结果,不代表所有 PDF 场景都一定如此,但至少说明它的目标并不是做一个简单的 PDF 文本提取器,而是希望成为 AI 文档处理基础设施。


Python、Node、Rust都能用

对于开发者来说,pdf-inspector 的使用门槛并不高。

Python 可以直接安装:

pip install pdf-inspector
然后:
import pdf_inspectorresult = pdf_inspector.process_pdf("document.pdf")print(result.pdf_type)print(result.markdown)
Node.js 也可以直接使用:
npm install @firecrawl/pdf-inspector
如果你的项目本身就是 Rust,还可以:
cargo add pdf-inspector
除此之外,项目还提供了浏览器 WebAssembly 版本,可以直接在浏览器和 Web Worker 中运行。

甚至可以直接当命令行工具

如果只是偶尔处理 PDF,甚至不需要写代码。

cargo install pdf-inspector
然后直接:
pdf2md document.pdf
PDF 就可以转换成 Markdown。

如果需要 JSON:

pdf2md document.pdf --json

只想处理部分页面:

pdf2md document.pdf --select-pages 1,3,5-10

甚至可以先只做 PDF 类型检测:

detect-pdf document.pdf

对于程序员来说,这种 CLI 设计非常方便,可以直接塞进自己的自动化脚本或者文档处理流水线。

先判断,再解析;能本地解决,就不要上 OCR。

对于正在做 AI 文档、RAG、知识库或者 PDF 自动化处理的开发者来说,这个开源项目值得收藏。

项目采用 MIT License 开源,目前 GitHub 已获得较高关注度。

项目地址:

https://github.com/firecrawl/pdf-inspector