RagTable
Extract tables from images/PDFs to Markdown — fast, accurate, RAG-ready
RagTable converts table images into structured Markdown using a segmentation model and per-cell OCR. Built for borderless and complex tables (academic papers, reports, scanned documents), with output that plugs directly into RAG pipelines or LLM contexts.
Features
- Table structure segmentation via EfficientUNet (~19M params) — detects
row,col,col_header,row_header, andspanmasks - Span detection — merged cells are identified and rendered correctly in Markdown
- Per-cell OCR via PaddleOCR — each cell is cropped and read individually to minimize noise
- Smart header handling — header rows get a dedicated OCR pass with spatial mapping for better accuracy
- Automatic post-processing — removes phantom edge columns, empty rows, and footer artifacts
- Fully offline — no external API calls, suitable for sensitive or air-gapped environments
- Multi-format input: PNG, JPG, TIFF
Installation
CPU (default)
pip install ragtab
This installs everything needed: PyTorch, PaddleOCR, PaddlePaddle (CPU), and other dependencies.
GPU (NVIDIA CUDA)
pip install ragtab[gpu]
This replaces paddlepaddle (CPU) with paddlepaddle-gpu for ~3-5× faster OCR inference on NVIDIA GPUs.
Requirements: Python ≥ 3.10
Install from source
git clone https://github.com/tai03102004/rag-table
cd ragtab
pip install -e .
Quickstart
from ragtab.pipeline import extract_table
markdown, cells = extract_table(
"table.png",
model_path="checkpoints/unet_best.pt",
ocr_engine="paddleocr"
)
print(markdown)
Output:
| Item | Price | Qty |
| ----------- | ----- | --- |
| iPhone 15 | 999 | 12 |
| Samsung S24 | 899 | 8 |
How It Works
Input image (resized to 384×384)
│
▼
[1] EfficientUNet → 5 segmentation masks
│
▼
[2] Projection analysis → row/column separator positions
│
▼
[3] Span detection → connected components on span mask
│
▼
[4] Grid construction → per-cell bounding boxes
│
▼
[5] OCR — header rows: spatial mapping pass
— body cells: per-cell crop + PaddleOCR
│
▼
[6] Post-processing → drop phantom columns, empty rows, footers
│
▼
[7] Markdown export
Each stage is independently accessible so you can customize or swap components.
Custom checkpoint
If you've trained your own model or want to use a different checkpoint:
markdown, cells = extract_table("table.png", model_path="path/to/your_model.pt")
Manual download (optional)
- Hugging Face (used by auto-download)
- Google Drive (mirror)
Cache location
By default, the model is cached at ~/.cache/ragtab/. Override via environment variable:
export RAGTAB_CACHE_DIR=/path/to/custom/cache
Project Structure
RagTable/
├── python/
│ └── ragtab/
│ ├── __init__.py
│ ├── detection.py # Mask → grid cells
│ ├── model.py # EfficientUNet definition
│ ├── ocr.py # PaddleOCR wrapper + text cleaning
│ ├── pipeline.py # End-to-end extract_table()
│ └── utils.py
├── checkpoints/
├── notebooks/
│ └── 02_table-recognition.ipynb
└── README.md
License
MIT — free to use, including for commercial purposes.
Author
Dinh Duc Tai — dinhductai2004@gmail.com
If you find this useful, consider giving it a ⭐️ on GitHub!
Release files for ragtab 0.1.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ragtab-0.1.6.tar.gz | 15.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ragtab-0.1.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 31.7 kB
Release files / ragtab-0.1.6.tar.gz
| Download URL | ragtab-0.1.6.tar.gz |
|---|---|
| Size | 15.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cb1bd740a2cb31216cee25004ef08e1d33dc6c7ab8eb624feb896dd064fb1e38
|
|
BLAKE2b-256 checksum How to use checksums |
22732071272e50b5f0ccff721e34909ca2ade58081dcbaf3c3f2e2bd5a6236ce
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.18
|
Release files / ragtab-0.1.6-py3-none-any.whl
| Download URL | ragtab-0.1.6-py3-none-any.whl |
|---|---|
| Size | 15.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
66885af993eb1c6aac25c159a3135d930e8f3764576e82512515c5ad63cd4684
|
|
BLAKE2b-256 checksum How to use checksums |
9b50c7a6ac2bd64388ddc9960456b2538fd0819cf6f1051509aae6a6728fd61f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.18
|