chmsxp03/chmsxp
0
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 