
Camelot
CLI从 PDF 中抽取表格的开源工具,自带 camelot 命令行,可把财报、银行对账单、统计报表里的表格导出为 Excel、CSV 或 Markdown,并给出识别准确度。需要 Python 3.10+;默认只处理能选中文字的 PDF,扫描件需另装 ml 与 ocr 扩展;结果建议人工核对。
Camelot: PDF Table Extraction for Humans
Camelot is a Python library that can help you extract tables from PDFs.
Features
- 📊 Five parsers —
lattice(ruled tables),stream(whitespace), the text-alignmentnetwork/hybrid, and the optional neuralml(Table Transformer) for hard borderless tables — plusflavor="auto"to pick one for you. - 🤖 Borderless & scanned — the optional
mlbackend (pip install "camelot-py[ml]") recovers structure that the heuristic parsers can't on borderless tables; add[ocr]to read scanned / image-only PDFs with no text layer. - 🧠 Vector + raster line detection —
engine="combined"unions the PDF's native vector ruled lines with OpenCV detection, so faintly-ruled tables are still found. - 🐼 pandas output — every table is a
DataFrame, ready for analysis. - 📤 Many export formats — CSV, JSON, Excel, HTML, Markdown, and SQLite.
- 📐 Quality metrics — accuracy, whitespace, and a confidence score per table; drop noise with
TableList.filter(...). - 🧩 Multi-page tables — stitch continuations across pages with
stack_contiguous(). - 🎛️ Highly configurable — table areas/regions, column separators, text processing, and more.
- 🔌 Flexible input — a file path, URL, raw
bytes, or any binary file-like object. - 🖥️ CLI included —
camelot lattice file.pdf, etc. - 📦 Light install — the default pdfium backend is bundled, with no system dependencies.
Extract tables from PDFs in just a few lines of code:
Try it yourself in our interactive quickstart notebook.
Or check out a simple example using this pdf.
>>> import camelot
>>> tables = camelot.read_pdf('foo.pdf')
>>> tables
<TableList n=1>
>>> tables.export('foo.csv', f='csv', compress=True) # json, excel, html, markdown, sqlite
>>> tables[0]
<Table shape=(7, 7)>
>>> tables[0].parsing_report
{
'accuracy': 99.02,
'whitespace': 12.24,
'order': 1,
'page': 1
}
>>> tables[0].to_csv('foo.csv') # to_json, to_excel, to_html, to_markdown, to_sqlite
>>> tables[0].df # get a pandas DataFrame!
| Cycle Name | KI (1/km) | Distance (mi) | Percent Fuel Savings | |||
|---|---|---|---|---|---|---|
| Improved Speed | Decreased Accel | Eliminate Stops | Decreased Idle | |||
| 2012_2 | 3.30 | 1.3 | 5.9% | 9.5% | 29.2% | 17.4% |
| 2145_1 | 0.68 | 11.2 | 2.4% | 0.1% | 9.5% | 2.7% |
| 4234_1 | 0.59 | 58.7 | 8.5% | 1.3% | 8.5% | 3.3% |
| 2032_2 | 0.17 | 57.8 | 21.7% | 0.3% | 2.7% | 1.2% |
| 4171_1 | 0.07 | 173.9 | 58.1% | 1.6% | 2.1% | 0.5% |
Camelot also comes packaged with a command-line interface!
Refer to the QuickStart Guide to quickly get started with Camelot, extract tables from PDFs and explore some basic options.
Tip: Visit the parser-comparison-notebook to get an overview of all the packed parsers and their features.
Note: The built-in parsers need a text-based PDF (as Tabula explains, "If you can click and drag to select text in your table in a PDF viewer, then your PDF is text-based"). For scanned / image-only PDFs, install the neural backend with OCR — pip install "camelot-py[ml,ocr]" — and use camelot.read_pdf(..., flavor="ml"): the model reads the structure from the page image and OCR supplies the text.
You can check out some frequently asked questions here.
Which parser should I use?
| Your PDF | Use | Why |
|---|---|---|
| Ruled tables (lines between cells) | flavor="lattice" (default) | Deterministic; detects the grid from the ruled lines. engine="combined" also catches faint vector rules. |
| Borderless tables (whitespace-separated) | flavor="network" or "stream" | Text-alignment / whitespace heuristics — fast, no extra dependencies. |
| Borderless tables, best quality | flavor="ml" (pip install "camelot-py[ml]") | A Table Transformer model recovers structure heuristics can't — on FinTabNet it roughly doubles borderless TEDS vs network/hybrid. Heavier (PyTorch); opt-in. |
| Scanned / image-only PDFs (no text layer) | flavor="ml" + pip install "camelot-py[ml,ocr]" | Structure from the model, text from OCR. |
| Mixed / not sure | flavor="auto" | Picks lattice or network per page. |
The ml backend keeps Camelot honest: the model only supplies the table
structure, while cell text comes from the PDF's own text layer (or OCR
for scans) — so it never invents or alters a value.
Why Camelot?
- Configurability: Camelot gives you control over the table extraction process with tweakable settings.
- Metrics: You can discard bad tables based on metrics like accuracy and whitespace, without having to manually look at each table.
- Output: Each table is extracted into a pandas DataFrame, which seamlessly integrates into ETL and data analysis workflows. You can also export tables to multiple formats, which include CSV, JSON, Excel, HTML, Markdown, and Sqlite.
See comparison with similar libraries and tools.
Installation
Camelot's default image-conversion backend is pdfium, which ships as a wheel — so a plain install needs no system dependencies. The optional ghostscript and poppler backends require additional dependencies.
Using uv
uv is a fast Python package and project manager. To add Camelot to a project:
uv add camelot-py
Or to install it into the current environment:
uv pip install camelot-py
Using pip
pip install "camelot-py"
Using conda
conda is the package manager for the Anaconda distribution:
conda install -c conda-forge camelot-py
From the source code
git clone https://github.com/camelot-dev/camelot.git
cd camelot
uv pip install "." # or: pip install "."
Optional extras
pip install "camelot-py[ml]" # neural flavor='ml' (Table Transformer; pulls PyTorch)
pip install "camelot-py[ocr]" # OCR text source for scanned PDFs (use with [ml])
pip install "camelot-py[ml,ocr]" # both — borderless + scanned
pip install "camelot-py[plot]" # matplotlib debug plots
The core install stays light: [ml]/[ocr] are imported lazily, so a plain
import camelot never loads PyTorch or OCR.
Note —
[ocr]pullsrapidocr-onnxruntime, which hard-requires the fullopencv-pythoneven though Camelot itself usesopencv-python-headless. See the install docs for how to keep the headless build only.
Documentation
The documentation is available at http://camelot-py.readthedocs.io/.
Contributing
The Contributor's Guide has detailed information about contributing issues, documentation, code, and tests.
Versioning
Camelot uses Semantic Versioning. For the available versions, see the tags on this repository. For the changelog, you can check out the releases page.
License
This project is licensed under the MIT License, see the LICENSE file for details.
The documentation theme is licensed under a separate BSD-like License, see the LICENSE file for details.
相关资源

