Bibloteca PyMuPDF (IV)
Acceso a pdf. Sólo tablas
Esta entrada es la complementaria de la anterior: si en aquella extraíamos sólo los párrafos no-tabla, en esta optamos por extraer sólo el texto de las tablas, primero a un archivo .txt (por mantener la mayor similitud posible con el script anterior), que cómo podrás comprobar tras la lectura del script que sigue, modifica lo que en origen fué un if not... por un if.. tal y como se expresa en el punto 5 del script.
# 0. Importamos bibliotecas
import fitz # PyMuPDF
# 1. Acceder al objeto documento
doc = fitz.open("plataformas_educativas.pdf")
# Creamos el archivo .txt de salida
with open("solo_tablas_extraidas.txt", "w", encoding="utf-8") as archivo_txt:
for pag in doc:
archivo_txt.write(f"--- Tablas de la Página {pag.number + 1} ---\n")
# 2. Localizar las áreas de las tablas
tabs = pag.find_tables()
tab_rects = [table.bbox for table in tabs]
# 3. Obtener los bloques de texto de toda la página
blocks = pag.get_text("blocks")
for b in blocks:
rect_bloque = fitz.Rect(b[:4])
# 4. Verificamos si el bloque está DENTRO de alguna tabla
dentro_de_tabla = False
for t_rect in tab_rects:
if rect_bloque.intersects(t_rect):
dentro_de_tabla = True
break
# 5. Escribir solo si SÍ está dentro de una tabla
if dentro_de_tabla and b[6] == 0:
archivo_txt.write(b[4] + "\n")
archivo_txt.write("\n" + "="*30 + "\n\n")
doc.close()
print("Proceso finalizado: Se ha extraído únicamente el contenido de las tablas.")
Pero como estamos hablando de una estructura de tabla, lo más apropiado es generar como respuesta un archivo que se ajuste a esa misma estructura, lo que aquí concretamos como archivo .scv en el script que sigue:
# 0. Importar bibliotecas necesarias
import fitz # PyMuPDF
import csv # Biblioteca para manejar archivos CSV
# 1. Acceder al objeto documento
doc = fitz.open("plataformas_educativas.pdf")
# 2. Abrir el archivo CSV para escritura
with open("tablas_extraidas.csv", "w", newline="", encoding="utf-8") as archivo_csv:
escritor = csv.writer(archivo_csv)
for pag in doc:
# 3. Localizar las tablas en la página actual
tabs = pag.find_tables()
for i, tabla in enumerate(tabs):
# Escribimos una fila vacía o un encabezado para separar tablas
escritor.writerow([f"--- TABLA {i+1} - PÁGINA {pag.number + 1} ---"])
# 4. Extraer el contenido estructurado (lista de listas)
contenido_tabla = tabla.extract()
# 5. Escribir todas las filas de la tabla en el CSV
for fila in contenido_tabla:
# Cada 'fila' ya es una lista con el texto de cada celda
escritor.writerow(fila)
# Añadir una fila vacía para separar de la siguiente tabla
escritor.writerow([])
doc.close()
print("Proceso finalizado: Las tablas se han guardado con éxito en 'tablas_extraidas.csv'")
El "éxito" de este script es localizar las tablas en el texto, lo cual es posible por su claridad formal; de hecho en una primera versión la tabla no contaba con demilitadores en toda su estructura y el script no fue capaz de identificarla como tabla. Tras una modificación de encuadre, el script funcionó perfectamente, así que aconsejo mejorar la tabla siempre que esto sea posible; en caso contrario habrá que hacer algunos ajustes en el script, lo que no siempre garantiza el éxito.
No hay comentarios:
Publicar un comentario
Comenta esta entrada