suprimedev commited on
Commit
9fe191e
·
verified ·
1 Parent(s): f9ce44d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +100 -48
app.py CHANGED
@@ -1,61 +1,113 @@
1
  import gradio as gr
2
- from pypdf import PdfReader
 
 
 
3
  import os
4
 
5
  def extract_text_from_pdf(pdf_file):
6
  """
7
- این تابع یک فایل PDF را دریافت کرده و متن آن را استخراج می کند.
8
- با توجه به پشتیبانی pypdf از یونیکد، فارسی، انگلیسی و عربی نیز به خوبی پشتیبانی می شوند.
9
-
10
- Args:
11
- pdf_file (dict): شیء فایل آپلود شده توسط Gradio.
12
-
13
- Returns:
14
- tuple: (متن استخراج شده برای نمایش, فایل متنی قابل دانلود)
15
  """
16
  if pdf_file is None:
17
- return "لطفاً یک فایل PDF آپلود کنید.", None
18
-
19
  try:
20
- # pypdf نیاز به مسیر فایل دارد، Gradio فایل را به صورت موقت ذخیره می کند
21
- pdf_path = pdf_file.name
22
- reader = PdfReader(pdf_path)
23
- text_content = ""
24
- for page in reader.pages:
25
- # اطمینان از اینکه extract_text() مقدار None برنمی گرداند
26
- page_text = page.extract_text()
27
- if page_text:
28
- text_content += page_text + "\n" # اضافه کردن خط جدید بین صفحات
29
-
30
- # ایجاد فایل متنی برای دانلود با انکدینگ UTF-8
31
- txt_filename = "extracted_text.txt"
32
- with open(txt_filename, "w", encoding="utf-8") as f:
33
- f.write(text_content)
34
-
35
- # برای نمایش صحیح در Gradio، متن استخراج شده را برمی گردانیم.
36
- # استفاده از Markdown برای نمایش بهتر زبان های راست به چپ
37
- return f"<div dir='rtl'>{gr.Markdown.update(value=text_content)}</div>", txt_filename
38
-
39
- except FileNotFoundError:
40
- return "خطا: فایل PDF پیدا نشد.", None
 
 
 
 
41
  except Exception as e:
42
- # خطای عمومی تر را برای موارد دیگر برمی گردانیم
43
- return f"خطا در پردازش فایل PDF: {str(e)}", None
44
 
45
- # تعریف رابط کاربری Gradio
46
- interface = gr.Interface(
47
- fn=extract_text_from_pdf,
48
- inputs=gr.File(label="فایل PDF را اینجا آپلود کنید (فارسی/عربی/انگلیسی)"),
49
- outputs=[
50
- # استفاده از gr.Markdown برای خروجی متنی
51
- gr.HTML(label="متن استخراج شده"),
52
- gr.File(label="دانلود متن به صورت فایل TXT", file_count="single", interactive=False)
53
- ],
54
- title="استخراج متن چندزبانه (فارسی/عربی/انگلیسی) از PDF",
55
- description="یک فایل PDF را برای استخراج متن آن آپلود کنید. متن استخراج شده به صورت خوانا نمایش داده شده و قابل دانلود خواهد بود.",
56
- allow_flagging="never" # غیرفعال کردن دکمه flagging
57
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
 
59
- # برای اجرا در سرور
60
  if __name__ == "__main__":
 
61
  interface.launch()
 
1
  import gradio as gr
2
+ import pymupdf
3
+ import arabic_reshaper
4
+ from bidi.algorithm import get_display
5
+ import io
6
  import os
7
 
8
  def extract_text_from_pdf(pdf_file):
9
  """
10
+ استخراج متن از فایل PDF با پشتیبانی از زبان‌های راست به چپ
 
 
 
 
 
 
 
11
  """
12
  if pdf_file is None:
13
+ return "لطفاً یک فایل PDF آپلود کنید."
14
+
15
  try:
16
+ # باز کردن فایل PDF
17
+ pdf_document = pymupdf.open(pdf_file.name)
18
+
19
+ all_text = []
20
+
21
+ # استخراج متن از تمام صفحات
22
+ for page_num in range(len(pdf_document)):
23
+ page = pdf_document[page_num]
24
+ text = page.get_text()
25
+
26
+ # پردازش متن برای نمایش صحیح فارسی/عربی
27
+ # اگر متن حاوی کاراکترهای فارسی یا عربی است
28
+ if any('\u0600' <= char <= '\u06FF' or '\u0750' <= char <= '\u077F' for char in text):
29
+ # تغییر شکل حروف عربی/فارسی
30
+ reshaped_text = arabic_reshaper.reshape(text)
31
+ # تنظیم جهت متن
32
+ bidi_text = get_display(reshaped_text)
33
+ text = bidi_text
34
+
35
+ all_text.append(f"--- صفحه {page_num + 1} ---\n{text}\n")
36
+
37
+ pdf_document.close()
38
+
39
+ return "\n".join(all_text)
40
+
41
  except Exception as e:
42
+ return f"خطا در پردازش فایل: {str(e)}"
 
43
 
44
+ def create_interface():
45
+ """
46
+ ایجاد رابط کاربری Gradio
47
+ """
48
+ with gr.Blocks(theme=gr.themes.Soft()) as interface:
49
+ gr.Markdown(
50
+ """
51
+ # 📄 استخراج متن از PDF
52
+
53
+ این برنامه متن را از فایل‌های PDF استخراج می‌کند و از زبان‌های فارسی، عربی و انگلیسی پشتیبانی می‌کند.
54
+
55
+ ### نحوه استفاده:
56
+ 1. فایل PDF خود را آپلود کنید
57
+ 2. روی دکمه "استخراج متن" کلیک کنید
58
+ 3. متن استخراج شده را مشاهده و کپی کنید
59
+ """
60
+ )
61
+
62
+ with gr.Row():
63
+ with gr.Column(scale=1):
64
+ pdf_input = gr.File(
65
+ label="فایل PDF را آپلود کنید",
66
+ file_types=[".pdf"],
67
+ type="filepath"
68
+ )
69
+ extract_btn = gr.Button(
70
+ "🔍 استخراج متن",
71
+ variant="primary"
72
+ )
73
+
74
+ gr.Markdown(
75
+ """
76
+ ### ویژگی‌ها:
77
+ - ✅ پشتیبانی از زبان فارسی
78
+ - ✅ پشتیبانی از زبان عربی
79
+ - ✅ پشتیبانی از زبان انگلیسی
80
+ - ✅ مصرف کم منابع
81
+ """
82
+ )
83
+
84
+ with gr.Column(scale=2):
85
+ text_output = gr.Textbox(
86
+ label="متن استخراج شده",
87
+ placeholder="متن استخراج شده در اینجا نمایش داده می‌شود...",
88
+ lines=20,
89
+ max_lines=30,
90
+ rtl=True # برای نمایش بهتر متون راست به چپ
91
+ )
92
+
93
+ # اتصال تابع به دکمه
94
+ extract_btn.click(
95
+ fn=extract_text_from_pdf,
96
+ inputs=pdf_input,
97
+ outputs=text_output
98
+ )
99
+
100
+ # مثال
101
+ gr.Examples(
102
+ examples=[],
103
+ inputs=pdf_input,
104
+ outputs=text_output,
105
+ fn=extract_text_from_pdf
106
+ )
107
+
108
+ return interface
109
 
110
+ # اجرای برنامه
111
  if __name__ == "__main__":
112
+ interface = create_interface()
113
  interface.launch()