OCR_Pdf2Text / app.py
Diezu's picture
Create app.py
0fb58bf verified
Raw History Blame Contribute Delete
3.19 kB
import gradio as gr
import logging
import os
import json
from PIL import Image, ImageDraw
import torch
from surya.ocr import run_ocr
from surya.detection import batch_text_detection
from surya.layout import batch_layout_detection
from surya.ordering import batch_ordering
from surya.model.detection.model import load_model as load_det_model, load_processor as load_det_processor
from surya.model.recognition.model import load_model as load_rec_model
from surya.model.recognition.processor import load_processor as load_rec_processor
from surya.settings import settings
# Configuração de logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
# Carregamento de modelos
det_processor, det_model = load_det_processor(), load_det_model()
rec_model, rec_processor = load_rec_model(), load_rec_processor()
class CustomJSONEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Image.Image):
return "Image object (not serializable)"
return str(obj)
def serialize_result(result):
return json.dumps(result, cls=CustomJSONEncoder, indent=2)
def save_metadata(results):
output_file = "/mnt/data/ocr_metadata.json" # Caminho de armazenamento persistente
with open(output_file, "w") as f:
json.dump(results, f, cls=CustomJSONEncoder, indent=2)
return output_file
def ocr_workflow(images, langs):
logger.info(f"Iniciando workflow OCR para {len(images)} imagens com idiomas: {langs}")
results = []
for image_file in images:
try:
image = Image.open(image_file.name)
predictions = run_ocr([image], [langs.split(',')], det_model, det_processor, rec_model, rec_processor)
formatted_text = "\n".join([line.text for line in predictions[0].text_lines])
results.append({
"image": image_file.name,
"text": formatted_text,
"predictions": predictions[0].text_lines # Assuming text_lines is serializable
})
except Exception as e:
logger.error(f"Erro com {image_file.name}: {e}")
results.append({"image": image_file.name, "error": str(e)})
metadata_file = save_metadata(results)
return serialize_result(results), metadata_file
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown("# Análise de Documentos com Surya")
with gr.Tab("OCR"):
gr.Markdown("## Reconhecimento Óptico de Caracteres para Múltiplas Imagens")
with gr.Row():
ocr_input = gr.Files(label="Carregar Imagens ou PDFs (até 100)")
ocr_langs = gr.Textbox(label="Idiomas (separados por vírgula)", value="en")
ocr_button = gr.Button("Executar OCR")
ocr_output = gr.JSON(label="Resultados OCR")
ocr_file = gr.File(label="Baixar Metadata OCR")
# Executa a função OCR e salva o arquivo de metadata para download
ocr_button.click(ocr_workflow, inputs=[ocr_input, ocr_langs], outputs=[ocr_output, ocr_file])
if __name__ == "__main__":
logger.info("Iniciando aplicativo Gradio...")
demo.launch()