File size: 4,236 Bytes
568ea9a
 
bb4c496
 
 
 
 
 
 
 
 
 
 
 
 
 
8d12900
bc456e4
bb4c496
 
 
 
 
 
 
c60d26e
bb4c496
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
568ea9a
29cd488
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
568ea9a
 
 
 
 
 
9ed2b36
23d75e8
04f18c0
9ed2b36
04f18c0
bb4c496
04f18c0
 
 
 
 
 
 
 
 
 
 
 
c5be12e
04f18c0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
568ea9a
 
 
 
bb4c496
3b8e1b8
568ea9a
3b8e1b8
568ea9a
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import gradio as gr
from setfit import SetFitModel
# Import libraries
import PyPDF2
import openpyxl
import os
import glob
import re
import itertools
import platform
from tempfile import TemporaryDirectory
from pathlib import Path
import pytesseract
from pdf2image import convert_from_path
from PIL import Image

#print('HOLA:', os.walk('../'))

def ocrtotext(filename):
    # Almacena todas las páginas del PDF en una variable
    image_file_list = []  # Lista para almacenar los nombres de los archivos de imagen
    PDF_file = filename  # Nombre del archivo PDF
    text_file = (f'{filename}.txt')  # Nombre del archivo de texto de salida

    # Parte #1: Convirtiendo el PDF a imágenes
    pdf_pages = convert_from_path(PDF_file, 300)
    # Lee el archivo PDF a 300 DPI

    # Itera a través de todas las páginas almacenadas arriba
    for page_enumeration, page in enumerate(pdf_pages, start=1):
        # Crea un nombre de archivo para almacenar la imagen
        filename = f"page_{page_enumeration:03}.jpg"

        # Guarda la imagen de la página en el sistema
        page.save(filename, "JPEG")
        image_file_list.append(filename)

    # Parte #2: Reconociendo texto desde las imágenes usando OCR
    output = ''  # Variable para almacenar el texto reconocido

    # Abre el archivo en modo de apendizaje para agregar contenido de todas las imágenes al mismo archivo
    with open(text_file, "a") as output_file:

        # Itera desde 1 hasta el número total de páginas
        for image_file in image_file_list:

            # Reconoce el texto en la imagen usando pytesseract
            #text = str(((pytesseract.image_to_string(Image.open(image_file), lang="spa"))))
            text = str(((pytesseract.image_to_string(Image.open(image_file)))))

            # Elimina los guiones al final de las líneas
            text = text.replace("-\n", "")

            # Agrega el texto reconocido a la variable de salida
            output += text

        # Escribe el texto reconocido en el archivo de salida
        output_file.write(output)
        return output

def cortar_en_bloques(texto, longitud_bloque):
    palabras = texto.split()
    bloques = []
    bloque_actual = []

    for palabra in palabras:
        bloque_actual.append(palabra)

        if len(bloque_actual) == longitud_bloque:
            bloques.append(" ".join(bloque_actual))
            bloque_actual = []

    # Si queda un bloque parcial al final, agregarlo
    if bloque_actual:
        bloques.append(" ".join(bloque_actual))

    return bloques

# Cargar el modelo
model = SetFitModel.from_pretrained("desarrolloasesoreslocales/SetFitPruebaRecorte")

# Mapear las etiquetas

# Definir la función de predicción
def predict(file):
    
  recorte_general = ""
  ocr_text = ocrtotext(file.name)
  # Crear chunks
  chunks = cortar_en_bloques(ocr_text, 150)
  first = -1
  margin = int(len(chunks) * 0.25)
  chunks_removable = chunks[:margin] + chunks[-margin:]

  for i in range(len(chunks)):
    print('Recortando -', round((i/len(chunks))*100), '%')
    if chunks[i] not in chunks_removable or model.predict([chunks[i]]).item() == 1:
      if first == -1:
        first = i
      recorte_general += chunks[i] + " "

  if first > 0:
    recorte_general = chunks[first-1] + recorte_general
  print(100, '%')

  recorte_final = ""

  # Definir tamñano de fragmentos de texto
  # text_splitter2 = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=0, length_function=len)
  # Crear chunks
  chunks2 = cortar_en_bloques(recorte_general, 80)
  margin_s = int(len(chunks2) * 0.1)
  margin_e = int(len(chunks2) * 0.1)
  # if margin_s > 1:
  chunks_removable2 = chunks2[:margin_s] + chunks2[-margin_e:]
  # chunks_removable2 = chunks2[-margin_e:]

  for i in range(len(chunks2)):
    print('Recortando -', round((i/len(chunks2))*100), '%')
    if chunks2[i] not in chunks_removable2 or model.predict([chunks2[i]]).item() == 1:
      recorte_final += chunks2[i] + " "
  print(100, '%')
  return recorte_final

# Crear una interfaz Gradio
iface = gr.Interface(
    fn=predict, 
    inputs=gr.inputs.File(), 
    outputs=gr.Textbox(), 
    live=False,
    title="Recortador de Texto"
)

# Iniciar la interfaz Gradio
iface.launch()