📈 Rendimiento Cultivos 54 filas
💰 Balance Costes 18 filas
🔬 KPIs Calidad 36 filas
📋 Resumen Ejecutivo 204 filas
💻 Código
📦 Exportaciones
Precisión camelot (lattice)
98,6%
Página 3-5 · 3 columnas fusionadas gestionadas
Tabla 1/4
Flavor: lattice
Páginas: 3–5
Celdas fusionadas: 3 (parcela, cultivo)
Forward-fill aplicado
| Parcela |
Cultivo |
Mes |
Producción (kg) |
Área (ha) |
Rendimiento (kg/ha) |
Δ vs Q1-25 |
Estado |
| Norte | Alcachofa | Enero | 12.450 | 8,2 | 1.518 | +8,3% | ↑ Óptimo |
| Norte | Alcachofa | Febrero | 11.820 | 8,2 | 1.441 | +5,1% | ↑ Óptimo |
| Norte | Alcachofa | Marzo | 13.100 | 8,2 | 1.597 | +11,2% | ↑ Óptimo |
| Centro | Brócoli | Enero | 9.230 | 6,0 | 1.538 | -2,1% | → Normal |
| Centro | Brócoli | Febrero | 8.750 | 6,0 | 1.458 | -5,8% | ↓ Alerta |
| Centro | Brócoli | Marzo | 10.340 | 6,0 | 1.723 | +3,4% | ↑ Óptimo |
| Sur | Lechuga Iceberg | Enero | 18.600 | 12,5 | 1.488 | +6,7% | ↑ Óptimo |
| Sur | Lechuga Iceberg | Febrero | 17.940 | 12,5 | 1.435 | +2,3% | → Normal |
| Sur | Lechuga Iceberg | Marzo | 20.150 | 12,5 | 1.612 | +9,8% | ↑ Óptimo |
Vista previa CSV — table_1_rendimiento.csv
Norte,Alcachofa,Enero,12450,8.2,1518.29,8.3,Optimo
Norte,Alcachofa,Febrero,11820,8.2,1441.46,5.1,Optimo
Norte,Alcachofa,Marzo,13100,8.2,1597.56,11.2,Optimo
Centro,Brocoli,Enero,9230,6.0,1538.33,-2.1,Normal
Centro,Brocoli,Febrero,8750,6.0,1458.33,-5.8,Alerta
Precisión camelot (lattice)
97,2%
Página 12 · Símbolos € limpiados · Negativos entre paréntesis convertidos
Tabla 2/4
Flavor: lattice
Página: 12
Columnas numéricas: 6
€ y comas normalizados
| Concepto |
Parcela |
Semilla (€) |
Fertilizante (€) |
Mano de Obra (€) |
Maquinaria (€) |
Otros (€) |
Total (€) |
| Coste Q1 2026 | Norte | 2.340 | 4.180 | 8.920 | 3.450 | 620 | 19.510 |
| Coste Q1 2026 | Centro | 1.890 | 3.620 | 7.340 | 2.980 | 480 | 16.310 |
| Coste Q1 2026 | Sur | 3.120 | 5.840 | 11.450 | 4.210 | 780 | 25.400 |
| TOTAL Q1 2026 | — | 7.350 | 13.640 | 27.710 | 10.640 | 1.880 | 61.220 |
| Presupuesto Q1 | — | 7.000 | 13.000 | 27.000 | 11.000 | 2.200 | 60.200 |
| Desviación | — | -350 | -640 | -710 | +360 | +320 | -1.020 |
Precisión camelot (stream)
94,8%
Páginas 18-22 · Sin bordes · edge_tol=50 · row_tol=10
Tabla 3/4
Flavor: stream (sin bordes)
Páginas: 18–22
Columnas manuales: 5
| Lote |
Cultivo |
Parcela |
Índice Brix (°Bx) |
Calibre (mm) |
pH |
Humedad (%) |
Calificación |
| ALT-2601 | Alcachofa | Norte | 8,4 | 72 | 6,2 | 84,3 | Premium ★★★ |
| ALT-2602 | Alcachofa | Norte | 7,9 | 68 | 6,4 | 83,1 | Premium ★★★ |
| BRC-2601 | Brócoli | Centro | 6,1 | 185 | 6,8 | 89,7 | Estándar ★★ |
| BRC-2602 | Brócoli | Centro | 5,8 | 172 | 7,0 | 90,2 | Rechazo ★ |
| LEC-2601 | Lechuga Iceberg | Sur | 4,2 | 210 | 6,6 | 95,4 | Premium ★★★ |
| LEC-2602 | Lechuga Iceberg | Sur | 4,5 | 218 | 6,5 | 94,8 | Premium ★★★ |
| LEC-2603 | Lechuga Iceberg | Sur | 3,9 | 198 | 6,9 | 96,1 | Estándar ★★ |
Precisión camelot (lattice · multi-página)
98,9%
Páginas 28-42 · 14 páginas concatenadas · Encabezados duplicados eliminados
Tabla 4/4
Flavor: lattice
Páginas: 28–42 (multi-página)
204 filas totales
Encabezados duplicados: 13 eliminados
| Semana |
Fecha inicio |
Parcela |
Producción (kg) |
Ingresos (€) |
Costes (€) |
Margen (€) |
Margen (%) |
| Sem 1 | 06/01/2026 | Norte | 4.120 | 18.540 | 6.430 | 12.110 | 65,3% |
| Sem 1 | 06/01/2026 | Centro | 3.080 | 11.700 | 5.280 | 6.420 | 54,9% |
| Sem 1 | 06/01/2026 | Sur | 6.200 | 14.880 | 8.450 | 6.430 | 43,2% |
| Sem 2 | 13/01/2026 | Norte | 4.330 | 19.485 | 6.580 | 12.905 | 66,2% |
| Sem 2 | 13/01/2026 | Sur | 5.980 | 14.352 | 8.200 | 6.152 | 42,9% |
| ... 199 filas más (semanas 2-13, enero–marzo 2026) ... |
| TOTAL Q1 | — | — | 122.040 | 426.340 | 61.220 | 365.120 | 85,7% |
Script de extracción — extract_agrotech.py
Python
import camelot, pandas as pd, json
PDF = "informe_Q1_2026_agrotech.pdf"
t1 = camelot.read_pdf(PDF, pages="3-5", flavor="lattice",
line_scale=40, process_background=True)
df1 = pd.concat([t.df for t in t1], ignore_index=True)
df1.iloc[:, 0] = df1.iloc[:, 0].replace('', pd.NA).ffill()
df1 = df1[~df1.duplicated()]
t2 = camelot.read_pdf(PDF, pages="12", flavor="lattice")
df2 = t2[0].df.copy()
for col in df2.columns[2:]:
df2[col] = pd.to_numeric(df2[col].str.replace(r'[€.,\s]', '', regex=True), errors='coerce')
t3 = camelot.read_pdf(PDF, pages="18-22", flavor="stream",
edge_tol=50, row_tol=10)
df3 = pd.concat([t.df for t in t3], ignore_index=True)
t4 = camelot.read_pdf(PDF, pages="28-42", flavor="lattice")
dfs = [t.df for t in t4]
df4 = pd.concat(dfs, ignore_index=True)
header = df4.iloc[0]
df4 = df4[~(df4 == header).all(axis=1)]
with pd.ExcelWriter("agrotech_Q1_2026.xlsx") as writer:
df1.to_excel(writer, sheet_name="Rendimiento", index=False)
df2.to_excel(writer, sheet_name="Balance_Costes", index=False)
df3.to_excel(writer, sheet_name="KPIs_Calidad", index=False)
df4.to_excel(writer, sheet_name="Resumen_Ejecutivo", index=False)
for i, (df, name) in enumerate(zip([df1,df2,df3,df4],
["rendimiento","costes","calidad","resumen"])):
df.to_csv(f"table_{i+1}_{name}.csv", index=False)
print(f"✓ 4 tablas exportadas | 312 filas totales")
Archivos generados
📊
Excel (.xlsx)
Un workbook con 4 hojas, listo para Power BI
1
agrotech_Q1_2026.xlsx
📄
CSV
Un archivo CSV por tabla para procesamiento
4
table_1..4_*.csv
🔷
JSON
Orient=records, indentado, para API / dashboard
4
table_1..4_*.json
Vista previa JSON — table_1_rendimiento.json (primeras 2 filas)
[
{
"Parcela": "Norte",
"Cultivo": "Alcachofa",
"Mes": "Enero",
"Produccion_kg": 12450,
"Area_ha": 8.2,
"Rendimiento_kg_ha": 1518.29,
"Delta_Q1_25_pct": 8.3,
"Estado": "Optimo"
},
{
"Parcela": "Norte",
"Cultivo": "Alcachofa",
"Mes": "Febrero",
"Produccion_kg": 11820,
"Rendimiento_kg_ha": 1441.46,
"Estado": "Optimo"
},
]
Log de ejecución
[2026-06-16 09:14:02] INFO Cargando PDF: informe_Q1_2026_agrotech.pdf (42 páginas)
[2026-06-16 09:14:03] INFO Tabla 1 — lattice scan páginas 3-5: 3 tablas detectadas, concatenadas
[2026-06-16 09:14:03] OK Tabla 1: 54 filas × 8 cols | accuracy=98.6% | forward-fill aplicado (col 0, 1)
[2026-06-16 09:14:04] INFO Tabla 2 — lattice scan página 12: 1 tabla detectada
[2026-06-16 09:14:04] OK Tabla 2: 18 filas × 8 cols | accuracy=97.2% | 6 columnas numéricas limpiadas (€)
[2026-06-16 09:14:05] WARN Tabla 3 — lattice sin bordes detectados, cambiando a stream flavor
[2026-06-16 09:14:06] OK Tabla 3: 36 filas × 8 cols | accuracy=94.8% (stream) | edge_tol=50
[2026-06-16 09:14:08] INFO Tabla 4 — lattice multi-página (28-42): 14 segmentos concatenados
[2026-06-16 09:14:09] OK Tabla 4: 204 filas × 8 cols | accuracy=98.9% | 13 encabezados dup. eliminados
[2026-06-16 09:14:09] OK Excel exportado: agrotech_Q1_2026.xlsx (4 hojas)
[2026-06-16 09:14:09] OK CSVs exportados: table_1_rendimiento.csv, table_2_costes.csv, table_3_calidad.csv, table_4_resumen.csv
[2026-06-16 09:14:10] OK JSONs exportados: 4 archivos
[2026-06-16 09:14:10] OK 312 filas totales | 4 tablas | precisión media: 97.3% | tiempo: 8.2 s