Skip to main content

Table extraction from images to Markdown for RAG systems

Project description

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!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ragtab-0.1.6.tar.gz (15.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ragtab-0.1.6-py3-none-any.whl (15.8 kB view details)

Uploaded Python 3

File details

Details for the file ragtab-0.1.6.tar.gz.

File metadata

  • Download URL: ragtab-0.1.6.tar.gz
  • Upload date:
  • Size: 15.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.18

File hashes

Hashes for ragtab-0.1.6.tar.gz
Algorithm Hash digest
SHA256 cb1bd740a2cb31216cee25004ef08e1d33dc6c7ab8eb624feb896dd064fb1e38
MD5 6acedba308581fcda03c21ee9f1543ec
BLAKE2b-256 22732071272e50b5f0ccff721e34909ca2ade58081dcbaf3c3f2e2bd5a6236ce

See more details on using hashes here.

File details

Details for the file ragtab-0.1.6-py3-none-any.whl.

File metadata

  • Download URL: ragtab-0.1.6-py3-none-any.whl
  • Upload date:
  • Size: 15.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.18

File hashes

Hashes for ragtab-0.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 66885af993eb1c6aac25c159a3135d930e8f3764576e82512515c5ad63cd4684
MD5 f929772ad9e87a3307197da451fa23d3
BLAKE2b-256 9b50c7a6ac2bd64388ddc9960456b2538fd0819cf6f1051509aae6a6728fd61f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page