MarkItDown
CLI把 PDF、Word、Excel、PPT、HTML、图片、音频等文件转成保留标题、列表与表格结构的 Markdown,供大模型读取与分析。微软官方维护,需要 Python 3.10 以上。
microsoft/markitdown191k
MarkItDown-MCP
MCP微软官方出品:把 PDF、Word、Excel、PPT、HTML 等文件或网址转换为 Markdown,便于 agent 阅读与检索;只有一个 convert_to_markdown 工具,支持 STDIO 与本地 HTTP。
microsoft/markitdown191k
ExcelMcp
MCP在 Windows 上直接驱动本机 Excel:刷新 Power Query、做透视表和图表、计算 DAX、运行 VBA,并保留原有公式与格式,适合财务和行政在现有报表上自动整理数据。需要 Windows、Excel 2016 以上和 Node.js,不支持 macOS。
sbroenne/mcp-server-excel821
OpenBB Platform CLI
CLIOpenBB 开源投资研究平台的命令行版,在终端查询股票行情、财报、宏观经济等金融数据,可用 Routine 脚本批量自动取数。官方维护,部分数据源需自备 API Key。
OpenBB-finance/OpenBB74.3k
pdfplumber
CLI精确读取电子版 PDF 中每个字符、线条和表格框的位置:命令行可导出保留版面的文字或 CSV / JSON 明细,Python 接口还能抽取表格和表单字段,适合从发票、对账单、报表里取数。需 Python 环境,本地运行;不适合扫描件,需先 OCR。
jsvine/pdfplumber10.8k
Docling MCP
MCPDocling 项目官方 MCP:把 PDF、Word、PPT 等文件转成结构化文档,识别版面与表格、对扫描件做 OCR,也能让 agent 逐段生成新文档并导出 Markdown。本地模式需 Python 与 uv,首次运行会下载版面识别模型;也可改连自建的 Docling Serve 服务。
docling-project/docling-mcp773