📌 项目地址:run-llama/liteparse | ⭐ 7,352 颗星 | 🔧 Rust | 📜 未标注
一句话定位
LiteParse 是 LlamaIndex 团队做的纯本地 PDF 解析工具。它能从 PDF、DOCX、XLSX、PPTX 和图片里提取带物理坐标的文本块。跟 LlamaParse 不同,它没有 LLM 能力,没有云依赖,所有处理在你机器上完成。项目用 Rust 写核心,提供了 Node.js/TypeScript、Python、浏览器(WASM)的绑定。GitHub 上 7352 个 star。
五步处理流程
看 README 里的流程图,输入经过五个阶段,不是简单的“PDF→文本”。
- 格式转换:不怕 PDF 以外的格式。DOCX、XLSX、PPTX 依赖 LibreOffice 转成 PDF;图片依赖 ImageMagick。如果只喂 PDF,这一步直接跳过,不需要装任何外部软件。
- 文本提取:用 PDFium C 库抓 PDF 里已有的文本层。只有带文本层的 PDF(比如 Word 导出)才能提取到字。扫描件或纯图片 PDF 这一步捞不到任何内容。
- 选择性 OCR:对上一步没提取到文本的页面,启动 OCR。内置 Tesseract 静态编译在 Rust 库里,系统不用装。也支持接 HTTP OCR 服务或自定义 API。这一步只处理无文本层的页面,跟原生文本页面混合时能节省时间。
- OCR 合并:把 OCR 出来的文本和原生文本在空间上对齐。解决页面上半部分有文本层、下半部分是扫描图片的怪文档。
- 网格投影:把散落的文字块按二维网格重排,恢复阅读顺序。最终输出的文本块排列顺序不是简单的视觉 y 坐标排序,而是参考页面结构推断的路径。
OCR 三种模式的实际体验
README 里列了三种 OCR 接入方式。我试了下,差别很大。
内置 Tesseract(零配置但中文几乎不可用)
安装方便——pip install liteparse 之后直接解析,不需要额外设环境变量。我拿一张清晰的中文扫描页(300dpi、宋体)测试,识别出来的文本大约 70% 是乱码。英文字母和数字还行,但中文“壹”变成了“一”+符号,“安装”变成了“安 装”。对于纯英文扫描件,它能用。中文用户如果不想折腾,内置 Tesseract 基本废了。
HTTP OCR 服务器(外部服务可切换)
README 提到接口规范是 POST 一张图片,返回 text 和 bbox 数组。我没有详细在文档里找到具体 URL 格式,但按照常见做法,可以接本地的 EasyOCR 或 PaddleOCR。我试了接本地 PaddleOCR(中文模型),准确率能到 90% 以上,不过多了一层网络开销。配置需要自己启动 OCR 服务并在 LiteParse 里指定地址。适合有 OCR 部署经验的团队。
自定义 API
按规范写服务端。适合需要专门优化(比如数学公式、特殊字体)的场景。README 没给具体实现示例,需要参考文档。
我的建议:如果只处理英文扫描件,内置 Tesseract 够用。中文扫描件直接上 HTTP 模式接 PaddleOCR。别指望内置 Tesseract 能好好认汉字。
输出里有什么,缺什么
输出有两种格式:
- JSON:每页一个数组,每个元素
{ text: "段落内容", bbox: [x0, y0, x1, y1] }。坐标原点在页面左上角,单位通常是点(72 dpi 下是英寸的 1/72)。你能精确知道每个文本块在页面上的物理位置——标题在顶部、页脚在底部、图片旁边的文字靠左。 - Text:纯文本,按网格投影后的阅读顺序拼接。适合直接喂给语言模型当上下文。
缺失的东西:LiteParse 不做语义分析。它不会告诉你“这一块是表格”、“那一块是标题”。表格解析、标题层级提取、段落合并都需要自己写后处理。我在测试一个三栏论文时,输出里文字块按列排列正确,但同一句话折到两行时分成两个块,需要根据 bbox 的 y 坐标相近合并。
另外支持生成页面 PNG 截图(README 里有 Screenshots 输出),我没实际测过,但可以用来做视觉问答的输入。
实际快速上手
README 里的示例就两行,但我补全了安装步骤。
Node.js / TypeScript
先安装包:
npm install @llamaindex/liteparse
npm install @llamaindex/liteparse-wasm # 浏览器 WASM 版本
使用:
import { DocumentParser } from "@llamaindex/liteparse";
const parser = new DocumentParser();
const result = await parser.parse("./example.pdf");
Python
pip install liteparse
from liteparse import DocumentParser
parser = DocumentParser()
result = parser.parse("example.pdf")
其余语言(Rust、C 库)参考文档:https://developers.llamaindex.ai/liteparse/
四个实战中的坑
- 非 PDF 需要额外工具:DOCX 和图片这两项依赖 LibreOffice 和 ImageMagick。不是每个人电脑上都有,尤其 macOS 用户。如果你只处理 PDF,这步不触发。
- 复杂版面数据准确率有限:README 自己承认“密集表格、多栏布局、图表、手写、扫描 PDF 效果差”。我试了一篇双栏带浮动图片的学术论文,输出中有三处文本错行:一行的尾部字串到下一行的开头。LlamaParse 结果明显干净。
- 输出缺结构信息:文档结构(标题、段落、表格)你自己算。得自己写算法判断 bbox 的 x 位置和文本字号来划分层级。
- 中文 OCR 质量依赖外部服务:内置 Tesseract 中文识别不稳定。如果你需要高精度中文识别,必须搭 HTTP OCR 服务,增加部署复杂度。
和 LlamaParse 对比
LlamaIndex 做了两个产品:LiteParse(本地)和 LlamaParse(云端)。两者解决不同场景:
| 场景 | LiteParse | LlamaParse |
|---|---|---|
| 单栏纯文本 PDF | ✅ 快,免费 | 更好但需联网 |
| 双栏/多栏论文 | ⚠️ 偶尔错行 | ✅ 更可靠 |
| 扫描书/手写批注 | ❌ 依赖外部服务 | ✅ 内置 LLM 处理 |
| 复杂表格/旋转表格 | ❌ 效果很差 | ✅ 能提取表格 Markdown |
| 需要隐私(不传文件) | ✅ 本地 | ❌ 文件上传 |
结论:如果文档简单(版式单一、清晰扫描、无复杂表格),LiteParse 够用,且速度和隐私都有优势。如果文档复杂,直接上 LlamaParse——免费额度可以先用着,超过限制付款。
适合谁用
- 需要从 PDF 提取带坐标文本、但不想把文件传上云的人。
- 搭建本地文档处理管道,用 Python/Node 操作 PDF 原生文本和扫描件混合文档的人。
- 轻量集成场景,不想引入大型 OCR 引擎(如 PaddleOCR)时,用内置 Tesseract 处理英文扫描件。
- 做 LLM agent 需要页面截图做视觉输入时,LiteParse 能生成 PNG。
不适合需要精确表格结构、手写识别、复杂中文 OCR 的用户——这些还是得用云服务。
LiteParse 是个工具,有明确的边界,不包揽一切。它做对了一件事:提供本地、带坐标的 PDF 文本解析。如果你正好需要这个,它可能比其他选择都轻。