File size: 2,710 Bytes
225a4a4
5a090b0
 
 
 
225a4a4
 
 
 
 
 
 
 
 
 
 
5a090b0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import gradio as gr
import requests
import mimetypes

# Optional: load environment variables from a .env file (install python-dotenv if needed)
try:
    from dotenv import load_dotenv
    load_dotenv()
except ImportError:
    pass  # dotenv not installed, ignore

# Get the API URL from environment variable, provide a fallback or raise error if not set
API_URL = os.environ.get("API_URL")
if not API_URL:
    raise ValueError("API_URL environment variable not set. Please set it before running the script.")

def ocr_from_paths(file_paths, query):
    results = []
    if isinstance(file_paths, str):
        file_paths = [file_paths]
    
    for path in file_paths:
        filename = path.split("/")[-1]
        mime_type, _ = mimetypes.guess_type(path)
        if not mime_type:
            results.append(f"❌ {filename}: Unsupported file type")
            continue
            
        with open(path, "rb") as f:
            files_param = {"file": (filename, f, mime_type)}
            data_param = {"query": query or "describe the image"}  # default query if empty
            
            try:
                response = requests.post(
                    API_URL,
                    files=files_param,
                    data=data_param,
                    headers={"accept": "application/json"}  # do NOT set Content-Type here
                )
                if response.status_code == 200:
                    resp_json = response.json()
                    extracted_text = resp_json.get("result") or resp_json.get("text") or str(resp_json)
                    results.append(f"βœ… {filename}:\n{extracted_text}")
                else:
                    results.append(f"❌ {filename}: API Error ({response.status_code})")
            except Exception as e:
                results.append(f"❌ {filename}: {str(e)}")
    
    return "\n\n".join(results)

with gr.Blocks() as demo:
    gr.Markdown("## Browse & OCR Extract PDFs/Images (Batch)")
    with gr.Row():
        file_input = gr.File(
            label="Upload Files",
            file_types=[".pdf", ".png", ".jpg", ".jpeg", ".webp"],
            file_count="multiple"
        )
        query_input = gr.Textbox(
            label="Query (optional)",
            placeholder="Enter a query string for the API"
        )
    
    output_text = gr.Textbox(
        label="Extracted Text Results",
        interactive=False,
        lines=15,
        placeholder="OCR results will appear here..."
    )
    
    submit_btn = gr.Button("Extract Text")
    submit_btn.click(
        ocr_from_paths,
        inputs=[file_input, query_input],
        outputs=output_text
    )

if __name__ == "__main__":
    demo.launch()