eberhenriquez94 commited on
Commit
0374a9d
·
verified ·
1 Parent(s): 53edec4
Files changed (1) hide show
  1. app.py +17 -36
app.py CHANGED
@@ -1,23 +1,15 @@
1
  import gradio as gr
2
  import subprocess
3
  import logging
4
- import tempfile
5
  import os
 
6
  import shlex
7
- from gradio_pdf import PDF
8
 
9
  # Configuración de logs
10
  logger = logging.getLogger(__name__)
11
  logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
12
 
13
- def verificar_comando(comando):
14
- """Verifica si un comando está disponible en el sistema."""
15
- try:
16
- subprocess.run(f"which {comando}", shell=True, check=True, capture_output=True)
17
- logger.info(f"Comando encontrado: {comando}")
18
- except subprocess.CalledProcessError:
19
- raise gr.Error(f"El comando '{comando}' no está disponible. Por favor, instálalo antes de continuar.")
20
-
21
  def ejecutar_comando(comando):
22
  """Ejecuta un comando de shell y maneja errores."""
23
  try:
@@ -31,19 +23,16 @@ def ejecutar_comando(comando):
31
 
32
  def reparar_pdf(input_pdf, output_pdf):
33
  """Repara un PDF usando qpdf."""
34
- verificar_comando("qpdf")
35
  comando = f"qpdf --linearize {shlex.quote(input_pdf)} {shlex.quote(output_pdf)}"
36
  ejecutar_comando(comando)
37
 
38
  def simplificar_pdf(input_pdf, output_pdf):
39
  """Simplifica un PDF usando Ghostscript."""
40
- verificar_comando("gs")
41
  comando = f"gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dBATCH -sOutputFile={shlex.quote(output_pdf)} {shlex.quote(input_pdf)}"
42
  ejecutar_comando(comando)
43
 
44
  def crear_pdf_con_texto_incrustado(pdf_original, archivo_salida, idioma="spa"):
45
  """Procesa un PDF con OCR usando OCRmyPDF."""
46
- verificar_comando("ocrmypdf")
47
  comando = f"ocrmypdf -l {idioma} --force-ocr --deskew --output-type pdf {shlex.quote(pdf_original)} {shlex.quote(archivo_salida)}"
48
  ejecutar_comando(comando)
49
 
@@ -52,14 +41,13 @@ def flujo_principal(pdf_file, idioma="spa"):
52
  if not pdf_file:
53
  raise gr.Error("No se subió ningún archivo.")
54
 
55
- input_pdf = pdf_file
56
  reparado_pdf = tempfile.NamedTemporaryFile(delete=False, suffix=".pdf").name
57
  simplificado_pdf = tempfile.NamedTemporaryFile(delete=False, suffix=".pdf").name
58
  output_pdf = tempfile.NamedTemporaryFile(delete=False, suffix=".pdf").name
59
 
60
  try:
61
  # Reparar el PDF
62
- reparar_pdf(input_pdf, reparado_pdf)
63
 
64
  # Simplificar el PDF
65
  simplificar_pdf(reparado_pdf, simplificado_pdf)
@@ -67,43 +55,36 @@ def flujo_principal(pdf_file, idioma="spa"):
67
  # Procesar con OCR
68
  crear_pdf_con_texto_incrustado(simplificado_pdf, output_pdf, idioma)
69
 
70
- return output_pdf
71
- except gr.Error as e:
72
- logger.error("Error durante el procesamiento del PDF.")
73
- raise e
 
74
  finally:
75
- # Limpiar archivos temporales
76
  for temp_file in [reparado_pdf, simplificado_pdf]:
77
  if os.path.exists(temp_file):
78
  os.remove(temp_file)
79
 
80
- # Interfaz Gradio mejorada
 
81
  with gr.Blocks() as interfaz:
82
- gr.Markdown("## Visualizador de PDFs con OCR y gradio_pdf")
83
-
84
- gr.Markdown("""
85
- ### Funcionalidades que tendrás con `gradio_pdf`:
86
- - **Cambiar páginas**: Sí, puedes navegar entre las páginas del PDF.
87
- - **Visualizar texto OCR**: Si el OCR se aplicó correctamente, podrás ver el texto procesado en el PDF.
88
- - **Seleccionar y copiar texto**:
89
- - Depende del visor PDF que se use en `gradio_pdf`.
90
- - Si el PDF tiene texto incrustado por el OCR (lo cual hace `ocrmypdf`), entonces será posible copiar el texto si el visor lo soporta.
91
- - **Interactividad básica**: Zoom básico y navegación.
92
- """)
93
 
