Skip to main content

⚡ RasgaPDF

The Blazing-Fast 2D Spatial PDF Parser for Python.
Extract exact physical coordinates [x0, y0, x1, y1], word spans, text blocks, and tabular structures at native hardware speeds.

PyPI version Python versions License: MIT


🚀 Why RasgaPDF?

Most Python PDF extraction libraries make fragile guesses: they flatten multi-column layouts into corrupted text streams, mangle tables, and strip away 2D positional geometry.

RasgaPDF does one thing with uncompromising precision:
It returns the exact 2D physical spatial geometry of the PDF directly to Python:

  • Exact Bounding Boxes: Every character, word span, line, block, and table has exact coordinates [x0, y0, x1, y1].
  • Zero Lossy Heuristics: No broken markdown assumptions. Downstream LLMs, RAG pipelines, or vision-language models receive the true physical layout.
  • Pure Native Speed: Powered by a SIMD-parallelized Rust core. Extracts typical pages in ~3 to 8 ms.
  • Self-Contained Wheel: Pre-compiled native binaries bundled directly in the wheel. Zero external runtime dependencies.

⚡ Quick Benchmarks (Python)

Measured on Intel Core i7-1365U (Single-thread latency, 1-page complex PDF):

Library Parse Time Output Type Spatial Accuracy
⚡ RasgaPDF (parse_raw) ~7.7 ms Flat Coordinates [x0, y0, x1, y1] Exact Physical Canvas
🚀 RasgaPDF (parse_pdf) ~8.5 ms Hierarchical Blocks & Tables Exact Physical Canvas
PyMuPDF (fitz) ~28.0 ms Text / Pixmaps Bounding Boxes
pdfplumber ~410.0 ms Python Dicts High Overhead
pypdf ~95.0 ms Plain String No Geometry

📦 Installation

pip install --upgrade rasgapdf

💡 Usage

RasgaPDF offers two distinct modes for Python engineers:

⚡ Mode 1: Raw Physical Coordinates (parse_raw)

The fastest and most direct extraction possible. Returns a flat list of physical 2D coordinates for every text span on the page, with zero block/table overhead (~3-8 ms):

import rasgapdf

# Parse raw physical coordinates
doc = rasgapdf.parse_raw("document.pdf")

print(f"Extracted {doc['total_spans']} spans in {doc['parse_time_ms']:.2f} ms")

for span in doc["spans"]:
    print(
        f"[Page {span['page']}] "
        f"bbox=({span['x0']:.2f}, {span['y0']:.2f}, {span['x1']:.2f}, {span['y1']:.2f}) "
        f"font={span['font_name']} ({span['font_size']}pt) "
        f"text=\"{span['text']}\""
    )

Output Structure:

{
  "file_name": "document.pdf",
  "total_pages": 1,
  "total_spans": 20,
  "parse_time_ms": 7.78,
  "spans": [
    {
      "page": 1,
      "x0": 50.0,
      "y0": 67.0,
      "x1": 244.0,
      "y1": 83.0,
      "font_size": 12.0,
      "font_name": "Helvetica",
      "text": "The Future of Artificial Intelligence"
    }
  ]
}

🎯 Mode 2: Hierarchical Structured Document (parse_pdf)

Parses the visual hierarchy: paragraphs (text_blocks), text lines (lines), spans, and auto-detects matrix tables via column alignment:

import rasgapdf

doc = rasgapdf.parse_pdf("invoice.pdf", detect_tables=True)

for page in doc["pages"]:
    print(f"--- Page {page['page_number']} ({page['width']}x{page['height']} pt) ---")
    
    # 1. Inspect Text Blocks
    for block in page["text_blocks"]:
        print(f"Block #{block['block_id']} at {block['bbox']}:")
        for line in block["lines"]:
            print(f"  Line: {line['text']}")

    # 2. Inspect Detected Tables
    for table in page["tables"]:
        print(f"Table ({table['col_count']} cols x {table['row_count']} rows):")
        print("Headers:", table["headers"])
        for row in table["rows"]:
            print("Row:", row)

⚙️ Parameters for parse_pdf

Parameter Type Default Description
file_path str required Path to the PDF file on disk
detect_tables bool True Automatically detect and reconstruct tables
min_table_cols int 3 Minimum number of columns required to classify as a table
col_tolerance float 16.0 Horizontal alignment threshold in typographical points
row_tolerance float 6.0 Vertical line clustering threshold in points

📄 License

MIT License. Copyright (c) 2026 Messias Martins.

Metadata

Release files for rasgapdf 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 rasgapdf 0.1.1
File Size Uploaded
rasgapdf-0.1.1.tar.gz 4.8 MB Details

Built distribution (wheel)

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

Total release size: 9.7 MB

Release files / rasgapdf-0.1.1.tar.gz

Download URL rasgapdf-0.1.1.tar.gz
Size 4.8 MB
Tags Source
SHA-256 checksum
How to use checksums
956a13076d5cd7c3b7df9f5443e48dac98cac4b1ce7333940358dd7d654cfe9b
BLAKE2b-256 checksum
How to use checksums
f04295b6ebb70551fbb0907deafb0e92ca0eac1583c470d28bf9750e57d081fe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.9

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

Download URL rasgapdf-0.1.1-py3-none-any.whl
Size 4.8 MB
Tags Python 3
SHA-256 checksum
How to use checksums
0cd62ff6ec5e7d144b2acef03c320c60764a22bdbfbe25e07241dae94b6b7cf1
BLAKE2b-256 checksum
How to use checksums
1899ec047eefe9447e3640eb92b8837ef7c7de992e32d92330496a21adf08076
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.9

Release history Release notifications | RSS feed

0.1.2

2 release files

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