Documind convierte PDFs desordenados y escaneos en JSON limpio
Cualquiera que haya escrito un analizador de extractos bancarios o facturas conoce este dolor. Tomas pdf-parse u OCR clásico, lo ejecutas en un documento real, y obtienes un caos de líneas donde las columnas de las tablas están desalineadas, las fechas se mezclan con números de contrato, y los totales se separan de los nombres de los elementos de línea.
Con la llegada de los modelos de lenguaje multimodales, el análisis de documentos se ha vuelto notablemente más fácil. Pero combinar la conversión de página a imagen, el envío al modelo, la validación de estructura y el ensamblaje final de JSON típicamente requiere cientos de líneas de código repetitivo.
Hace poco descubrí Documind en GitHub, un proyecto del equipo DocumindHQ. Es una pequeña biblioteca Node.js que maneja todo el trabajo pesado de extraer datos estructurados de documentos no estructurados.
Qué puede hacer la biblioteca
Bajo el capó, Documind combina utilidades de renderizado de páginas del sistema y modelos de visión. El proyecto surgió de la popular herramienta Zerox pero evolucionó hasta convertirse en una plataforma independiente para trabajar con esquemas de datos.
La biblioteca resuelve cuatro tareas específicas:
- Lee varios formatos: PDF, DOCX, HTML, TXT, PNG y JPG.
- Acepta tu esquema de campos y devuelve JSON predecible poblado con datos del documento.
- Funciona tanto con la API en la nube de OpenAI como con modelos locales a través de Llava o Llama 3.2 Vision.
- Convierte documentos complejos de varias páginas en Markdown limpio, preservando las estructuras de tablas y listas.
Si no tienes tiempo de definir manualmente un esquema de campos, Documind puede generar uno automáticamente basándose en el contenido del primer documento.
Inicio rápido y dependencias del sistema
La biblioteca está escrita en JavaScript para Node.js versión 18 y superior. Dado que renderizar páginas PDF a imágenes requiere herramientas de bajo nivel, necesitas instalar Ghostscript y GraphicsMagick en tu sistema antes de instalar el paquete npm.
En macOS, esto se hace a través de Homebrew:
brew install ghostscript graphicsmagick
En Ubuntu o Debian:
sudo apt-get update
sudo apt-get install -y ghostscript graphicsmagick
Después de eso, instala el paquete en sí:
npm install documind
Para trabajar con OpenAI, crea un archivo .env en la raíz del proyecto y pasa la clave:
OPENAI_API_KEY=your_openai_api_key
Cómo definir un esquema de datos
La idea central detrás de Documind es que defines la forma del objeto de salida a través de un array de campos. Cada campo tiene un nombre, tipo (string, number, array, object, boolean, enum), y una descripción de texto que sirve como pista para la red neuronal.
Aquí hay un ejemplo de esquema para analizar un extracto bancario con una tabla de transacciones anidada:
const schema = [
{
name: "accountNumber",
type: "string",
description: "The account number of the bank statement."
},
{
name: "openingBalance",
type: "number",
description: "The opening balance of the account."
},
{
name: "transactions",
type: "array",
description: "List of transactions in the account.",
children: [
{
name: "date",
type: "string",
description: "Transaction date."
},
{
name: "creditAmount",
type: "number",
description: "Credit Amount of the transaction."
},
{
name: "debitAmount",
type: "number",
description: "Debit Amount of the transaction."
},
{
name: "description",
type: "string",
description: "Transaction description."
}
]
},
{
name: "closingBalance",
type: "number",
description: "The closing balance of the account."
}
];
Ahora pasa el esquema y la URL del archivo a la función extract:
import { extract } from 'documind';
async function main() {
const result = await extract({
file: 'https://example.com/bank_statement.pdf',
schema
});
console.log(JSON.stringify(result, null, 2));
}
main();
El resultado es un objeto listo para usar sin necesidad de analizar texto sin formato con regex:
{
"success": true,
"pages": 1,
"data": {
"accountNumber": "100002345",
"openingBalance": 3200,
"transactions": [
{
"date": "2021-05-12",
"creditAmount": null,
"debitAmount": 100,
"description": "transfer to Tom"
},
{
"date": "2021-05-12",
"creditAmount": 50,
"debitAmount": null,
"description": "For lunch the other day"
}
],
"closingBalance": 2420
},
"fileName": "bank_statement.pdf"
}
Plantillas listas para usar
Para documentos típicos como recibos, facturas o estados de cuenta estándar, no necesitas escribir un esquema desde cero. La biblioteca incluye plantillas integradas.
Puedes verificar la lista de presets disponibles así:
import { templates } from 'documind';
console.log(templates.list());
E invocar el análisis por plantilla es aún más simple:
import { extract } from 'documind';
const result = await extract({
file: 'https://example.com/bank_statement.pdf',
template: 'bank_statement'
});
Modelos locales y seguridad de datos
Los documentos a menudo contienen datos personales, registros médicos o información financiera confidencial que no se puede enviar a APIs externas en la nube.
Los desarrolladores de Documind incorporaron soporte para modelos de visión locales. Puedes desplegar Llama 3.2 Vision o Llava en tu propio servidor GPU y dirigir las solicitudes allí. El proceso de análisis permanece igual, pero los datos nunca abandonan tu red privada.
Qué tener en cuenta
Antes de desplegar el proyecto en producción, hay un par de matices a considerar:
- Licencia AGPL v3.0. Si planeas incrustar Documind directamente en un backend comercial cerrado, los estrictos requisitos de AGPL pueden convertirse en un problema legal. En ese caso, tiene más sentido aislar el procesamiento de documentos en un microservicio separado.
- Binarios del sistema. Ghostscript y GraphicsMagick complican el despliegue en entornos sin servidor como AWS Lambda o Vercel Functions si no estás construyendo una imagen Docker personalizada.
A quién le será útil
Documind es ideal para equipos que construyen pipelines de procesamiento de documentos entrantes, automatizan servicios fintech, o preparan bases de datos de documentos no estructurados para subir a almacenes de vectores (RAG).
La herramienta elimina la necesidad de escribir analizadores frágiles basados en regex y te da un resultado tipado en solo unas pocas líneas de código. Si necesitas automatizar rápidamente la entrada manual de documentos, este repositorio definitivamente vale la pena revisarlo.
Proyectos relacionados