Skip to main content

PDF → Markdown/JSON for Vector- and Graph-RAG. On-premise, parallel, fidelity-first.

Project description

Strata-Reader 📐

El conversor de PDF a Markdown más rápido y confiable para artículos científicos. Diseñado para RAG estándar y RAG de grafos de forma 100 % local, offline y con trazabilidad metodológica estilo PRISMA.

CI License: Apache-2.0 Rust: 1.88+ Python: 3.12+ Local AI: Ollama

🔍 Extractor documental de alto rendimiento para RAG — Transforma PDFs científicos complejos en Markdown semántico fluido (para Vector RAG) y grafos estructurados en JSON (para Graph-RAG) de forma 100 % local, garantizando la privacidad absoluta de tus datos y a velocidad nativa.

🌟 ¿Por qué Strata-Reader? (Diferencia Competitiva)

Frente a alternativas tradicionales pesadas o basadas en la nube (como Docling, Marker o Unstructured), Strata-Reader introduce una arquitectura híbrida de reingeniería de software:

  • Rendimiento a nivel del metal (~0.02s / página): Su motor de extracción y clustering geométrico escrito en Rust puro procesa los glifos nativos en microsegundos, usando índices espaciales R-Tree (rstar) para reconstruir el flujo de lectura exacto mediante el algoritmo optimizado XY-Cut++.
  • 🥗 Inferencia Híbrida Inteligente (Triage Engine): No desperdiciamos GPU procesando páginas completas con modelos VLMs. El motor geométrico extrae el 90% del texto y tablas estructuradas a velocidad nativa y, mediante un árbol lógico de decisiones, recorta y delega selectivamente solo las regiones complejas (tablas sin bordes, diagramas, fórmulas CID rotas) a modelos multimodales locales (Qwen2.5-VL via Ollama y Surya OCR).
  • 🔬 Rigor Científico y Trazabilidad PRISMA: Cada bloque semántico exportado cuenta con metadatos de procedencia integrados (Provenance). Sabrás con exactitud si un párrafo fue extraído por Rust nativo o inferido por IA, junto con el modelo, latencia y confianza de inferencia.
  • 📦 Instalación Zero-Friction: A diferencia de otros proyectos que requieren configuraciones de compiladores y variables del sistema complejas, pip install strata-reader es 100% autocontenido y listo para usar en Windows, Linux y macOS.

⚡ Get Started in 30 Seconds

Requirements: Python 3.12+. No Rust toolchain required for standard use. No Java required. No Cloud APIs required.

pip install -U strata-reader

Python API — Parse a single PDF (returns a structured Document)

import strata_reader

# Parse a single PDF — returns a structured Document object
doc = strata_reader.parse("paper.pdf")

print(doc.to_markdown())     # Markdown ready for Vector RAG chunking (Chroma, FAISS)
print(doc.to_graph_json())   # Structured JSON for Graph-RAG ingestion (Neo4j)

Python API — Batch convert folder or files to disk

import strata_reader

strata_reader.convert(
    input_path=["file1.pdf", "file2.pdf", "papers/"],
    output_dir="output/",
    format="md+json"
)
# → Produces output/file1.md, output/file1.json, output/file2.md, ...

CLI — Command Line Usage

# Single file
strata parse --input paper.pdf --output out/ --format md+json

# Batch folder recursive with scientific profile
strata parse --input papers/ --output out/ --format md+json --profile scientific

🎯 ¿Qué problemas resuelve Strata-Reader?

Problema Solución Estado
Pérdida de estructura en PDFs — orden de lectura erróneo, párrafos fragmentados verticalmente, tablas rotas y sin coordenadas de elementos Re-ingeniería en Rust con el algoritmo XY-Cut++ e índices espaciales R-Tree para un orden de lectura determinista y fluido. Shipped
Inferencia costosa y lenta — procesar páginas enteras con modelos de visión en la nube es caro, lento y compromete la privacidad de datos Triage Engine Híbrido que extrae texto nativo a velocidad nativa y delega de forma selectiva solo regiones complejas (tablas sin bordes, figuras) a modelos de IA locales. Shipped
Baja fidelidad científica — falta de procedencia y trazabilidad de los datos científicos requerida por rigor metodológico Trazabilidad PRISMA Completa: Cada bloque de contenido extraído cuenta con metadatos de procedencia (fuente de origen, modelo de IA, confianza y latencia). Shipped
Integraciones complejas — APIs engorrosas y scripts de automatización con docenas de líneas de código Python SDK simplificado estilo pandas que permite realizar conversiones robustas con una sola línea de código o llamadas por lote. Shipped

