Skip to main content

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, and span masks
  • 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)


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 Taidinhductai2004@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)

Source distribution for ragtab 0.1.6
File Size Uploaded
ragtab-0.1.6.tar.gz 15.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ragtab 0.1.6
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

0.1.6 This release

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page