CoolFace
Apppublic

chmsxp03/chmsxp

sourceHugging Faceupdated 9mo agoView on Hugging Face
0likes
app.py132 linesDownload Raw Back to root
1import gradio as gr
2import fitz  # PyMuPDF
3import pandas as pd
4import pytesseract
5from PIL import Image, ImageEnhance
6import io
7import os
8
9# =========================
10# أدوات مساعدة
11# =========================
12
13def enhance_image(image):
14    """تحسين جودة الصور قبل OCR"""
15    image = ImageEnhance.Contrast(image).enhance(2)
16    image = ImageEnhance.Sharpness(image).enhance(2)
17    return image
18
19def extract_pdf_text(file):
20    """استخراج النص من PDF (نصي أو مصور)"""
21    doc = fitz.open(stream=file.read(), filetype="pdf")
22    rows = []
23    book_name = os.path.basename(file.name)
24
25    for i, page in enumerate(doc):
26        text = page.get_text().strip()
27
28        # إذا كانت الصفحة مصورة
29        if len(text) < 20:
30            pix = page.get_pixmap(dpi=300)
31            img = Image.open(io.BytesIO(pix.tobytes()))
32            img = enhance_image(img)
33            text = pytesseract.image_to_string(img, lang="ara+eng")
34
35        rows.append({
36            "Rank": i + 1,
37            "Book": book_name,
38            "Author": "غير محدد",
39            "Page": i + 1,
40            "Snippet": text[:500],
41            "Distance": 0.0
42        })
43
44    return pd.DataFrame(rows)
45
46# =========================
47# المعالجة الرئيسية
48# =========================
49
50DATAFRAME = pd.DataFrame()
51
52def process_book(file):
53    global DATAFRAME
54    if file is None:
55        return gr.DataFrame(), "⚠️ لم يتم رفع ملف"
56
57    if file.name.lower().endswith(".pdf"):
58        DATAFRAME = extract_pdf_text(file)
59        return DATAFRAME, "✅ تمت معالجة الكتاب بنجاح"
60    else:
61        return gr.DataFrame(), "❌ نوع الملف غير مدعوم (PDF فقط حاليًا)"
62
63def search_text(query):
64    global DATAFRAME
65    if DATAFRAME.empty:
66        return DATAFRAME
67
68    if query.strip() == "":
69        return DATAFRAME
70
71    return DATAFRAME[
72        DATAFRAME["Snippet"].str.contains(query, case=False, na=False)
73    ]
74
75# =========================
76# الواجهة
77# =========================
78
79with gr.Blocks(theme=gr.themes.Soft()) as app:
80
81    gr.Markdown("""
82    # 📚 معين الباحث  
83    ### استخراج نصوص الكتب والبحث الدلالي  
84    """)
85
86    with gr.Row():
87        with gr.Column(scale=1):
88            file_input = gr.File(
89                label="📄 ارفع كتابك (PDF)",
90                file_types=[".pdf"]
91            )
92
93            process_btn = gr.Button(
94                "⚙️ معالجة الكتاب",
95                variant="primary"
96            )
97
98            status = gr.Textbox(
99                label="الحالة",
100                interactive=False
101            )
102
103        with gr.Column(scale=2):
104            search_box = gr.Textbox(
105                label="🔍 البحث داخل الكتاب",
106                placeholder="اكتب كلمة أو عبارة..."
107            )
108
109    results = gr.DataFrame(
110        headers=["Rank", "Book", "Author", "Page", "Snippet", "Distance"],
111        wrap=True,
112        interactive=False
113    )
114
115    # =========================
116    # الربط
117    # =========================
118
119    process_btn.click(
120        process_book,
121        inputs=file_input,
122        outputs=[results, status]
123    )
124
125    search_box.change(
126        search_text,
127        inputs=search_box,
128        outputs=results
129    )
130
131app.launch()
132