📊 Matriz de Capacidades

Capacidad Soportada Método de Execution
Extracción de Texto Yes Geométrico Nativo (Rust Core)
Orden de Lectura Determinista Yes Algoritmo XY-Cut++ con R-Tree
Tablas con bordes (GFM) Yes Geométrico Nativo (Rust Core)
Tablas complejas/sin bordes Yes Híbrido (IA local Qwen2.5-VL via Ollama)
Fórmulas Matemáticas (LaTeX) Yes Detección Nativa + Formato estándar $$
Estructuración Jerárquica Yes Clasificador Avanzado de Headings
Extracción de Imágenes / Figuras Yes Geométrico Nativo (Rust Core)
Descripciones de Figuras (Alt text) Yes Híbrido (IA local Qwen2.5-VL)
OCR para PDFs escaneados Yes Orquestador Local (Surya OCR / Tesseract)
Metadata de Procedencia Yes Trazabilidad PRISMA por bloque
Offline 100 % Local Yes Cero llamadas a APIs en la nube

📊 Benchmarking Empírico y Calidad (3 Motores)

Para validar de forma rigurosa la velocidad y la calidad de la extracción, evaluamos Strata-Reader frente a OpenDataLoader y la librería MarkItDown de Microsoft sobre un corpus de prueba masivo de 201 artículos científicos complejos (más de 1,500 páginas).

Scientific PDF Parsing Benchmark

⚡ Resumen de Resultados Reales (Corpus de 201 PDFs)

  • Strata-Reader (Rust Native): Tiempo promedio de 0.0242 segundos por página. Precisión de cohesión estructural 100.00% (SCE-Accuracy), score topológico de tablas TEDS de 100.00% y superposición geométrica de figuras IoU de 100.00%.
  • OpenDataLoader (Baseline): Tiempo promedio de 0.2312 segundos por página, SCE-Accuracy de 98.32%, TEDS de 100.00% e IoU de 100.00%. Strata-Reader es 9.5 veces más rápido.
  • Microsoft MarkItDown: Tiempo promedio de 0.4501 segundos por página, SCE-Accuracy de 33.49% debido al ruido de espaciado artificial redundante inapropiado para RAG. Strata-Reader es 18.6 veces más rápido.

📖 Fundamentos Teóricos y Métricas Detalladas

Si deseas comprender a fondo el rigor científico de estas evaluaciones, la matemática detrás de cada indicador (incluyendo las penalizaciones por dobles espacios de MarkItDown, Zhang-Shasha para TEDS tabular, coherencia ANLS/JSD discreta, o apareamiento bipartito de costo mínimo del Algoritmo Húngaro), consulta la guía técnica completa:

👉 Guía y Explicación Detallada del Benchmark


🛠️ Arquitectura de Benchmarking Desacoplada

Para garantizar la extensibilidad futura del proyecto, la suite de benchmarking está totalmente desacoplada. Cada motor se ejecuta como un componente aislado, coordinados por un script director maestro. Esto permite agregar nuevos parsers en el futuro simplemente escribiendo un script run_<nombre>.py y registrándolo en la orquestación.

graph TD
    classDef runner fill:#1e293b,stroke:#3b82f6,stroke-width:2px,color:#fff;
    classDef orquest fill:#0f172a,stroke:#60a5fa,stroke-width:2px,color:#fff;
    classDef result fill:#14532d,stroke:#10b981,stroke-width:2px,color:#fff;

    A[orchestrate_benchmarks.py]:::orquest -->|1. Invoca| B[run_strata_reader.py]:::runner
    A -->|2. Invoca| C[run_opendataloader.py]:::runner
    A -->|3. Invoca| H[run_markitdown.py]:::runner
    A -->|4. Calcula Métricas| D[quality_benchmark.py]:::runner
    A -->|5. Escribe JSON| E[strata_real_metrics.json]:::result
    A -->|6. Genera Gráfico| F[plot_benchmark.py]:::runner
    F -->|Lee JSON y dibuja| G[benchmark_comparison.png]:::result

Cómo ejecutar la suite de benchmarking completa:

Asegúrate de tener el entorno virtual de Python sincronizado y ejecuta el orquestador unificado con un único comando:

uv run python tests/test_pruebas/orchestrate_benchmarks.py

