File size: 2,806 Bytes
4ed6029
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import easyocr
from pdf2image import convert_from_path
import numpy as np
from PIL import Image
import os

# โหลดโมเดล EasyOCR เตรียมไว้เลย (โหลดครั้งเดียวตอน Start Space จะได้ทำงานเร็วขึ้น)
print("กำลังโหลดโมเดล EasyOCR...")
reader = easyocr.Reader(['th', 'en'])

def process_file(file_path):
    if file_path is None:
        return "กรุณาอัปโหลดไฟล์"
        
    # เช็กนามสกุลไฟล์
    ext = os.path.splitext(file_path)[1].lower()
    extracted_text = []

    try:
        if ext == '.pdf':
            # กรณีเป็นไฟล์ PDF แปลงเป็นรูปก่อน
            # แนะนำให้ใช้ dpi=200 เพื่อไม่ให้กิน RAM ของ Hugging Face Free Tier มากเกินไป
            pages = convert_from_path(file_path, dpi=200)
            
            for i, page in enumerate(pages):
                extracted_text.append(f"--- หน้าที่ {i+1} ---")
                # แปลงเป็น Numpy array ให้ EasyOCR อ่าน
                img_np = np.array(page)
                result = reader.readtext(img_np, detail=0)
                extracted_text.extend(result)
                extracted_text.append("\n")
                
        elif ext in ['.png', '.jpg', '.jpeg']:
            # กรณีเป็นรูปภาพทั่วไป
            result = reader.readtext(file_path, detail=0)
            extracted_text.extend(result)
            
        else:
            return "รองรับเฉพาะไฟล์ .pdf, .png, .jpg, .jpeg เท่านั้นครับ"

        # รวมข้อความทั้งหมดคั่นด้วยการขึ้นบรรทัดใหม่
        return "\n".join(extracted_text)

    except Exception as e:
        return f"เกิดข้อผิดพลาดในการอ่านไฟล์: {str(e)}"

# สร้างหน้าเว็บ UI ด้วย Gradio
interface = gr.Interface(
    fn=process_file,
    inputs=gr.File(label="อัปโหลดไฟล์รูปภาพ หรือ PDF"),
    outputs=gr.Textbox(label="ข้อความที่สกัดได้", lines=15),
    title="Thai OCR Web App (EasyOCR)",
    description="อัปโหลดไฟล์รูปภาพ หรือไฟล์ PDF เพื่อดึงข้อความภาษาไทยและอังกฤษ",
    theme="default"
)

# สั่งรันแอป
if __name__ == "__main__":
    interface.launch()