run-llama/liteparse

GitHub: run-llama/liteparse

LiteParse 是一款快速、轻量的本地开源文档解析工具,提供带边界框的高质量空间文本解析和灵活的 OCR 能力,适用于 RAG 和 LLM 数据预处理。

Stars: 11727 | Forks: 792

# LiteParse [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/39/39faa54be350a1dab8afd3b2fb8c1c83e4d9cff84abfef2374d19a18053687c4.svg)](https://github.com/run-llama/liteparse/actions/workflows/ci.yml) | [![Crates.io version](https://img.shields.io/crates/v/liteparse.svg)](https://crates.io/crates/liteparse) | [![npm version](https://img.shields.io/npm/v/@llamaindex/liteparse.svg)](https://www.npmjs.com/package/@llamaindex/liteparse) | [![wasm version](https://img.shields.io/npm/v/@llamaindex/liteparse-wasm.svg)](https://www.npmjs.com/package/@llamaindex/liteparse-wasm) | [![PyPI version](https://img.shields.io/pypi/v/liteparse.svg)](https://pypi.org/project/liteparse/) | [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) | [文档](https://developers.llamaindex.ai/liteparse/) English | [简体中文](README.zh-CN.md) out LiteParse 是一款独立的开源 PDF 解析工具,专注于**快速且轻量**的解析。它提供带有边界框的高质量空间文本解析,无需专有的 LLM 功能或云依赖。所有操作均在您的本地机器上运行。 **遇到了本地解析的瓶颈?** 对于复杂的文档(密集的表格、多列布局、图表、手写文本或扫描版 PDF),使用 [LlamaParse](https://developers.llamaindex.ai/python/cloud/llamaparse/?utm_source=github&utm_medium=liteparse) 将获得显著更好的效果。这是我们专为生产环境文档流水线构建的云端文档解析器。LlamaParse 负责处理棘手的部分,让您的模型能看到干净、结构化的数据和 markdown。 ## 概述 - **快速文本解析**:使用 PDFium 进行空间文本解析 - **灵活的 OCR 系统**: - **内置**:Tesseract(零配置,随库一起打包) - **HTTP 服务器**:插入任何 OCR 服务器(EasyOCR、PaddleOCR 或自定义服务器) - **标准 API**:简单、定义明确的 OCR API 规范 - **复杂度检测**:以极低成本检查文档是否需要 OCR 或更深度的解析——在进行完整解析之前进行路由、拒绝或估算成本 - **截图生成**:为 LLM 代理生成高质量页面截图 - **多种输出格式**:Markdown、JSON 和 Text - **Markdown 输出**:包含标题、表格、列表、图像和链接的结构化 Markdown——非常适合用于输入给 LLM 和 RAG 流水线 - **边界框**:精确的文本定位信息 - **多语言支持**:可从 Rust、Node.js/TypeScript、Python 或浏览器 (WASM) 中使用 - **多平台支持**:Linux、macOS (Intel/ARM)、Windows ``` flowchart LR subgraph Input["Input Formats"] direction TB PDF["PDF"] DOCX["DOCX"] XLSX["XLSX"] PPTX["PPTX"] IMG["Images"] end subgraph Core["Rust Core"] direction TB CONV["Format Conversion\nLibreOffice / ImageMagick"] EXTRACT["Text Extraction\nPDFium C library"] OCR["Selective OCR\nTesseract / HTTP / Custom"] MERGE["OCR Merge\nNative text + OCR results"] PROJ["Grid Projection\nSpatial layout reconstruction"] CONV --> EXTRACT EXTRACT --> OCR --> MERGE --> PROJ EXTRACT --> MERGE end subgraph Output[" Output "] direction TB JSON["Structured JSON\ntext + bounding boxes"] TEXT["Plain Text\nlayout-preserved"] SCREEN["Screenshots\nPNG rendering"] end subgraph Bindings["Language Bindings"] direction TB NAPI["Node.js / TypeScript\nnapi-rs"] PYO3["Python\nPyO3"] WASM["Browser / WASM\nwasm-bindgen"] CLI["CLI\ncargo / npm / pip"] NAPI ~~~ PYO3 ~~~ WASM ~~~ CLI end PDF --> EXTRACT DOCX & XLSX & PPTX & IMG --> CONV PROJ --> JSON & TEXT & SCREEN JSON & TEXT & SCREEN --> Bindings style Input fill:#F5F5F5,color:#000000,stroke:#37D7FA,stroke-width:2px style Core fill:#F5F5F5,color:#000000,stroke:#3E18F9,stroke-width:2px style Output fill:#F5F5F5,color:#000000,stroke:#FF8705,stroke-width:2px style Bindings fill:#F5F5F5,color:#000000,stroke:#FF8DF2,stroke-width:2px style PDF fill:#96E7F9,color:#000000,stroke:#37D7FA,stroke-width:1px style DOCX fill:#96E7F9,color:#000000,stroke:#37D7FA,stroke-width:1px style XLSX fill:#96E7F9,color:#000000,stroke:#37D7FA,stroke-width:1px style PPTX fill:#96E7F9,color:#000000,stroke:#37D7FA,stroke-width:1px style IMG fill:#96E7F9,color:#000000,stroke:#37D7FA,stroke-width:1px style CONV fill:#92AEFF,color:#000000,stroke:#4B72FE,stroke-width:1px style EXTRACT fill:#92AEFF,color:#000000,stroke:#4B72FE,stroke-width:1px style OCR fill:#92AEFF,color:#000000,stroke:#4B72FE,stroke-width:1px style MERGE fill:#92AEFF,color:#000000,stroke:#4B72FE,stroke-width:1px style PROJ fill:#4B72FE,color:#FFFFFF,stroke:#3E18F9,stroke-width:2px style JSON fill:#FFBD74,color:#000000,stroke:#FF8705,stroke-width:1px style TEXT fill:#FFBD74,color:#000000,stroke:#FF8705,stroke-width:1px style SCREEN fill:#FFBD74,color:#000000,stroke:#FF8705,stroke-width:1px style NAPI fill:#FFBFF8,color:#000000,stroke:#FF8DF2,stroke-width:1px style PYO3 fill:#FFBFF8,color:#000000,stroke:#FF8DF2,stroke-width:1px style WASM fill:#FFBFF8,color:#000000,stroke:#FF8DF2,stroke-width:1px style CLI fill:#FFBFF8,color:#000000,stroke:#FF8DF2,stroke-width:1px ``` ## 安装说明 通过您首选的包管理器进行安装。所有版本(WASM 除外)都提供相同的 `lit` CLI。 | 语言 | 安装 | 库文档 | |----------|---------|--------------| | **Node.js / TypeScript** | `npm i @llamaindex/liteparse` | [Node.js README](packages/node/README.md) | | **Python** | `pip install liteparse` | [Python README](packages/python/README.md) | | **Rust** | `cargo install liteparse` (CLI) / `cargo add liteparse` (库) | [Rust README (crates.io)](crates/liteparse/README.md) | | **浏览器 (WASM)** | `npm i @llamaindex/liteparse-wasm` | [WASM README](packages/wasm/README.md) | ### Agent Skill 您可以将 `liteparse` 用作一种 agent skill,并使用 `skills` CLI 工具进行下载: ``` npx skills add run-llama/llamaparse-agent-skills --skill liteparse ``` 或者直接将 [`SKILL.md`](https://github.com/run-llama/llamaparse-agent-skills/blob/main/skills/liteparse/SKILL.md) 文件复制粘贴到您自己的 skills 配置中。 ## CLI 用法 所有安装方式(`npm`、`pip`、`cargo install`)的 CLI 均相同。 ### 解析文件 ``` # 基础解析 lit parse document.pdf # 解析为 Markdown — 标题、表格、列表、图像、链接 lit parse document.pdf --format markdown -o output.md # 使用特定格式解析 lit parse document.pdf --format json -o output.json # 解析特定页面 lit parse document.pdf --target-pages "1-5,10,15-20" # 不使用 OCR 解析 lit parse document.pdf --no-ocr # 解析远程 PDF curl -sL https://example.com/report.pdf | lit parse - ``` ### Markdown 输出 LiteParse 可以将文档直接渲染为 Markdown。这意味着从空间布局中重建标题、表格、列表、图像和链接。这非常适合将文档输入给 LLM 和 RAG 流水线。此模式完全基于启发式方法和规则,因此复杂文档可能无法完美渲染,但速度会非常快。 ``` # 渲染为 Markdown lit parse document.pdf --format markdown -o output.md # 移除图像而不是发出占位符 lit parse document.pdf --format markdown --image-mode off # 将嵌入的图像提取到磁盘并从 markdown 中引用它们 lit parse document.pdf --format markdown --image-mode embed --image-output-dir ./images # 将链接文本作为纯文本发出(不使用 [text](url) 语法) lit parse document.pdf --format markdown --no-links ``` 图像处理由 `--image-mode` 控制: | 模式 | 行为 | |------|----------| | `placeholder` (默认) | 按阅读顺序输出 `![](https://raw.githubusercontent.com/run-llama/liteparse/main/image_pN_K.png)` 引用 | | `off` | 完全剔除图像 | | `embed` | 将每个图像的 PNG 字节写入 `--image-output-dir` 并进行引用 | ### 检查复杂度 在进行完整解析之前,检查文档是否确实需要 OCR 或更深度的处理。这是一种仅针对文本层的低成本检查——适用于将文档路由到不同的流水线、拒绝无法处理的文档或估算成本。 ``` # 打印复杂度判定结果和逐页 JSON lit is-complex document.pdf # 作为 shell 谓词使用 — 仅在文档简单时使用 --no-ocr 进行解析 lit is-complex document.pdf --quiet && lit parse document.pdf --no-ocr # 列出需要 OCR 的页面 lit is-complex document.pdf --compact | jq '[.[] | select(.needs_ocr) | .page_number]' ``` 它总是将逐页的 JSON 打印到 **stdout**,将人类可读的结论打印到 **stderr**,并在**任何页面需要 OCR 时以非零状态退出**。每一页都包含一个 `needs_ocr` 结论以及一系列 `reasons`(`scanned`、`no-text`、`sparse-text`、`embedded-images`、`garbled`、`vector-text`)。 ### 批量解析 解析整个目录中的文档: ``` lit batch-parse ./input-directory ./output-directory ``` ### 生成截图 截图对于 LLM 代理提取单凭文本无法捕获的视觉信息至关重要。 ``` # 截取所有页面 lit screenshot document.pdf -o ./screenshots # 截取特定页面 lit screenshot document.pdf --target-pages "1,3,5" -o ./screenshots # 自定义 DPI lit screenshot document.pdf --dpi 300 -o ./screenshots ``` ### CLI 参考 #### 解析命令 ``` lit parse [OPTIONS] Options: -o, --output Output file path --format Output format: json|text|markdown [default: text] --no-ocr Disable OCR --ocr-language OCR language, Tesseract format [default: eng] --ocr-server-url HTTP OCR server URL (uses Tesseract if not provided) --tessdata-path Path to tessdata directory --max-pages Max pages to parse [default: 1000] --target-pages Pages to parse (e.g., "1-5,10,15-20") --dpi Rendering DPI [default: 150] --image-mode Markdown image handling: off|placeholder|embed [default: placeholder] --image-output-dir Where to write images when --image-mode embed --no-links Emit link anchor text as plain text (no [text](url)) in markdown --preserve-small-text Keep very small text --password Password for encrypted documents --num-workers Concurrent OCR workers [default: CPU cores - 1] -q, --quiet Suppress progress output -h, --help Print help ``` #### 批量解析命令 ``` lit batch-parse [OPTIONS] Options: --format Output format: json|text|markdown [default: text] --no-ocr Disable OCR --ocr-language OCR language [default: eng] --ocr-server-url HTTP OCR server URL --tessdata-path Path to tessdata directory --max-pages Max pages per file [default: 1000] --dpi Rendering DPI [default: 150] --recursive Recursively search input directory --extension Only process files with this extension (e.g., ".pdf") --password Password for encrypted documents --num-workers Concurrent OCR workers -q, --quiet Suppress progress output -h, --help Print help ``` #### 截图命令 ``` lit screenshot [OPTIONS] Options: -o, --output-dir Output directory [default: ./screenshots] --target-pages Pages to screenshot (e.g., "1,3,5" or "1-5") --dpi Rendering DPI [default: 150] --password Password for encrypted documents -q, --quiet Suppress progress output -h, --help Print help ``` #### Is-Complex 命令 ``` lit is-complex [OPTIONS] Options: --compact Emit dense, whitespace-free JSON instead of pretty-printed --max-pages Max pages to check [default: 1000] --target-pages Pages to check (e.g., "1-5,10,15-20") --password Password for encrypted documents -q, --quiet Suppress the stderr verdict -h, --help Print help ``` 将逐页 JSON 打印到 stdout,并将 `COMPLEX`/`SIMPLE` 结论打印到 stderr;当任何页面需要 OCR 时以非零状态退出,因此它可以作为 shell 断言组合使用。 ## OCR 设置 ### 默认:Tesseract Tesseract 已内置,开箱即用: ``` lit parse document.pdf # OCR enabled by default lit parse document.pdf --ocr-language fra # Specify language lit parse document.pdf --no-ocr # Disable OCR ``` 对于离线或物理隔离的环境,请将 `TESSDATA_PREFIX` 设置为包含预下载 `.traineddata` 文件的目录: ``` export TESSDATA_PREFIX=/path/to/tessdata lit parse document.pdf --ocr-language eng ``` 或者直接传递路径: ``` lit parse document.pdf --tessdata-path /path/to/tessdata ``` ### 可选:HTTP OCR 服务器 为了获得更高的准确性或更好的性能,您可以使用 HTTP OCR 服务器。我们为流行的 OCR 引擎提供了可直接使用的示例包装器: - [EasyOCR](ocr/easyocr/README.md) - [PaddleOCR](ocr/paddleocr/README.md) 您可以通过实现简单的 LiteParse OCR API 规范(参见 [`OCR_API_SPEC.md`](OCR_API_SPEC.md))来集成任何 OCR 服务。 该 API 要求: - POST `/ocr` endpoint - 接受 `file` 和 `language` 参数 - 返回 JSON:`{ results: [{ text, bbox: [x1,y1,x2,y2], confidence }] }` ## 多格式输入支持 LiteParse 支持在解析前将各种文档格式**自动转换**为 PDF。 ### 支持的输入格式 #### Office 文档(通过 LibreOffice) - **Word**: `.doc`, `.docx`, `.docm`, `.odt`, `.rtf`, `.pages` - **PowerPoint**: `.ppt`, `.pptx`, `.pptm`, `.odp`, `.key` - **电子表格**: `.xls`, `.xlsx`, `.xlsm`, `.ods`, `.csv`, `.tsv`, `.numbers` 安装 LibreOffice 以进行自动转换: ``` # macOS brew install --cask libreoffice # Ubuntu/Debian apt-get install libreoffice # Windows choco install libreoffice-fresh ``` #### 图像(通过 ImageMagick) - **格式**: `.jpg`, `.jpeg`, `.png`, `.gif`, `.bmp`, `.tiff`, `.webp`, `.svg` 安装 ImageMagick 以进行图像到 PDF 的转换: ``` # macOS brew install imagemagick # Ubuntu/Debian apt-get install imagemagick # Windows choco install imagemagick.app ``` ## 环境变量 | 变量 | 描述 | |----------|-------------| | `TESSDATA_PREFIX` | 包含 Tesseract `.traineddata` 文件的目录路径。用于离线/物理隔离环境。 | ## 开发 该项目是一个 Rust workspace,包含核心库和特定语言的 binding crate。 ``` crates/ ├── liteparse/ # Core library + CLI binary ├── liteparse-napi/ # Node.js bindings (napi-rs) ├── liteparse-python/ # Python bindings (PyO3) ├── liteparse-wasm/ # WASM bindings (wasm-bindgen) ├── pdfium/ # PDFium Rust wrapper └── pdfium-sys/ # PDFium FFI bindings packages/ ├── node/ # npm package (TS wrapper + native binary) ├── python/ # PyPI package (Python wrapper + native binary) └── wasm/ # WASM npm package ``` ### 构建 ``` # 构建 CLI cargo build --release -p liteparse # 构建 Node.js bindings cd packages/node && npm run build # 构建 Python bindings cd packages/python && maturin develop --release # 构建 WASM cd packages/wasm && npm run build ``` 我们提供了内容相当丰富的 `AGENTS.md`/`CLAUDE.md`,建议您使用它来辅助开发 + 编码代理。 ## 许可证 Apache 2.0 ## 鸣谢 基于以下项目构建: - [PDFium](https://pdfium.googlesource.com/pdfium/) - PDF 渲染和文本提取 - [Tesseract](https://github.com/tesseract-ocr/tesseract) - OCR 引擎(通过 tesseract-rs) - [EasyOCR](https://github.com/JaidedAI/EasyOCR) - HTTP OCR 服务器(可选) - [PaddleOCR](https://github.com/PaddlePaddle/PaddleOCR) - HTTP OCR 服务器(可选) - [napi-rs](https://napi.rs/) - Node.js 原生绑定 - [PyO3](https://pyo3.rs/) - Python 原生绑定 - [wasm-bindgen](https://github.com/wasm-bindgen/wasm-bindgen) - WebAssembly 绑定
标签:OCR, PDF解析, 二进制发布, 可视化界面, 开源工具, 文档解析, 通知系统