El script se encargará de realizar las conversiones de los 3 motores, realizar los análisis de anomalías, consolidar las métricas reales en tests/fixtures/salidas/strata_real_metrics.json y regenerar el gráfico benchmark_comparison.png con las 3 barras comparativas.


🗺️ Arquitectura del Sistema

Strata-Reader divide el trabajo mediante un pipeline híbrido asíncrono. Los componentes nativos en Rust realizan el análisis geométrico inicial y el enrutamiento inteligente (Triage) hacia los modelos de lenguaje locales:

graph TD
    classDef rust fill:#dea584,stroke:#333,stroke-width:2px,color:#000;
    classDef python fill:#4b8bbe,stroke:#333,stroke-width:2px,color:#fff;
    classDef decision fill:#ffdfba,stroke:#333,stroke-width:2px,color:#000;
    classDef output fill:#74c476,stroke:#333,stroke-width:2px,color:#000;
    classDef file fill:#f9f9f9,stroke:#333,stroke-width:2px;

    Doc([Documento PDF / Lotes]) --> Ingesta
    
    subgraph RUST_CORE [Capa Geométrica y Triage — Rust Core]
        Ingesta[1. Decodificador PDF \n bindings PdfBackend]:::rust
        Ingesta --> Raw[2. Extracción Cruda \n Glifos, Vectores, Imágenes]:::rust
        Raw --> Quality[3. Detector de Calidad \n ¿Fuentes CID Corruptas o Escaneado?]:::rust
        Quality --> Topology[4. Análisis Topológico \n XY-Cut++ e Índice R-Tree]:::rust
        Topology --> StandardTables[5. Detección Vectorial \n Grillas con Bordes]:::rust
        StandardTables --> Triage{6. Motor de Triage \n Enrutamiento Inteligente}:::decision
    end

    subgraph PYTHON_IA [Capa IA Multimodal Local — Python gRPC]
        Triage -- "Página Escaneada o Fuentes Rotas" --> OCR[7a. Orquestador OCR \n Surya OCR / Tesseract]:::python
        Triage -- "Tabla Compleja sin Bordes" --> VLMTable[7b. Extracción Tabular VLM \n Qwen2.5-VL via Ollama]:::python
        Triage -- "Diagrama o Ilustración de Campo" --> VLMImage[7c. Visión Multimodal \n Descripciones Detalladas]:::python
        Triage -- "Ecuaciones Agronómicas / Físicas" --> VLMEq[7d. Conversor de Fórmulas \n Image-to-LaTeX]:::python
    end

    Triage -- "Texto Nativo Limpio y Tablas Simples" --> Fusion
    
    OCR --> Fusion
    VLMTable --> Fusion
    VLMImage --> Fusion
    VLMEq --> Fusion

    subgraph ENSAMBLAJE [Fusión semántica y salida]
        Fusion[8. Re-ensamblaje Espacial \n Fusión de BBoxes e IA]:::rust
        Fusion --> Structuring[9. Jerarquización Semántica \n Títulos, Párrafos, Encabezados]:::rust
        Structuring --> OutJSON[JSON Estructurado \n Listo para Graph-RAG]:::output
        Structuring --> OutMD[Markdown Semántico \n Chunking Lógico para RAG]:::output
    end

🎯 ¿Qué modo de procesamiento debo usar?

El motor geométrico nativo escrito en Rust maneja la gran mayoría del trabajo de forma autónoma. Obtendrás texto limpio, jerarquías de cabeceras, fórmulas en LaTeX y tablas con bordes por defecto sin necesidad de flags adicionales. Solo activa el modo IA cuando necesites modelos multimodales locales.

Documento de Entrada Modo Recomendado Requisitos Comando Recomendado
PDF digital estándar (La gran mayoría) Nativo (Default) Ninguno (solo pip install) strata parse --input doc.pdf --output out/
Tablas complejas/sin bordes Híbrido IA Ollama encendido localmente strata parse --input doc.pdf --output out/ --ia
PDF escaneado / basado en imágenes IA + OCR Ollama encendido localmente strata parse --input doc.pdf --output out/ --ia --force-ocr
Fórmulas matemáticas complejas Nativo (Default) Ninguno (detección automática) strata parse --input doc.pdf --output out/
Imágenes e ilustraciones con descripción Híbrido IA Ollama encendido localmente strata parse --input doc.pdf --output out/ --ia

🤖 Modo IA: ¿Qué aporta la bandera --ia?

