domingo, 19 de abril de 2026

DATOS. Archivos PDF

Bibloteca PyMuPDF (III)

Acceso a pdf. Sólo textos

Aunque PyMuPDF está pensado para extraer (entre otras cosas) el texto del documento con independencia de en qué presentación se encuentre (como vimos en la entrada anterior), cuando en el documento se diferencian bloques de texto (párrafos) y tablas, es posible que deseemos diferenciar unos textos de otros. En este caso vamos a crear un script que da respuesta a esta necesidad.



#0. Importar la biblioteca

import fitz  # PyMuPDF

# 1 Acceder al objeto documento
doc = fitz.open("plataformas_educativas.pdf")

# Generar documento de salida (.txt)
with open("plataformas_txt2.txt", "w", encoding="utf-8") as archivo_txt:
    for pag in doc:
        archivo_txt.write(f"--- Página {pag.number + 1} ---\n")
        
# 1. Localizar las tablas en la página actual
        tabs = pag.find_tables()                     # Busca las tablas presentes en el texto
        tab_rects = [table.bbox for table in tabs]   # Obtenemos los rectángulos que delimitan las tablas

# 2. Obtener los bloques de texto (con independencia de su ubicación)
        blocks = pag.get_text("blocks")              # Cada 'bloque' devuelve (x0, y0, x1, y1, "texto", block_no, block_type)
        for b in blocks:
            rect_bloque = fitz.Rect(b[:4])           # Coordenadas del bloque de texto
            
# 3. Verificar si el bloque está dentro de alguna tabla
            dentro_de_tabla = False                  # Declara la variable para controlar presencia de texto
            for t_rect in tab_rects:
                if rect_bloque.intersects(t_rect):   # Si el bloque de texto toca el área de la tabla...
                    dentro_de_tabla = True           # Cambia el contenido de la variable y...
                    break                            # Se sale del ciclo (y no se "captura" el bloque de texto)
            
# 4. Escribir solo si no es parte de una tabla y es tipo texto (0)
            if not dentro_de_tabla and b[6] == 0:    # Opción contraria a la precedente (if not)
                archivo_txt.write(b[4] + "\n")       # Entonces sí se "capttura" el bloque de texto y se escribe en el .txt (almacen)

        archivo_txt.write("\n\n")                    # Añade salto de línea para diferenciar bloques de texto en el .txt

doc.close()                                          #Cerrar objeto Document

print("Proceso finalizado: Párrafos extraídos omitiendo áreas de tablas.")


Lee detenidamente el script y sus comentarios. Advertirás que la base de su funcionamiento es la identificación de los sectores de texto y de las estructuras de las tablas, ejecutando un proceso opcional, en función del objetivo: capturar (al .txt de saldida) los bloques de texto que no están asociados a la/s tabla/s.

No hay comentarios:

Publicar un comentario

Comenta esta entrada