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.5.tar.gz (15.7 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.5-py3-none-any.whl (15.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: ragtab-0.1.5.tar.gz
  • Upload date:
  • Size: 15.7 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.5.tar.gz
Algorithm Hash digest
SHA256 0fbcc66a0b793664c8d1bad8a678f2048a2d1a98132d4b0574526bb3ef402c9c
MD5 7a6ec1582725c3d96c8005c64be11729
BLAKE2b-256 6277f31efc5a4ffc50e80bbca096563e27817c0c4ddffbdec431feaec3768fd0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ragtab-0.1.5-py3-none-any.whl
  • Upload date:
  • Size: 15.7 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.5-py3-none-any.whl
Algorithm Hash digest
SHA256 a1ab98f6fcf3e61db699f84f224dd2dca78a014dc33d17fbef46a1a0c90613ee
MD5 5ffaf2b0c6b2a10094d73c1ab320a418
BLAKE2b-256 7854e1d537277f7373810bc38793b90becc4e7e36860c59f9afa5f78a9f7be3c

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