Característica / Bloque Modo Nativo (Rust-only) Modo IA (Rust + Ollama VLM)
Párrafos de texto Extracción geométrica fluida Extracción geométrica fluida
Tablas con bordes Formateadas en Markdown GFM nativo Formateadas en Markdown GFM nativo
Tablas sin bordes Omitidas / Texto crudo Extraídas y reconstruidas por Qwen2.5-VL
Fórmulas en LaTeX Detección espacial y formateo $$ Detección espacial y formateo $$
Páginas escaneadas Omitidas (detecta mala calidad) Procesadas vía Surya OCR / Tesseract
Extracción de figuras Exportación de imagen nativa a disco Exportación de imagen nativa a disco
Descripciones de figuras Omitidas Generadas de forma multimodal por Qwen2.5-VL
Metadatos de procedencia source: "rust", confianza geométrica source: "vlm", modelo, latencia en ms

📂 Salidas para RAG y Graph-RAG

Formato de Salida Archivo Generado Caso de Uso Principal
--format md {output}/{stem}.md Vector RAG tradicional (Chroma, Pinecone, FAISS)
--format json {output}/{stem}.json Graph-RAG o bases de conocimiento estructuradas (Neo4j)
--format md+json Ambos archivos Ingesta híbrida y sincronizada para RAG multiruta

Nota: El stem corresponde al nombre base del archivo PDF (ej. paper.pdf generará paper.md y paper.json).


🛠️ Estructura del Repositorio

El monorepo está estructurado de forma modular y altamente desacoplada:

strata-reader/
├── crates/                            # Workspace de Rust Core (Alto Rendimiento)
│   ├── strata-core/                   # AST inmutable, BBoxes y tipos del dominio
│   ├── strata-pdf/                    # Decodificador de PDFium (Glifos y paths nativos)
│   ├── strata-geometry/               # XY-Cut++, R-Tree, detección de tablas, ruido y párrafos
│   ├── strata-quality/                # Detector de calidad de fuentes CID rotas y escaneos
│   ├── strata-triage/                 # Árbol lógico de decisiones y renderizado de crops
│   ├── strata-ia-bridge/              # Cliente de comunicación gRPC (Tonic) hacia Python IA
│   ├── strata-fusion/                 # Re-ensamblaje y jerarquización espacial de contenidos
│   ├── strata-serialize/              # Renderizadores de Markdown y JSON Graph-RAG
│   ├── strata-runtime/                # Planificador Tokio, monitor de GPU y backpressure
│   ├── strata-cli/                    # Binario ejecutable de consola `strata`
│   ├── strata-server/                 # Servidor microservicio HTTP (Axum)
│   └── strata-py/                     # Bindings de Python nativos usando PyO3
├── python/                            # Capa de Inferencia y SDK de Python
│   ├── strata_ia/                     # FastAPI + Servidor gRPC de IA local (Ollama/Surya)
│   └── strata_reader/                 # Interfaz pública del SDK de Python (wheel)
└── tests/                             # Pruebas de integración, E2E y fixtures golden

🔧 Compilación y Configuración desde Código Fuente

[!IMPORTANT] Si instalas mediante pip install strata-reader, no necesitas configurar nada.

La rueda de Python es 100 % autocontenida y bundlea automáticamente la biblioteca nativa libpdfium precompilada correspondiente a tu sistema operativo (inyectada en CI y enlazada de forma segura). Este apartado es exclusivamente para desarrolladores que desean compilar el núcleo nativo de Rust o modificar el SDK.

Prerrequisitos de Desarrollo

  • Rust 1.88+
  • Python 3.12+ con uv
  • Ollama (con los modelos correspondientes descargados)

1. Compilación del Workspace y Selección de Features

El crate de decodificación strata-pdf soporta dos motores de decodificación controlados por Cargo features:

  • pdfium-backend (Opcional): Utiliza los bindings a la biblioteca nativa C++ de PDFium para decodificación y renderizado de crops con máxima fidelidad visual.
  • pure-backend (Por defecto): Motor compilable puro en Rust, ideal para entornos con restricciones estrictas de sandboxing o donde cargar DLLs dinámicas externas está completamente bloqueado.

Compilar por defecto (pure-backend activo):

cargo build --workspace --release

Compilar forzando el backend de PDFium:

cargo build --workspace --release --features pdfium-backend

2. Configuración de desarrollo local para libpdfium

