Publicado el 15 de enero de 2026

por Equipo AlamedaDev

Extrayendo Tablas Masivas de PDFs con Reedy

La extracción de documentos falla de formas predecibles: no porque el modelo no pueda leer el documento, sino porque le pedimos que haga demasiado de una vez, sin forma de hacer cumplir la completitud.

Si le pides a un LLM "un array JSON de cada fila en esta tabla de 50 páginas", a menudo devolverá algo que parece razonable, pasa una verificación rápida y está silenciosamente incompleto. A veces trunca. A veces rellena segmentos faltantes con ruido plausible. De cualquier manera, el sistema downstream hereda el error. Eso está bien para resúmenes. Es inaceptable para ETL.

La salida estructurada a nivel de documento está desalineada con entidades repetitivas

La mayoría de los pipelines de extracción comienzan con una idea limpia: define un esquema para el documento, ejecuta una sola llamada y obtén un solo objeto JSON de vuelta. Es ordenado, es fácil de conectar y funciona bien cuando estás extrayendo un puñado de campos.

El problema comienza cuando el "documento" es efectivamente una base de datos renderizada como PDF: directorios de proveedores, cuadrículas de cobertura, hojas de tarifas, catálogos de productos. En esos casos, la completitud importa, y la completitud es exactamente en lo que un blob JSON a nivel de documento es peor para entregar, porque la salida crece grande, el contenido es repetitivo y el modelo no tiene un incentivo incorporado para enumerar cada elemento. Si necesitas todas las filas, "suficientemente cerca" no está lo suficientemente cerca.

Extrae la unidad que se repite

Cuando el contenido se repite, tu estrategia de extracción también debería repetirse.

En lugar de pedirle al modelo que produzca una lista gigante, define un esquema para una entidad (una fila / una entrada / un bloque) y extrae entidad por entidad, luego agrega. La extracción de entidades repetidas no es un truco de prompt. Es una elección de alineación: haces coincidir la granularidad de extracción con la estructura del documento. En Reedy, esto es Modo Página.

Qué hace el Modo Página

El Modo Página no es "dividir por página" y no es fragmentación ingenua. Es segmentación más estructura amigable para validación:

  • Filas de tabla, entradas de lista, bloques repetidos.

  • En segmentos pequeños del tamaño de una entidad (a menudo un puñado de entidades a la vez).

  • A cada segmento.

  • En una lista que puedas contar, almacenar y consultar.

Ya no estás apostando que el modelo se mantendrá disciplinado a través de una lista masiva. Le estás dando un trabajo más pequeño, repetidamente, y haciendo posible verificar que hizo todo el trabajo.

Ejemplo: extrayendo 380+ filas de un PDF de cobertura hospitalaria

Una buena prueba de estrés es un documento que es "solo una tabla", extendida a través de muchas páginas: un listado de hospitales por condado con cobertura de planes para cada hospital. La tabla es lo suficientemente grande como para que la extracción ingenua a nivel de documento tienda a devolver el primer fragmento y luego degradarse.

El Modo Página es una buena opción porque cada entidad es local: una fila de hospital contiene el condado, el nombre del hospital y los nombres de los planes.

Define el esquema para un hospital:

from pydantic import BaseModel, Field

class Hospital(BaseModel):
    county: str = Field(description="County name")
    hospital_name: str = Field(description="Hospital name")
    plan_names: list[str] = Field(description="Plans accepted at this hospital")

Luego extrae por fila:

from reedy import ReedyClient  # replace with your real SDK import

reedy = ReedyClient(api_key="REEDY_API_KEY")

result = reedy.extract(
    file="hospital-coverage.pdf",
    schema=Hospital,
    mode="page"
)

len(result.items), result.items[:2]

Dos reglas operativas hacen que esto sea seguro para producción:

  • Compáralo con un conteo esperado (del índice del PDF, un total de filas conocido o un recuento muestreado).

  • No como 'suficientemente bueno'.

El valor del Modo Página no es que haga posible la extracción; es que hace que la completitud sea comprobable.

No solo para tablas: catálogos y bloques repetidos

Muchos PDFs no son cuadrículas estrictas, pero aún tienen estructura repetida: cada producto tiene un código, un nombre, algunas especificaciones, un párrafo de descripción. Visualmente, es consistente; semánticamente, es una entidad repetida.

El Modo Página también funciona allí, siempre que el límite de la entidad sea descubrible y la información sea principalmente local al bloque.

from pydantic import BaseModel, Field

class CatalogItem(BaseModel):
    section: str = Field(description="Category / section header")
    sku: str = Field(description="Product code / SKU")
    name: str = Field(description="Product name")
    specs: str = Field(description="Key specs")
    description: str = Field(description="Description text")

Mismo flujo de trabajo: extrae por entidad, agrega en una lista, verifica el conteo, luego ETL.

El flujo de trabajo de la UI de Reedy está diseñado para manejar ese patrón sin necesidad de una API.

Paso 1: Subir el documento

Abre el Agente de Prompt General y sube tu PDF.

Una vez que aparezca bajo Seleccionar Documentos y el estado indique que está listo, puedes ejecutar la extracción.

Paso 2: Usa un prompt que coincida con la entidad que quieres

Para tablas repetitivas, el prompt debe definir qué representa una fila y qué campos quieres por entrada.

Aquí hay un ejemplo para un documento de cobertura de hospitales por condado:

Extract a list of hospitals organized by county, showing which BSC (Blue Shield of California)
health plans are available at each hospital. For each hospital entry, provide the county,
hospital name, and list of available plans (Trio HMO, SaveNet, Access+ HMO, BlueHPN PPO,
Tandem PPO, PPO).

Paso 3: Activa "Procesar por Página"

Para documentos largos, activa Procesar por Página.

Este es el equivalente en la UI de "no hagas una generación gigante". Mantiene la extracción acotada, reduce la posibilidad de resultados de "solo primer fragmento" y facilita detectar dónde las cosas se degradan.

Paso 4: Establece Formato de Salida a JSON y ejecuta

Elige Formato de Salida: JSON, luego haz clic en Enviar Prompt.

Obtendrás un array JSON de vuelta. Dependiendo de tu prompt, Reedy puede devolver:

- una estructura normalizada (p. ej., plan_names: [...]), o

- una estructura tipo tabla (p. ej., un campo por plan con espacios en blanco cuando no está disponible)

Ambas son utilizables. Si estás cargando en una base de datos, la forma normalizada suele ser más fácil.

Qué esto habilita

Una vez que puedes extraer de manera confiable cada fila, los PDFs dejan de ser artefactos muertos y comienzan a ser fuentes de datos:

  • Transforma los datos extraídos en formatos de base de datos estructurados.

  • "mostrar todos los hospitales en el Condado X con el Plan Y"

  • ¿qué cambió este mes?

  • Que coincidan con cómo los usuarios realmente usan la información

El Modo Página es el puente de "un PDF que parece una tabla" a "un conjunto de datos en el que puedes confiar".

El Modo Página asume localidad de entidad. Si el significado de una fila depende en gran medida de un encabezado, una leyenda o un contexto global que no se repite cerca de la fila, tienes dos opciones comunes:

  • Para que la extracción de entidades permanezca local.

  • Una pasada a nivel de documento para globales, una pasada a nivel de fila para elementos.

El punto es hacer que la completitud y la corrección sean algo que tu pipeline puede hacer cumplir, no algo que descubres después de enviar.

Pruébalo hoy

Visita usereedy.com para comenzar con Reedy.

Iniciemos tu proyecto

Te acompañamos con soluciones a medida, desde la idea hasta la implementación.

Contactar