94
  with gr.Row():
95
- archivo_pdf = PDF(label="Sube tu archivo PDF")
96
  idioma_ocr = gr.Dropdown(["spa", "eng", "fra", "deu"], label="Idioma OCR", value="spa")
97
  boton_procesar = gr.Button("Procesar OCR")
98
 
99
  with gr.Row():
100
- pdf_procesado = PDF(label="PDF Procesado", height=800, interactive=True)
 
101
 
102
  boton_procesar.click(
103
  fn=flujo_principal,
104
  inputs=[archivo_pdf, idioma_ocr],
105
- outputs=[pdf_procesado]
106
  )
107
 
108
  if __name__ == "__main__":
109
- interfaz.launch()
 
1
  import gradio as gr
2
  import subprocess
3
  import logging
 
4
  import os
5
+ import tempfile
6
  import shlex
7
+ from gradio_pdf import PDFViewer
8
 
9
  # Configuración de logs
10
  logger = logging.getLogger(__name__)
11
  logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
12
 
 
 
 
 
 
 
 
 
13
  def ejecutar_comando(comando):
14
  """Ejecuta un comando de shell y maneja errores."""
15
  try:
 
23
 
24
  def reparar_pdf(input_pdf, output_pdf):
25
  """Repara un PDF usando qpdf."""
 
26
  comando = f"qpdf --linearize {shlex.quote(input_pdf)} {shlex.quote(output_pdf)}"
27
  ejecutar_comando(comando)
28
 
29
  def simplificar_pdf(input_pdf, output_pdf):
30
  """Simplifica un PDF usando Ghostscript."""
 
31
  comando = f"gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dBATCH -sOutputFile={shlex.quote(output_pdf)} {shlex.quote(input_pdf)}"
32
  ejecutar_comando(comando)
33
 
34
  def crear_pdf_con_texto_incrustado(pdf_original, archivo_salida, idioma="spa"):
35
  """Procesa un PDF con OCR usando OCRmyPDF."""
 
36
  comando = f"ocrmypdf -l {idioma} --force-ocr --deskew --output-type pdf {shlex.quote(pdf_original)} {shlex.quote(archivo_salida)}"
37
  ejecutar_comando(comando)
38
 
 
41
  if not pdf_file:
42
  raise gr.Error("No se subió ningún archivo.")
43
 
 
44
  reparado_pdf = tempfile.NamedTemporaryFile(delete=False, suffix=".pdf").name
45
  simplificado_pdf = tempfile.NamedTemporaryFile(delete=False, suffix=".pdf").name
46
  output_pdf = tempfile.NamedTemporaryFile(delete=False, suffix=".pdf").name
47
 
48
  try:
49
  # Reparar el PDF
50
+ reparar_pdf(pdf_file, reparado_pdf)
51
 
52
  # Simplificar el PDF
53
  simplificar_pdf(reparado_pdf, simplificado_pdf)
 
55
  # Procesar con OCR
56
  crear_pdf_con_texto_incrustado(simplificado_pdf, output_pdf, idioma)
57
 
58
+ return output_pdf, output_pdf # Devolver dos veces para visor y descarga
59
+
60
+ except Exception as e:
61
+ logger.error(f"Error durante el procesamiento del PDF: {str(e)}")
62
+ raise gr.Error(f"Error al procesar el PDF: {str(e)}")
63
  finally:
64
+ # Limpiar archivos temporales no necesarios
65
  for temp_file in [reparado_pdf, simplificado_pdf]:
66
  if os.path.exists(temp_file):
67
  os.remove(temp_file)
68
 
69
+
70
+ # Interfaz Gradio
71
  with gr.Blocks() as interfaz:
72
+ gr.Markdown("## Procesador de PDFs con OCR")
 
 
 
 
 
 
 
 
 
 
73
 
74
  with gr.Row():
75
+ archivo_pdf = gr.File(label="Sube tu archivo PDF")
76
  idioma_ocr = gr.Dropdown(["spa", "eng", "fra", "deu"], label="Idioma OCR", value="spa")
77
  boton_procesar = gr.Button("Procesar OCR")
78
 
79
  with gr.Row():
80
+ pdf_vista = PDFViewer(label="Visor PDF")
81
+ pdf_descarga = gr.File(label="Descargar PDF procesado", visible=False)
82
 
83
  boton_procesar.click(
84
  fn=flujo_principal,
85
  inputs=[archivo_pdf, idioma_ocr],
86
+ outputs=[pdf_vista, pdf_descarga],
87
  )
88
 
89
  if __name__ == "__main__":
90
+ interfaz.launch()