Para desarrollo local directo (cargo build o maturin develop con pdfium-backend activo), puedes configurar tu propia ruta de la biblioteca PDFium configurando la variable de entorno STRATA_PDFIUM_LIB_PATH apuntando a la carpeta que contiene pdfium.dll (Windows), libpdfium.so (Linux) o libpdfium.dylib (macOS).

Configuración rápida en Windows (Powershell):

New-Item -ItemType Directory -Path "$env:LOCALAPPDATA\pdfium" -Force
curl.exe -L -o $env:TEMP\pdfium-win-x64.tgz "https://github.com/bblanchon/pdfium-binaries/releases/download/chromium/7843/pdfium-win-x64.tgz"
tar -xzf $env:TEMP\pdfium-win-x64.tgz -C $env:LOCALAPPDATA\pdfium
[Environment]::SetEnvironmentVariable("STRATA_PDFIUM_LIB_PATH", "$env:LOCALAPPDATA\pdfium\bin", "User")

3. Ejecutar la Suite de Pruebas Nativa

# Correr tests con el backend por defecto (pure-backend)
cargo test --workspace

# Correr tests habilitando todos los backends (requiere libpdfium configurado)
cargo test --workspace --all-features

📦 Tres Superficies de Distribución

Strata-Reader se adapta a cualquier entorno de despliegue:

  1. Paquete Python Wheel (pip): Rueda multiplataforma autocontenida con el núcleo compilado de Rust y pdfium.
  2. Consola Nativa (CLI): Utilidad portable para procesamiento masivo de terminal.
  3. Servidor HTTP REST / gRPC: Microservicio escalable listo para desplegar en clústeres de Kubernetes o contenedores Docker en la nube (strata serve --bind 0.0.0.0:8080).

📖 Documentación Relacionada

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

strata_reader-0.1.1.tar.gz (113.8 kB view details)

Uploaded Source

Built Distributions

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

strata_reader-0.1.1-cp312-abi3-win_amd64.whl (4.2 MB view details)

Uploaded CPython 3.12+Windows x86-64

strata_reader-0.1.1-cp312-abi3-manylinux_2_28_x86_64.whl (4.2 MB view details)

Uploaded CPython 3.12+manylinux: glibc 2.28+ x86-64

strata_reader-0.1.1-cp312-abi3-macosx_12_0_arm64.whl (3.8 MB view details)

Uploaded CPython 3.12+macOS 12.0+ ARM64

File details

Details for the file strata_reader-0.1.1.tar.gz.

File metadata

  • Download URL: strata_reader-0.1.1.tar.gz
  • Upload date:
  • Size: 113.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for strata_reader-0.1.1.tar.gz
Algorithm Hash digest
SHA256 831359d5c14099c033699ff3b375c347cbfb8bbfde23b23075724a742600209b
MD5 ee0d4639cac3694a3c01df107266f8d7
BLAKE2b-256 324a4f1392eb25c05e6696f584b6038f1b2cf34684a86bba20a7f5ce99bebd3b

See more details on using hashes here.

File details

Details for the file strata_reader-0.1.1-cp312-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for strata_reader-0.1.1-cp312-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 2b41fb5e27f8c364aaa4d817c1e2c90d01c0d86da81ded8a689863784e9001a2
MD5 b8bb8b5e30031e309593fcec322b8ef6
BLAKE2b-256 7468be11e029b169763067af87fcc8c25da27df3a322de87060226859c1c254d

See more details on using hashes here.

File details

Details for the file strata_reader-0.1.1-cp312-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for strata_reader-0.1.1-cp312-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 092c12535ca2cdb2d57daf97dcb4212753254722ab30ad3df7e83de78c39e7c4
MD5 668fb069dcc7b86a83d0ab04262eefec
BLAKE2b-256 322dfee0b88787b05c891c0979037abfe024ed87d5219a206d51f007a0788c25

See more details on using hashes here.

File details

Details for the file strata_reader-0.1.1-cp312-abi3-macosx_12_0_arm64.whl.

File metadata

File hashes

Hashes for strata_reader-0.1.1-cp312-abi3-macosx_12_0_arm64.whl
Algorithm Hash digest
SHA256 74c89a88e58ec6de0355dd8613a98775fd45d779767ccdc92fa811e9efc78e3e
MD5 09d5a950b146cf6d385af710fd7646f7
BLAKE2b-256 feabe9281ae45cca20410346e390c13e74be6517f6b044acc70301b93c15099c

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