Skip to main content

ragtable-extract

English | 中文

Python 3.8+ License: MIT

PDF Parsing for RAG — extracting tables precisely. Convert to HTML. Fast, local, no GPU.

A lightweight Python library that extracts tables from PDFs and converts them to clean HTML, designed for RAG pipelines and LLM retrieval. Runs entirely on CPU with no external APIs or GPU dependencies.

Features

  • Precise extraction — Character-level coordinate extraction for accurate cell boundaries
  • ≥/≤ symbols — Correctly repositioned by coordinates (avoids pdfplumber's line-end placement bug)
  • Merged cells — Proper rowspan / colspan output for multi-column tables
  • Line-wrapped text — Auto-segments and concatenates text across line breaks within cells (no symbol/text serialization)
  • Fangzheng font — Handles full-width character ordering and decimal point encoding issues
  • Adaptive config — Per-page tuning based on character metrics
  • Fast & local — Pure Python, pdfplumber-based, no GPU required

Requirements

  • Python 3.8+
  • pdfplumber >= 0.10.0

Installation

pip install ragtable-extract

Or from source:

git clone https://github.com/ZhuJiaxin2/ragtable-extract.git
cd ragtable-extract
pip install -e .

Quick Start

import ragtable_extract

# Convert PDF tables to HTML file
ragtable_extract.convert(
    input_path="document.pdf",
    output_path="tables.html",
)

# Or extract as structured data
tables = ragtable_extract.extract(input_path="document.pdf")
for t in tables:
    print(f"Page {t['page']}: {t['html'][:80]}...")

CLI

python -m ragtable_extract document.pdf output.html

Web Quick Test (app.py)

Run the Flask web app to upload PDFs and preview extraction results in the browser:

pip install flask
python app.py

Then open http://localhost:1965 to upload a PDF and view extracted tables.

Test Results

Run python test.py to generate extraction results. Output files:

Source PDF Extraction Result
test/example/zhejiang.pdf test/result/test_adaptive_zhejiang.html
test/example/changsha.pdf test/result/test_adaptive_changsha.html
test/example/shaanxi.pdf test/result/test_adaptive_shaanxi.html
test/example/tongbao.pdf test/result/test_adaptive_tongbao.html

API

Function Description
convert(input_path, output_path, pages?, config?, use_adaptive_config=True) Convert PDF tables to HTML file
extract(input_path, pages?, config?, use_adaptive_config=True) Extract tables as list of dicts with page, html, bbox, raw
build_full_html(pdf_filename, tables) Build full HTML document from extracted tables
Config Dataclass for tuning extraction (multiline thresholds, font tolerance, etc.)

Configuration

import ragtable_extract

# Custom config
config = ragtable_extract.Config(
    multiline_cell_top_range=25,
    multiline_y_tolerance=4,
)
tables = ragtable_extract.extract("doc.pdf", config=config)

# Adaptive config (default) — infers parameters from page character metrics
tables = ragtable_extract.extract("doc.pdf")  # use_adaptive_config=True by default

Project Structure

ragtable-extract/
├── ragtable_extract/     # Core library
│   ├── __init__.py       # convert(), extract()
│   ├── _core.py          # Table extraction logic
│   ├── _config.py        # Config & adaptive metrics
│   ├── _font.py          # Special font handling
│   └── _html.py          # HTML template
├── pyproject.toml
├── demo.py               # CLI demo
└── app.py                # Optional Flask web API

How It Works

PDF → pdfplumber.find_tables()
  → Filter chars by bbox, cluster by top (y)
  → Reorder ≥/≤ symbols, fix Fangzheng font
  → Output <table> HTML

Comparison Report

We compare ragtable-extract with opendataloader-pdf on real government PDF tables. Our extraction:

  • Multi-column tables — Correctly recognizes complex layouts with merged cells
  • Line-wrapped text — Automatically segments and concatenates text across line breaks within cells
  • No serialization — Symbols and text stay in correct cells (e.g. no 1 2 or 万人 % wrongly merged)

Run python test_comparison.py to generate the report, then open comparison_report.html for side-by-side results.

License

MIT

Metadata

Release files for ragtable-extract 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ragtable-extract 0.1.1
File Size Uploaded
ragtable_extract-0.1.1.tar.gz 13.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ragtable-extract 0.1.1
File Interpreter ABI Platform
ragtable_extract-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 25.8 kB

Release files / ragtable_extract-0.1.1.tar.gz

Download URL ragtable_extract-0.1.1.tar.gz
Size 13.1 kB
Tags Source
SHA-256 checksum
How to use checksums
b4244f4485c17b58a01b5e23cc1aea197c780fd94900c19c8a0a50ca2355740f
BLAKE2b-256 checksum
How to use checksums
7dcb3ba8a2143ff68abc054e76e017ed48aac10bee46cbdfbc1b86190893641a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.19

Release files / ragtable_extract-0.1.1-py3-none-any.whl

Download URL ragtable_extract-0.1.1-py3-none-any.whl
Size 12.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a687d6eceaf8a0539fd5caab9dc9b1b230126097ded9082817e22a3dcc6a6a07
BLAKE2b-256 checksum
How to use checksums
55b0356e7c43d343bda8c9f50dbfc15260caaf4e825f58674648362787698b73
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.19

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

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