Extractor de tablas desde notas en PDFs de estados financieros
Project description
PDF Notes Extractor
Librería Python para extraer tablas desde notas en PDFs de estados financieros.
📋 Características
- ✅ Extrae tablas de notas específicas en PDFs
- ✅ Soporta múltiples motores de extracción (Camelot, Tabula)
- ✅ Exporta a Excel con múltiples hojas
- ✅ Exporta a CSV individuales
- ✅ Interfaz de línea de comandos (CLI)
- ✅ API programática para usar en scripts
- ✅ Detección automática de rangos de páginas por nota
- ✅ Limpieza y normalización de datos
🚀 Instalación
Instalación básica (solo pdfplumber)
pip install pdf-notes-extractor
Con soporte para Camelot (recomendado)
pip install pdf-notes-extractor[camelot]
Con soporte para Tabula
pip install pdf-notes-extractor[tabula]
Con todos los extractores
pip install pdf-notes-extractor[all]
Para desarrollo
git clone https://github.com/diegonov1/tableta.git
cd pdf-notes-extractor
pip install -e ".[dev]"
💻 Uso
Línea de comandos (CLI)
Extraer notas específicas a Excel
pdf-notes-extractor documento.pdf --notas 1 6 12 --excel resultado.xlsx
Extraer todas las notas
pdf-notes-extractor documento.pdf --notas all --excel resultado.xlsx
Extraer rango de notas
pdf-notes-extractor documento.pdf --notas 1-5 --excel resultado.xlsx
Exportar a CSV
pdf-notes-extractor documento.pdf --notas 1 6 --csv-dir ./tablas
Usar motor Tabula
pdf-notes-extractor documento.pdf --notas 1 6 --excel resultado.xlsx --engine tabula
Con información detallada
pdf-notes-extractor documento.pdf --notas 1 6 --excel resultado.xlsx --verbose
Guardar metadatos
pdf-notes-extractor documento.pdf --notas 1 6 --excel resultado.xlsx --metadata meta.json
API Programática
from pathlib import Path
from pdf_notes_extractor import extract_tables_from_notes
from pdf_notes_extractor.output import OutputManager
# Extraer tablas de las notas 1, 6 y 12
pdf_path = Path("estados_financieros.pdf")
note_numbers = {1, 6, 12}
results = extract_tables_from_notes(
pdf_path=pdf_path,
note_numbers=note_numbers,
engine='camelot',
verbose=True
)
# Procesar resultados
for note_num, result in results.items():
print(f"Nota {note_num}:")
print(f" - Tablas encontradas: {len(result.tables)}")
print(f" - Páginas: {result.pages_processed}")
print(f" - Tiempo: {result.extraction_time:.2f}s")
# Acceder a las tablas (pandas DataFrames)
for i, df in enumerate(result.tables, 1):
print(f" - Tabla {i}: {df.shape[0]} filas x {df.shape[1]} columnas")
# Guardar a Excel
output_manager = OutputManager()
output_manager.save_to_excel(results, Path("resultado.xlsx"))
Uso avanzado
from pdf_notes_extractor import extract_tables_from_notes
from pdf_notes_extractor.analyzer import find_note_locations, analyze_pdf_structure
from pdf_notes_extractor.extractors import CamelotExtractor
from pathlib import Path
pdf_path = Path("documento.pdf")
# Analizar estructura del PDF
pdf_info = analyze_pdf_structure(pdf_path)
print(f"Total páginas: {pdf_info['total_pages']}")
print(f"Tiene tablas: {pdf_info['has_tables']}")
# Encontrar todas las notas disponibles
locations = find_note_locations(pdf_path)
print(f"Notas encontradas: {sorted(locations.keys())}")
for note_num, location in locations.items():
print(f"Nota {note_num}: páginas {location.pages_range()}")
# Usar extractor específico
extractor = CamelotExtractor()
tables = extractor.extract(pdf_path, pages="1-5")
📖 Estructura del Proyecto
pdf-notes-extractor/
├── pdf_notes_extractor/
│ ├── __init__.py # API pública
│ ├── cli.py # Interfaz de línea de comandos
│ ├── core.py # Función principal de extracción
│ ├── models.py # Modelos de datos
│ ├── patterns.py # Patrones regex para detectar notas
│ ├── analyzer.py # Análisis de PDFs
│ ├── extractors.py # Extractores (Camelot, Tabula)
│ └── output.py # Exportación de resultados
├── tests/ # Tests unitarios
├── examples/ # Ejemplos de uso
├── pyproject.toml # Configuración del proyecto
├── setup.py # Setup alternativo
├── README.md # Este archivo
├── LICENSE # Licencia MIT
└── .gitignore # Archivos a ignorar
🔧 Requisitos
- Python >= 3.8
- pandas >= 1.3.0
- pdfplumber >= 0.7.0
- openpyxl >= 3.0.0
Opcionales
- camelot-py[cv] >= 0.11.0 (para mejor extracción de tablas)
- tabula-py >= 2.5.0 (motor alternativo)
📝 Formato de Salida
Excel
El archivo Excel generado contiene:
- Hoja "Resumen": Información general de todas las notas procesadas
- Hojas individuales: Una hoja por cada tabla encontrada (formato:
Nota_X_Tabla_Y)
CSV
Genera archivos individuales:
_resumen.csv: Resumen de la extracciónNota_X_tabla_Y.csv: Cada tabla en su propio archivoNota_X_sin_tablas.txt: Marcador para notas sin tablas
JSON (Metadatos)
{
"extraction_date": "2025-10-10T01:43:11",
"notes_processed": [1, 6, 12],
"total_tables_found": 5,
"details": {
"1": {
"pages": "10-12",
"tables_count": 2,
"extraction_time": 1.23,
"warnings": [],
"table_shapes": [[10, 5], [15, 4]]
}
}
}
🤝 Contribuir
Las contribuciones son bienvenidas. Por favor:
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
📄 Licencia
Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.
🐛 Reportar Problemas
Si encuentras algún problema, por favor abre un issue en GitHub incluyendo:
- Descripción del problema
- Pasos para reproducirlo
- Versión de Python y librerías
- Ejemplo de PDF (si es posible)
🙏 Agradecimientos
Esta librería utiliza las siguientes herramientas:
- pdfplumber - Extracción de texto y tablas
- Camelot - Extracción avanzada de tablas
- Tabula - Motor alternativo de extracción
- pandas - Manipulación de datos
📊 Estado del Proyecto
- ✅ Versión Beta (0.1.0)
- 🚧 En desarrollo activo
- 📝 Documentación en progreso
🗺️ Roadmap
- Soporte para más idiomas en detección de notas
- Interfaz gráfica (GUI)
- Exportación a más formatos (JSON, SQLite)
- Mejor detección de tablas complejas
- Caché de resultados
- Procesamiento en paralelo de múltiples notas
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tableta-0.1.1.tar.gz.
File metadata
- Download URL: tableta-0.1.1.tar.gz
- Upload date:
- Size: 21.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5e1018caa08e1fbdf5244be2c359702f0cea043837af14d11db2734fbc05cb20
|
|
| MD5 |
744079240c53e820089a8438ce1cd492
|
|
| BLAKE2b-256 |
0fabfe9bdacffc48d9f2a68649b44baedc3b179813f731d8eecaec7ab74fcf65
|
File details
Details for the file tableta-0.1.1-py3-none-any.whl.
File metadata
- Download URL: tableta-0.1.1-py3-none-any.whl
- Upload date:
- Size: 16.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a69f447e46baf9a36c069af88f5d8f7f9a0540c0865a3707662eafd9472ee347
|
|
| MD5 |
b2cce0dcfdbb974f927fcb45d7d4ea2a
|
|
| BLAKE2b-256 |
8a84299662e4f724b314ac6e7fea27811b6c85fbaf9a57ffdb7f19f96ea33d2d
|